MYSQL-手工SQL注入绕过技巧-实战篇

来源:互联网 发布:白鹤翔java架构师视频 编辑:程序博客网 时间:2024/05/01 21:51
之前遇到一个站点,经检测存在SQL注入,但是有WAF存在,后来知道是绿盟的WEB应用防火墙。
后来在社区看到了一篇关于《sql注入绕过技巧》的文章后(原文:http://zone.wooyun.org/content/16772),回过头来重新进行手工,这次总算干掉了WAF。以下是自己对于本次渗透的一些学习笔记,包含一些绕过waf的技巧。

首先判断注入点
id=161-(select 1) 返回另一篇文章,基本确定存在注入。
然后,尝试通过union查询来获取数据,但是连接老是被重置,而且过于频繁的请求还被封IP。所以确定有waf的存在。接下来就是考虑如何绕过waf进行注入了。

首先要获知返回的列数
 id=161.0ORDER BY%2B9 这样的查询可以绕过waf检测,而一般的 id=161 ORDER BY 9 则不行。

接下来就容易多了,尝试一下获取数据库版本
id=161444.0Union(select-1.0,2,3,4,5,6,7,@@version)
返回正常,但是id=161 and 4>5 union select 1,2,3,4,5,6,7,@@version 则不行。
基于关键字的检测,主要是去掉关键字边界的空格,还有就是使用等效法代替被检测的字符串。比如上例,如果使用version()代替@@version则不行。还有id=161444.0有两个作业,第一让原来的查询返回空,第二这是一个小数,小数后可以直接接关键字,而不用空格。

是不是root呢,这很关键。
尝试了这5个函数或变量都被过滤了:user(), current_user(), current_user, system_user(), session_user() 

好吧,干脆直接查看mysql.user表算了
id=1614444.0Union(select-1.0,password,3,4,5,6,7,`user`FROM(`mysql`.user))



好了,是root,高兴了。
这里关键是反单引号的使用,成功逃过了敏感字符串“mysql.user”的检测。
  这里主要说的是注入,getshell就不说了。后来发现拿下C段的另一台服务器后(假设是A),再通过A的远程桌面访问目标服务器,然后进行注入是不受防火墙限制的。可能是因为防火墙放置在网络边界的外围某节点,而从内部访问的数据并没有经过该节点所致。

接下来在说说我遇到过的另一种sql注入情况
经过最初的手工判断目标站点存在注入,而且同样存在waf。刚开始碰到这种情况我也不知所措,然后一直跟着不放终于找到破解的方法。

当开始我从正面无法突破,于是想到了从非标准入口下手,然后扫描目标服务器开放了哪些端口。发现目标除了开80还开了其他端口还有443,然后尝试访问https:www.example.com 发现和http://www.example.com返回的结果一模一样。

然后想有没有可能waf只过滤了其中一个端口,事实证明运气就是这么好.
https://www.example.com/Article/show/id/477777 Union select 1,2,3,version(),5,6,7,8,9,10,11,12,13



在后来通过尝试也找到了证明突破的方法

 http://www.exmaple.com/Article/show/id/4.0Union(select-0.1,2,USER,password,5,6,7,8,9,10,11,12,13.0FROM mysql%252euser)



又是root,运气好没得说。

在这里并没用使用反单引号来图片waf对字符串“mysql.user”的检测,还是采用了两次URL编码的方式将即:mysql%252euser。
为什么可以这样呢,因为waf只对请求的字符串进行一次URL解码,而后端的web server却进行两次URL解码。所以waf认为没有危险的字符串,就因为这样的的失误造成了危害。


0 0
原创粉丝点击