19、SQL注入之SQLMAP绕过WAF
搜索引擎会对我们的网站进行爬取,因为它的收录就是对我们的网站采取爬虫技术,而且速度很快,也是符合拦截规则的,但是WAF却不会去拦截,因为WAF会去识别你这个是用户访问,还是搜索引擎爬取,所以我们可以通过数据包的伪造,伪造成搜索引擎,对目标的网站进行访问,这个时候waf肯定会放行,因为它觉得这个是搜索引擎的访问,是正常的、官方的一种收录行为,不会是用户的攻击行为。一个是获取IP是不是通过脚本去获取,
sqlmap在测试漏洞的时候,选择了no,它就不会去测试其它的了,我们一般选择yes,为了保证正确性。因为我们也不知道它是否就真的就是那个注入点、数据库类型,或者就是那个注入类型
在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF层等,以便我们更灵活地去构造Payload,从而可以和各种WAF进行对抗,甚至绕过安全防御措施进行漏洞利用
逻辑层
1、逻辑问题
(1)云waf防护,一般我们会尝试通过查找站点的真实IP,从而绕过CDN防护
(2)当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可尝试Bypass
(3)HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPs有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护
(4)特殊符号%00,部分waf遇到%00截断,只能获取到前面的参数,无法获取到后面的有害参数输入,从而导致Bypass。比如: id=1%00and 1=2 union select1,2,column_name from information_schema.columns
2、性能问题
猜想1:在设计WAF系统时,考虑自身性能问题,当数据量达到一定层级,不检测这部分数据。只要不断的填充数据,当数据达到一定数目之后,恶意代码就不会被检测了。
猜想2:不少WAF是C语言写的,而c语言自身没有缓冲区保护机制,因此如果WAF在处理测试向量时超出了其缓冲区长度就会引发bug,从而实现统过。
例子1:
?id=1 and (select 1)=(Select0xA1000)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),
8,9
ps:0xA1000指0xA后面"A"重复1000次,一般来说对应用软件构成缓冲区溢出都需要较大的测试长度,这里1000只做参考也许在有些情况下可能不需要这么长也能溢出。
例子2:
?a0=0&a1=1&…&a100=100&id=1 union select 1,schema_name,3 from INFORMATTON_SCHEMA.schemata
备注:获取请求参数,只获取前100个参数,第101个参数并没有获取到,导致SQL注入绕过。
白名单
方式一:IP白名单
从网络层获取的ip,这种一般伪造不来,如果是获取客户端的IP,这样就可能存在伪造IP绕过的情况。
测试方法:修改http的header来bypass waf
x-forwarded-for
x-remote-IP
x-orginating-IP
x-remote-addr
X-Real-ip
IP白名单在实战中意义不是很大,因为它的条件实在是很多,很难去满足;一个是获取IP是不是通过脚本去获取,如果是的话,可以去伪造IP,通过tcp/udp网络层方式获取的,那是没有办法伪造的
方式二:静态资源
特定的静态资源后缀请求,常见的静态文件(.js .jpg .swf .css等等),类似白名单机制,waf为了检测效率,不去检测这样一些静态文件名后缀的请求
http://10.9.9.201/sql.php?id=1
http://10.9.9.201/sql.php/1.js?id=1
备注:Aspx/php只识别到前面的.aspx/.php 后面基本不识别
有些WAF过滤是基于脚本过滤的参数,是针对脚本去过滤,针对某些其它格式就不会去过滤,比如图片格式、文本格式,因为图片格式、文本格式一般不会带参数,或者说图片格式、文本格式造成不了危害,只有脚本里面有代码,文本和图片的代码是没有什么作用的
http://10.9.9.201/sql.php/x.txt?id=1
我们这样去访问之后,网站并不会受到结果上的影响,数据还能够正常接收;waf认为注入的参数是建立在x.txt文件上面的,所以waf有可能放心这个注入,x.txt是一个很正常的文本文件,即使传参数,也不会造成很大的影响。但是网站这样子访问,参数并不是给了x.txt,而是给了.php
以前老版本的WAF可以通过这个方式直接绕过,但是现在不行了,但是我们还是要对这个东西进行了解
方式三:url白名单
正常文件涉及到敏感的操作,那我们在访问正常文件的时候,就会被拦截了,这个时候为了让正常的拦截去访问的话,它会对这个文件进行白名单设置
为了防止误拦,部分waf内置默认的白名单列表,如admin/manager/system等管理后台。只要url中存在白名单的字符串,就作为白名单不进行检测。常见的url构造姿势:
http://10.9.9.201/sql.php/admin.php?id=1
http://10.9.9.201/sgl.php?a=/manager/&b=…/etc/passwd
http://10.9.9.201/…/…/…/manager/…/sql.asp?id=2
waf通过/manage/进行比较,只要uri中存在/manage/就作为白名单不进行检测,这样我们可以通过/sql.php?a=/manage/&b=…/etc/passwd 绕过防御规则。
可以结合静态资源展开攻击,有的waf是不行的,但是我们还是要去学一下
方式四: 爬虫白名单
部分waf有提供爬虫白名单的功能,识别爬虫的技术一般有两种:
1、根据UserAgent 2、通过行为来判断
UserAgent可以很容易欺骗,我们可以伪装成爬虫尝试绕过。
User Agent Switcher (Firefox 附加组件),下载地址:https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/
这个方式不是讲注入绕过,他是讲扫描绕过,这个方式我们经常用到
我们在服务器上创建自己网站之后,那么百度、google、搜狗等搜索引擎会对我们的网站页面进行收录,在搜索相关资料的时候会请求到我们的网站上来。
爬虫白名单就是伪造搜索引擎,当我们对网站部署waf之后,我们会发现我们对网站访问速度过快、请求过多的话,会拦截
搜索引擎会对我们的网站进行爬取,因为它的收录就是对我们的网站采取爬虫技术,而且速度很快,也是符合拦截规则的,但是WAF却不会去拦截,因为WAF会去识别你这个是用户访问,还是搜索引擎爬取,所以我们可以通过数据包的伪造,伪造成搜索引擎,对目标的网站进行访问,这个时候waf肯定会放行,因为它觉得这个是搜索引擎的访问,是正常的、官方的一种收录行为,不会是用户的攻击行为
我们对网站的后台进行目录爆破,我们发现爆出了很多结果,但是我们去验证的时候,发现这些东西压根都不存在,全部是误报
这里有两类问题,一个是请求速度过快,触发了规则;一个是扫描结果是个错误
伪造成官方搜索引擎的爬虫,去对网站进行扫描,就不会触发它的规则,因为它是白名单
dirsearch 爆破后台目录的数据包的UA可以使用搜索引擎爬虫的UA
我们学习的是绕过WAF的方法,不是学习某个工具,方法最重要
/*!50001 select * from test */
这里的50001表示,假如数据库是5.00.01以上版本,该语句才会被推行,反之就不行
50001会干扰WAF的识别,但是在数据库当中会被正常执行,这种绕过方式只针对mysql
%20union%20a11%23%0a%20select%201,2,3%23
写与不写all都会执行,不会影响任何结果,但是all能够绕过匹配规则里面的union select的一个结合, 因为中间有个all
总之来说,绕过WAF的匹配就是防止他们匹配到,我们要学FUZZ的话,就需要去学写脚本
我们在实际的工作当中,不可能全部用到手工注入,肯定是要借助检测工具
sqlmap自带绕过WAF的脚本,但是这些脚本肯定是不能够绕过常见WAF的,是用来绕过CTF比赛的,因为是比赛,所以WAF不会写的很死,肯定是存在问题的,就可以用这些脚本来绕过。
因为用自带的脚本绕不了,我们只能自己去编写,可以在sqlmap脚本的基础上去改,把注释删掉便于查看。
只要在if payload这个地方换就可以了,把符合WAF匹配规则的给替换掉,例如
if payload:
payload = payload.replace("union","%23a%oaunion")
payload = payload.replace("select","/*!44575select*/")
payload = payload.replace("%20","%23a%0a")
payload = payload.replace(" ",%23a%0a")
payload = payload.replace( "database()","database%23a%0a()")
return payload
我们所有的步骤都做对了,但是我们就是被拦截了,这个时候我们可以通过代理,把完整的数据包抓到BP上面去看一下,看一下数据包里面是不是有问题
WAF可以通过数据包的指纹,发现我们使用了sqlmap这个工具在搞事情,所以被拦截了,不是因为我们的绕过脚本没搞好,才被拦截的
当我们在使用工具进行检测的时候,我们首先要解决一个问题,那就是工具会不会被拦截的问题。因为每个作者在写工具的时候,都有一个初衷,他在对网站进行扫描,会有一个数据包体系,这个数据包肯定会有他的特征,比如特定的指纹头,其实就是我们常说的指纹库,通过这个指纹库,我们可以识别出他使用的工具,不同的浏览器对网站进行访问是不一样的,因为他们的内核不同,所以他可以通过这些判断出你是人为的,还是工具扫描的,从而进行拦截
sqlmap的访问量会触发WAF的CC流量拦截,这个时候,就跟我们的注入没有关系了,我们可以采取延迟、代理池,爬虫白名单三种方式绕过
搜索引擎爬虫 http 指纹头——》获取搜索引擎爬虫 http 指纹头——》sqlmap user-agent注入——》更改sqlmap的请求头,用来绕过WAF或者使用–user-agent=""来自定义
随机是模拟用户的访问,我们可以通过–user-agent来模拟搜索引擎的访问
sqlmap只要是一直在跑,那他就是正常的,只要一旦停下来,那就遇到问题了
我们可以通过刷新网站来判断我们是否被封堵
delay延迟,按照我们延迟的时间,隔一段时间,发送一个数据包。正常访问网站的时候,就会速度过快,导致被封堵,隔一秒发一个。
代理池涉及到的东西比较复杂,我们现在也讲不到,代理池就是随机刷IP,我们需要学完python的安全开发,然后再去写一个;或者我们用网上现成的工具和脚本改一下,结合sqlmap去跑一下。
只要涉及到流量检测,基本上就会用到代理池。
我们要去学开发,我们要去学Python,因为python简单容易上手,工具大都是python开发的,我们可以直接拿别人的工具二次开发,也可以直接用Python写二次开发,现在的安全形式,如果你不懂代码那是不行的
中转脚本,本地写个脚本(请求远程地址数据包可以自定义编写),这个脚本去请求远程注入地址,sqlmap去注入本地的脚本地址
<?php
$url='http://xxxx/job_bystjb/yjs_byszjs.asp?id=';
$payload=base64_encode($_GET['x']);
echo $payload;
$urs=$ur1.$payload;
file_get _contents($urls);
echo $urls;
?>
php发送http请求的几种方法
https://blog.csdn.net/qq_34827048/article/details/78892700
绕过waf不是单纯的,除了技术上的,还可能是因为检测工具的原因;出了问题要去抓包看看,不要一直在代码上面找问题;分析是很重要的,那些绕过的方法,网上去找资料,多试几遍,用fuzz就完了。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)