写点什么

网络安全:一次艰难的 WAF 绕过

发布于: 6 小时前
网络安全:一次艰难的WAF绕过

0x00:前言

做之前没想过有这么难

0x01:后缀绕过

首先看一下 waf 咋工作的,当数据包匹配到 waf 规则后,数据包就会被丢弃掉,就像这样



waf 是拦截后缀的,首先 fuzz 一波换行



失败


多个等于号



失败


单双引号替换



失败去掉引号



失败


溢出 Content-Disposition 字段



失败,而且不清楚是因为服务器性能原因还是规则有这个,当此字段太长的时候(具体多长不清楚),正常上传图片数据包也会被丢弃。


【一>所有资源获取<一】1、200 多本网络安全系列电子书(该有的都有了)2、全套工具包(最全中文版,想用哪个用哪个)3、100 份 src 源码技术文档(项目学习不停,实践得真知)4、网络安全基础入门、Linux、web 安全、攻防方面的视频(2021 最新版)5、网络安全学习路线(告别不入流的学习)6、ctf 夺旗赛解析(题目解析实战操作)



多个 Content-Disposition 字段



失败畸形协议



失败 boundary 前加减空格



失败,而且操作这边服务器会不识别上传,导致正常文件传不上去



删除 Content-Type: image/jpeg



失败溢出文件名



失败,而且这里也有限制,太长也会导致正常上传失效。Accept-Encoding:Accept-Encoding: gzipAccept-Encoding: compressAccept-Encoding: deflateAccept-Encoding: brAccept-Encoding: identityAccept-Encoding: *均失败


分块传输



失败 似乎 waf 拦截的就是 Transfer-Encoding: chunked ,但是去掉 chunked 会请求异常


等等等后面又试了一堆,均失败柳暗花明后面看了一眼服务器 是 windows 的,尝试用 windows 文件命名规范来绕过,


众所周知,win 的文件名是不能包含以下字符的



但是上传的时候我们可以构造,尝试使用斜杠绕过



结果有点出乎意料,最后到服务器的居然是.jpg,正反斜杠都这样


换一个符号,尝试星号,被拦,都试了一遍后,发现只有冒号可以



访问一下看看是否存在 www.php



文件确实传上去了,可是问题又来了,没写入内容...


后来才知道,冒号会将文件内容置空,一时间又没了头绪


姑且后缀名绕过了吧。

0x02:内容绕过

只传个 0kb 和不传不是一样吗,所以还是要把数据写进去,


怎么写呢?起初我是不知道的,旁边的好兄弟说三个左尖括号可以写入文件


类似这样




但是 也被 waf 加入规则了


......


天无绝人之路,三个不行 我用四个


没想到四个也能写 笑了 都不知道为什么




但是问题又来了 文件名咋整,www.php 会被拦截,加个冒号又会将文件置空,似乎陷入了死循环,一顿瞎操作后,发现这样居然写进去了,虽然也不知道为什么,可能是什么奇奇怪怪的正则机制?




既然能写文件了,那我本来以为就简简单单了,没想到噩梦才是刚刚开始


首先我之前整的一堆花里胡哨的马一个都没过去,唯一一个能过去的,之前绕过的马还不能运行(这是个坑,后面会讲),虽然这个马在我本地是可以运行的,可能这就是玄学吧哈哈。




首先正常的变量他就过不去,然后<?php 标签和某些场景混合时也过不去,成对的括号它也拦截,总之就是变态


举个例子:



所以才有了上面那个奇怪的马


内容绕过也是在这个基础上去过去的,本来我准备直接传这个马梭哈,但是传是传上去了,执行不了,会一直等待,但是这个等待又不是被 waf 拦截了,后面才知道,这是因为 php 内容报错了,导致不能正常运行,就会一直卡在那里,


那为什么会报错呢,fuzz 了一波后才发现,这个服务器上必须闭合尖括号,要不然就会直接炸,明明是同样的 php 版本,也不知道为什么会这样,只传递第一个标签没问题,




少个闭合就炸:



但是末尾的两个标签也不能去掉,是用来混淆的,去掉直接 waf 都过不去


场面陷入了胶着,此时将一个完整的马传上去似乎不太现实了,一步一步来吧,先尝试能不能执行命令


之前讲过,规则是不允许成对括号出现的,所以连 phpinfo 都执行不了



真的执行不了吗?


$a =<<< aaassasssasssasssasssasssasssasssasssasssasssassssaa;
复制代码


这种赋值手法是 php 的一种特性,用于解决字符串中既有单引号又有双引号这种特殊情况,aa 名称没意义,起什么都可以,在某些 php 版本中,末尾的 aa 后不能加其他语句,否则会报错。



因为会报错,所以 waf 不会拦截,所以在 aa;后是可以添加 php 代码的



好巧不巧,这服务器可以执行



既然能执行 phpinfo,那 system()肯定也行



传完后又转起来了



这里又一个坑,因为 system 中可以用双引号也可以不用,用双引号的时候一般是类似 ls -l 这种有空格的情况,但是 whoami 这种的是不需要引号的,但是这里访问一直转明显是语法错误,那我加上就是了。




属实是天坑


命令执行没问题了,尝试写一句话,


果不其然被拦截了


尝试加点注释



没问题过去了,访问一下



又转起来了


本地试了一下,发现 eval 这句不能在 aa;后面,又是语法错误


既然如此,那我只能放大招了,那就是 fopen 大法,也就是通过 php 脚本文件向服务器写新文件,达到绕过流量层 waf 检测。


先写个 txt 试试水,所有字符能放开的最好直接用注释分开,



访问一下 www.php



没问题,说明确实执行了我们的代码。



那既然如此就好办多了,直接传个一句话




可惜,明文传输直接挂,流量还得过。

0x03:流量绕过

流量绕过就比较简单了,多次编码即可,这里上传了一个三次 base64 解密的马




但是蚁剑编码器出现了问题,可能是多次编码导致不知道哪里出了问题,直接上传冰蝎(这里需要把冰蝎分两段传,用 fopen 的 a 参数拼接脚本)over



用户头像

我是一名网络安全渗透师 2021.06.18 加入

关注我,后续将会带来更多精选作品,需要资料+wx:mengmengji08

评论

发布
暂无评论
网络安全:一次艰难的WAF绕过