摘要:数据库名的字段名为。例如表示取出第一条记录开始,取出条记录。第二步引用恶意数据开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。注入攻击输入的参数转为编码进行攻击。
声明:
由于笔者能力有限,难免出现各种错误和漏洞。全文仅作为个人笔记,仅供参考。
笔记内容来源于各类网课、书籍。
本章节内容来源:《Web安全攻防渗透测试实战指南》
SQL注入指的是:Web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并且参数带入数据库执行,攻击者可以通过构造不同SQL语句来实现对数据库的任意操作。
例如后端的PHP代码如下:
$query = "select * from users where id = $_GET["id"]"
由于这里的参数可控,并且带入数据库执行,所有攻击者可以构建SQL语句进行攻击。
例如将id=1 or 1 --+,PHP的查询语句变成:
select * from users where id = 1 or 1 --
就会打印所有users的数据。
SQL注入发生需要两个条件:
参数满足上述条件,攻击者便可以开始测试有无注入漏洞。如果后端对前端传入的参数没有过滤,后端的SQL语句就可能发生注入。
一般的后端SQL语句类型的条件语句(where条件)可分为数字型和字符型(单引号闭合,双引号闭合),常见如下:
where id=1where id="1"where id="1"where id=(1)where id=("1")where id=("1")where id=(("1"))where id=(("1"))where id=((("1")))where id=((("1")))...
如果后端没有过滤参数,我们使用"、"和注释符(--+、#、%23)来判断有无注入点。
先判断是数字型还是字符型(闭合符号)在判断外部有无括号和括号数量。之后构建特殊SQL语句进行注入。
(1). 在MySQL5.0以后,MySQL默认在数据库中存放一个"information_schema"的数据库。
在该库中存储着所有的数据库信息(数据库名,表名,字段名和相关属性)。其中有三个表尤其重要:schemata,tables,columns。
(2) MySQL的查询语句,可以使用条件,也可以不使用条件
(3) Limit的用法
limit格式为Limit m,n,m表示起始位置(从0开始,区别substr从1开始),n表示取几条记录。
例如limit 0,1 表示取出第一条记录开始,取出1条记录。
limit可在SQL注入中用于限制输出的数据数量,在报错注入中,输出的字符有限(受相应的变量控制),我们使用limit控制输出数量,最终全部获取。
(4) 几个函数和系统变量
(5) 注释符
在SQL注入中,可以使用--+,+会被php解释为空格;%23是#的URL编码。
(6) 内联注释
内联注释形式为:/*! code */,其中的代码会被作为SQL语句执行。
在SQL注入中,可用于绕过过滤。
适用条件:
传入参数的值不在范围内:例如user的id从0开始递增,我们取id=-1。
步骤:
测试参数名假定为id。
存在风险的代码举例:
适用条件:
可以使用Boolean注入攻击的显著特征就是:页面根据用户的参数输入,只用两种状态。
一般使用BurpSuite和编写脚本爆破最便捷。
步骤:
测试参数名假定为id。
存在风险的代码举例:
适用条件:
报错注入主要是利用函数报错,将我们需要的信息同时爆处理,但是输出的信息长度受限,需要配合limit进行控制。
存在风险的代码举例:
与布尔盲注类型,但是是由于对用用户的参数输入只有一种显示状态,不存在显示异常情况。
我们需要结合函数sleep和if(expr1,expr2,expr3)进行攻击。
在if中如果,expr1为TRUE,则if返回expr2,否则返回expr3。
例如使用:
if(lenght(database()) >1 ,sleep(5) ,1)
表示如果数据库名长度大于1,查询休眠5秒,反应在页面中就是,请求的返回的时间大于5秒(在F12,网络面板可看到)。
使用如下:
if(substr(database(),1,1) ="s", sleep(5), 1)
判断数据库名第一个字符是否是s,如果是页面返回时间大于5s。
后面的爆破操作以此类推。
使用自定义写的脚本爆破效果较好。
后端获取的参数,使用PDO的方式进行数据查询,但仍将参数拼接到查询语句中,导致PDO没有起到预编译效果,程序任然存在SQL注入漏洞。
例如下面的代码:
使用PDO执行SQL语句,可以执行多条语句,不过这样通常不能直接得到注入结果,因为PDO只会返回第一条SQL语句的执行结果,所以在第二条语句中可以用update更新数据或者使用时间盲注获取数据。
令id = 1"; select if (ord(substr(user(),1,1) ==114,sleep(3),1); %23时,执行语句为:
select * from users where id = "1"; select if (ord(substr(user(),1,1)) =114,sleep(3),1); #
通过后面的时间盲注语句爆出数据。
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
二次注入,可以概括为以下两步:
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
注入点在cookie处。
输入的参数转为base64编码进行攻击。
注入点在X-Forwarded-For处。
例如将and,写成AnD,anD,aNd等形式绕过。
例如将union,写成uniunionon,ununionion等形式。
对参数进行一次或多次的URL编码。
使用内联注释绕过。例如and写成 /*! and*/。
采用正则过滤union,sleep,load_file等关键词。
使用PDO预编译语句,不能将变量直接拼接到PDO语句中,而是使用占位符进行数据库的增加、删除、修改、查询。
文中的风险代码举例来源于《Web安全攻防渗透测试实战指南》第四章。
二次注入介绍来源:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/119747.html
摘要:欢迎来我的个人站点性能优化其他优化浏览器关键渲染路径开启性能优化之旅高性能滚动及页面渲染优化理论写法对压缩率的影响唯快不破应用的个优化步骤进阶鹅厂大神用直出实现网页瞬开缓存网页性能管理详解写给后端程序员的缓存原理介绍年底补课缓存机制优化动 欢迎来我的个人站点 性能优化 其他 优化浏览器关键渲染路径 - 开启性能优化之旅 高性能滚动 scroll 及页面渲染优化 理论 | HTML写法...
摘要:以下为我的真实案例以我真实案例分享,希望给更多决定重新开始的人以鼓励我已经上班很久了,目前在中软做软件测试工程师,月薪,现在回想起来,仍然庆幸我当初的决定。 今天跟大家分享我的故事,或许你也曾像他那样迷茫过。17年软件工程专业专科毕业之后做了3年的销售工作,最后决定还是再次提升专业技能,...
摘要:一个软件测试在职老人帮你详细分析一下。在软件测试行业,前两点可以结合起来说,就是大环境和前景以及人才缺口的问题。软件测试属于互联网技术的一个分支,就是经常被提到的行业。你零基础转行嗷,良心奉劝你不要自学。 一个软件测试在职老人帮你详细分析一下。先不说软件测试领域,你想转行的话,得知道这个行...
阅读 3043·2023-04-26 02:10
阅读 2707·2021-10-12 10:12
阅读 4120·2021-09-27 13:35
阅读 1011·2021-09-10 10:50
阅读 2124·2021-09-10 10:50
阅读 1241·2019-08-30 15:55
阅读 899·2019-08-29 18:37
阅读 3238·2019-08-28 17:51