概述
目录
- 1 绕过
- 1.1 符号绕过方法
- 1.2 关键字绕过方法
- 2 SQL注入防御措施
- 3 总结
- 参考文献
1 绕过
最终目的是让后台执行的语句是我们想要的。
1.1 符号绕过方法
- 基础情形:字符串常用这些符号闭合起来,如
'str'、"str"、('str')、("str")
等多种组合方式,我们想插入语句让SQL去执行,就需要让该语句处于闭合符号之外,这时就涉及到了绕过问题。为了举例简单,以下例子以单引号闭合的字符型注入为例。 - 在之前的练习中,我们常用以下方法来直接注释掉语句后的单引号:
- 在URL中,使用减减加来将语句后的内容注释掉。如
?id=1' --+
- 在其他注入位置中,使用井号
#
或其16进制码%23
来注释。
- 在URL中,使用减减加来将语句后的内容注释掉。如
- 有时候语句后单引号之后,还有后台执行所需要的语句或参数,如《User-Agent 注入基础及实践》提到的例子,直接注释将导致数据库执行时缺少参数。既然不能注释,那就只能构造语句与单引号闭合了:
- 构造一个判断语句来闭合,如
?id=1' and 注入语句 and '1'='1
。 - 甚至直接用一个引号,如
?id=1' and 注入语句 or '
- 构造一个判断语句来闭合,如
- 有时候,后台会对输入的参数进行过滤,比如将引号、井号等过滤掉,这就会比较麻烦甚至无法注入:
- 如若后台数据库编码采用的是GBK,我们尝试宽字符注入,构造%df与转义符构成满足GBK的文字,让被转义的引号等成功逃逸。
- 还有其他方法吗??
1.2 关键字绕过方法
- 当数据后台对参数进行筛查时,可能会将一些敏感词汇命令进行过滤,如and、order等。
- 对于and和or,可以尝试使用运算符代替,如
?id=1 && 1=1
。 - 利用数据库对字母大小写不敏感的特点,采用大小写混编的方式绕过。如
?id=1 And 1=1
。 - 数据库可能过滤一次后将剩余字符拼接再次执行,采用双写的方式进行绕过,如
?id=1 aandnd 1=1
。 - 对关键词进行二次URL编码,比如and一次编码后为%61%6e%64,二次编码后为%25%36%31%25%36%65%25%36%34,则注入参数为
?id=1 %25%36%31%25%36%65%25%36%34 1=1
- 采用内联注释的方法,如
?id=1 /*!and*/ 1=1
。
2 SQL注入防御措施
- 使用预编译语句
使用PDO预编译语句。需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库 的增加、删除、修改、查询 。 - 过滤危险字符
多数CMS都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load file等关键字,如果匹配到 ,则退出程序。 - 严格限制网站访问数据库的权限。
- 避免网站显示SQL执行出错信息。
3 总结
- 理解绕过的精髓;
- 掌握一些常见的字符和关键字的绕过思路与方法;
- 后续应加深编码绕过的研究,理解一个请求从客户端到服务器经历过哪些编码与解码。
- 后续应加深内联注释绕过的研究,理解什么被注释了还能执行。
- 了解常用的防御思路与方法。
参考文献
- 《绕过WAF继续SQL注入常用方法》
- 《预编译语句(Prepared Statements)介绍,以MySQL为例 》
最后
以上就是结实鞋子为你收集整理的【SQL注入17】绕过手法与防御1 绕过2 SQL注入防御措施3 总结参考文献的全部内容,希望文章能够帮你解决【SQL注入17】绕过手法与防御1 绕过2 SQL注入防御措施3 总结参考文献所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复