第一步,先来对waf的规则做一个简单的判断。这里我的习惯是从内容,后缀两个方向进行判断。简单来说,基本分为这几种情况
(2)只判断内容(也比较少,因为一般的waf都会带后缀的判断)
(3)内容后缀同时判断(这种情况比较多,相对于来说会安全一点)
(4)根据文件后缀来判断内容是否需要检测(较多)
(5)根据Content-Type来判断文件内容是否需要检测
暂时只想到这么多,以后碰到了再单独记吧。
(1)传脚本后缀(被拦截,判断了后缀)
(2)传脚本后缀加不免杀代码(被拦截,可能后缀内容同时拦截)
(3)传非脚本名(可自己fuzz一个能过waf的任意后缀,里面加恶意内容,被拦截。也就是说同时会对内容和后缀进行判断)
先来fuzz一波能利用的后缀名,这里可以包括中间件的一些配置文件。希望不大,一点都不出意外,全部被拦截了。
filename=’shell.jspx.jsp’
filename=
shell.jspx.jsp
filename=shell.jspx.jsp’
“filename”=shell.jspx;
(3)重写
filename=shell.jpg;filename=shell.jspx;
filename=shell.jspx;filename=shell.jpg;
(4)大小写变化
FileName=shell.jspx.jsp’
(5)参数污染
FileName=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaashell.jspx.jsp’
FileName =shell.jspx(加空格)
filename====”shell.jspx.jsp1″(加等号)
FileName =shell.jspx(前后加空格,中间也可以加特殊符号fuzz)
(6)文件名字编码(filename一般为后端接收参数,编码了可能识别不到,这个就看情况)
filename=\u0073\u0068\u0065\u006c\u006c\u002e\u006a\u0073\u0070
(7)回车换行(有时候确实挺好用的,任意位置都可以试一下)
1.FileName=shell.jspx.
jsp
2.File
Name=shell.jspx.jsp’
二 name改造
其他的比如奇奇怪怪的正则需要用到的特殊字符都可以在文件名中fuzz一下,看看能否打断waf规则,也就是把我们fuzz后缀的再跑一次,或者再找点其他的正则字母,这里就不重复写了。
(1)Content-Disposition
溢出绕过
Content-Disposition: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa form-data; name=”file”; filename=shell.jpg;filename=shell.jspx;
回车换行绕过(注意不要把固定字段打散了,)
Content-Disposition:
form-data; name=”file”; filename=shell.jpg;filename=shell.jspx;
双写绕过(写两次)
Content-Disposition: form-data; name=”file”; filename=shell.jpg;filename=shell.jspx;
Content-Disposition: form-data; name=”file”; filename=shell.jpg;filename=shell.jspx.jpg;
还有一些参数污染加减空格啥的,和上面filename类似,就不重复写了。
(2)boundary
加减空格或者前面加恶意的参数
boundary =—————————8472011224916008542288311250
&boundary =—————————8472011224916008542288311250
123& boundary =—————————8472011224916008542288311250
多个污染(他是用来分割的,他变了下面的也要变一下)
boundary =—————————8472011224916008542288311251
boundary =—————————8472011224916008542288311252
回车换行污染
分割污染(简单来说就是他自定义了一些分割部分,我们可以把我们的恶意参数提交到其他的分割部分)见下图第一个,视情况而定。其他的常用方式和上面都可以重复的
(3)Content-Type
直接删除
修改类型为application/text或者 image/jpeg等等
回车换行
溢出
参数污染
重复传入Content-Type
大小写变换
设置charset
Content-Type: multipart/form-data;charset=iso-8859-13
列举几个
ibm869
ibm870
ibm871
ibm918
iso-2022-cn
iso-2022-jp
iso-2022-jp-2
iso-2022-kr
iso-8859-1
iso-8859-13
iso-8859-15
还有其他的方式,其实和上面的思路差不多
1.Accept-Encoding 改变编码类型
Accept-Encoding: gzip
Accept-Encoding: compress
Accept-Encoding: deflate
Accept-Encoding: br
Accept-Encoding: identity
Accept-Encoding: *
下面截取的图片是我本次的,就不弄其他的了,长度那一块,主要是说内容方面相关的。
post改为get put等其他的请求方式(这一块主要是针对waf的拦截特性)
对host进行回车,换行
修改host头部
host跟链接
host改为127.0.0.1
删除host
waf的特性大多数是写了很多的规则,基于截取的内容做规则匹配,匹配到了就不放行,未匹配到就认为是安全的放行,所以我们需要做的就是绕过waf对于规则的匹配。大概是这几个方向
(1)基于正则匹配的绕过(也就是参数污染,正则破坏等上面的方法,打乱waf的检测)
(2)基于正则匹配的缺失(类似于修改请求等,让waf根本不去检测这部分的内容)
(3)基于操作系统的特性(类似于后缀名加特殊符号让操作系统进行识别)
我们做一切的前提都是既绕过了waf,也能让后端识别,所以可以乱来,不要太乱。基本也就是污染,多写,绕过,添加删除几个方向。
1.免杀马
这种是万能的,只要能免杀就能如履平地,但是现在的waf规则更新太快了,熬了一夜去弄了个免杀,第二天踩了蜜罐上去就被抓,蓝方产品支持加入规则,一点也不美滋滋,但是这也是一条YYDS的道路
2.分块传输
说实话这玩意儿我从来没有成功过,但是面试问的挺多的,有一次有个面试官还专门跟我提了这个所以我这里列举一下。但是分块参数+参数污染组合利用貌似效果还是不错
3.修改长度字段
和分块参数有点类似,作用是这样,有些时候做参数大数据污染的时候,waf判断数据过长直接丢弃,有些判断长度和内容相差太多也直接丢弃。这时候可以把两者结合起来使用,达到超长数据绕过waf的检测,同时数据送到了后端
4.修改传输编码
和分块传输类似,自己手动去改,burp那个插件工具我是一次都没成功过
5.基于网站系统特性添加字段
比如ASP专属bypass-devcap-charset,添加这些字段去绕过waf的检测(这也是我看到但是没机会实战,记录一下)
6.修改头部+内容结合
修改头部为其他格式,再把内容头加其他格式,例如图片,中间插入恶意代码,类似图片马
7.增加多个boundary
这样子打乱了恶意内容,有点类似分开传输,欺骗waf的检测,逃逸后面的代码。
8.文件名写入文件
windows下利用多个<<<<去写入文件,详情可以看参考链接。
还有一些其他的方法,这一种也是类似于对waf欺骗,过着直接利用免杀硬过waf的。jsp免杀不会,就不献丑免杀了。
1.寻找真实ip
这个方法网上太多了,说下我常用的
(1)利用ssl证书寻找
(2)利用子域名寻找
(3)利用公司其他业务寻找(跑C端看运气,和子域名一样)
(4)利用信息泄露寻找(github,google,目录文件,js代码等)
(5)利用一些云网站或者专门查找cdn的网站,链接在家里电脑上,这电脑没有,就自己去找吧
(6)利用已知工具
(7)搜索引擎(fofa,夸克等,看以前收集的业务)
(8)利用http返回信息
(9)找邮箱弱口令,然后你懂的
(10)找朋友,你懂的。
2.利用子域名去打
有些网站,可能外面做了防护,子域名没加waf,而子域名又在白名单,迂回去锤就行了。
3.利用头部绕过
基本碰不到了,修改host为本地ip,现在已经绝迹了,突然想起来写一下。
4.找设备
找一些vpn一类的设备碰碰运气
其他的就不说了吧,头痛。总结下这个思路
(1)直接寻找waf保护后的目标地址,进行亲身拥抱(绕过waf去打)
(2)寻找waf后目标的子女子孙亲儿子(被waf加白的一些资产)去挑拨离间。
转自:e0m安全屋