目录

1 绕过

  • 1.1 符号绕过方法
  • 1.2 关键字绕过方法
  • 2 SQL注入防御措施
  • 3 总结
  • 参考文献

1 绕过

最终目的是让后台执行的语句是我们想要的。

1.1 符号绕过方法

  1. 基础情形:字符串常用这些符号闭合起来,如'str'、"str"、('str')、("str")等多种组合方式,我们想插入语句让SQL去执行,就需要让该语句处于闭合符号之外,这时就涉及到了绕过问题。为了举例简单,以下例子以单引号闭合的字符型注入为例。
  2. 在之前的练习中,我们常用以下方法来直接注释掉语句后的单引号:
  1. 在URL中,使用减减加来将语句后的内容注释掉。如?id=1' --+
  2. 在其他注入位置中,使用井号#或其16进制码%23来注释。
  1. 有时候语句后单引号之后,还有后台执行所需要的语句或参数,如《User-Agent 注入基础及实践》提到的例子,直接注释将导致数据库执行时缺少参数。既然不能注释,那就只能构造语句与单引号闭合了:
  1. 构造一个判断语句来闭合,如?id=1' and 注入语句 and '1'='1。
  2. 甚至直接用一个引号,如?id=1' and 注入语句 or '
  1. 有时候,后台会对输入的参数进行过滤,比如将引号、井号等过滤掉,这就会比较麻烦甚至无法注入:
  1. 如若后台数据库编码采用的是GBK,我们尝试宽字符注入,构造%df与转义符构成满足GBK的文字,让被转义的引号等成功逃逸。
  2. 还有其他方法吗??

1.2 关键字绕过方法

  1. 当数据后台对参数进行筛查时,可能会将一些敏感词汇命令进行过滤,如and、order等。
  2. 对于and和or,可以尝试使用运算符代替,如?id=1 && 1=1。
  3. 利用数据库对字母大小写不敏感的特点,采用大小写混编的方式绕过。如?id=1 And 1=1。
  4. 数据库可能过滤一次后将剩余字符拼接再次执行,采用双写的方式进行绕过,如?id=1 aandnd 1=1。
  5. 对关键词进行二次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
  6. mysql绕过引号 sql注入绕过单引号_sql

  7. 采用内联注释的方法,如?id=1 /*!and*/ 1=1。

2 SQL注入防御措施

  1. 使用预编译语句 使用PDO预编译语句。需要注意的是,不要将变量直接拼接到PDO语句中,而是使用占位符进行数据库 的增加、删除、修改、查询 。
  2. 过滤危险字符 多数CMS都采用过滤危险字符的方式,例如,采用正则表达式匹配union、sleep、load file等关键字,如果匹配到 ,则退出程序。
  3. 严格限制网站访问数据库的权限。
  4. 避免网站显示SQL执行出错信息。

3 总结

  1. 理解绕过的精髓;
  2. 掌握一些常见的字符和关键字的绕过思路与方法;
  3. 后续应加深编码绕过的研究,理解一个请求从客户端到服务器经历过哪些编码与解码。
  4. 后续应加深内联注释绕过的研究,理解什么被注释了还能执行。
  5. 了解常用的防御思路与方法。

参考文献

  1. 《绕过WAF继续SQL注入常用方法》
  2. 《预编译语句(Prepared Statements)介绍,以MySQL为例 》