【SQL注入17】绕过手法与防御

1 绕过

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

1.1 符号绕过方法

  1. 基础情形:字符串常用这些符号闭合起来,如'str'、"str"、('str')、("str")等多种组合方式,我们想插入语句让SQL去执行,就需要让该语句处于闭合符号之外,这时就涉及到了绕过问题。为了举例简单,以下例子以单引号闭合的字符型注入为例。
  2. 在之前的练习中,我们常用以下方法来直接注释掉语句后的单引号:
    1. 在URL中,使用减减加来将语句后的内容注释掉。如?id=1' --+
    2. 在其他注入位置中,使用井号#或其16进制码%23来注释。
  3. 有时候语句后单引号之后,还有后台执行所需要的语句或参数,如《User-Agent 注入基础及实践》提到的例子,直接注释将导致数据库执行时缺少参数。既然不能注释,那就只能构造语句与单引号闭合了:
    1. 构造一个判断语句来闭合,如?id=1' and 注入语句 and '1'='1
    2. 甚至直接用一个引号,如?id=1' and 注入语句 or '
  4. 有时候,后台会对输入的参数进行过滤,比如将引号、井号等过滤掉,这就会比较麻烦甚至无法注入:
    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. 采用内联注释的方法,如?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为例
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值