目录
1 绕过1.1 符号绕过方法1.2 关键字绕过方法 2 SQL注入防御措施3 总结参考文献1 绕过
最终目的是让后台执行的语句是我们想要的。
1.1 符号绕过方法
基础情形:字符串常用这些符号闭合起来,如'str'、"str"、('str')、("str")
等多种组合方式,我们想插入语句让SQL去执行,就需要让该语句处于闭合符号之外,这时就涉及到了绕过问题。为了举例简单,以下例子以单引号闭合的字符型注入为例。在之前的练习中,我们常用以下方法来直接注释掉语句后的单引号: 在URL中,使用减减加来将语句后的内容注释掉。如?id=1' --+
在其他注入位置中,使用井号#
或其16进制码%23
来注释。 有时候语句后单引号之后,还有后台执行所需要的语句或参数,如《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执行出错信息。