做之前没想过有这么难
首先看一下 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
文件确实传上去了,可是问题又来了,没写入内容...
后来才知道,冒号会将文件内容置空,一时间又没了头绪
姑且后缀名绕过了吧。
只传个 0kb 和不传不是一样吗,所以还是要把数据写进去,
怎么写呢?起初我是不知道的,旁边的好兄弟说三个左尖括号可以写入文件
类似这样
但是 也被 waf 加入规则了
......
天无绝人之路,三个不行 我用四个
没想到四个也能写 笑了 都不知道为什么
但是问题又来了 文件名咋整,www.php 会被拦截,加个冒号又会将文件置空,似乎陷入了死循环,一顿瞎操作后,发现这样居然写进去了,虽然也不知道为什么,可能是什么奇奇怪怪的正则机制?
既然能写文件了,那我本来以为就简简单单了,没想到噩梦才是刚刚开始
首先我之前整的一堆花里胡哨的马一个都没过去,唯一一个能过去的,之前绕过的马还不能运行(这是个坑,后面会讲),虽然这个马在我本地是可以运行的,可能这就是玄学吧哈哈。
首先正常的变量他就过不去,然后
举个例子:
所以才有了上面那个奇怪的马
内容绕过也是在这个基础上去过去的,本来我准备直接传这个马梭哈,但是传是传上去了,执行不了,会一直等待,但是这个等待又不是被 waf 拦截了,后面才知道,这是因为 php 内容报错了,导致不能正常运行,就会一直卡在那里,
那为什么会报错呢,fuzz 了一波后才发现,这个服务器上必须闭合尖括号,要不然就会直接炸,明明是同样的 php 版本,也不知道为什么会这样,只传递第一个标签没问题,
少个闭合就炸:
但是末尾的两个标签也不能去掉,是用来混淆的,去掉直接 waf 都过不去
场面陷入了胶着,此时将一个完整的马传上去似乎不太现实了,一步一步来吧,先尝试能不能执行命令
之前讲过,规则是不允许成对括号出现的,所以连 phpinfo 都执行不了
真的执行不了吗?
$a =<<< aa
assasssasssasssasssasssasssasssasssasssasssassss
aa;
复制代码
这种赋值手法是 php 的一种特性,用于解决字符串中既有单引号又有双引号这种特殊情况,aa 名称没意义,起什么都可以,在某些 php 版本中,末尾的 aa 后不能加其他语句,否则会报错。
因为会报错,所以 waf 不会拦截,所以在 aa;后是可以添加 php 代码的
好巧不巧,这服务器可以执行
既然能执行 phpinfo,那 system()肯定也行
传完后又转起来了
这里又一个坑,因为 system 中可以用双引号也可以不用,用双引号的时候一般是类似 ls -l 这种有空格的情况,但是 whoami 这种的是不需要引号的,但是这里访问一直转明显是语法错误,那我加上就是了。
属实是天坑
命令执行没问题了,尝试写一句话,
果不其然被拦截了
尝试加点注释
没问题过去了,访问一下
又转起来了
本地试了一下,发现 eval 这句不能在 aa;后面,又是语法错误
既然如此,那我只能放大招了,那就是 fopen 大法,也就是通过 php 脚本文件向服务器写新文件,达到绕过流量层 waf 检测。
先写个 txt 试试水,所有字符能放开的最好直接用注释分开,
访问一下 www.php
没问题,说明确实执行了我们的代码。
那既然如此就好办多了,直接传个一句话
可惜,明文传输直接挂,流量还得过。
流量绕过就比较简单了,多次编码即可,这里上传了一个三次 base64 解密的马
但是蚁剑编码器出现了问题,可能是多次编码导致不知道哪里出了问题,直接上传冰蝎(这里需要把冰蝎分两段传,用 fopen 的 a 参数拼接脚本)over