利用某服的WAF(非最新版)搭建了一个上传环境,研究一下如何绕过
0x01 绕过后缀校验
1、黑名单or白名单
首先校验后缀校验方式是黑名单还是白名单
上传.aaa后缀结尾的文件,能够成功上传,说明这里是用黑名单的方式校验的
2、绕过php后缀限制
直接传php的话就会被WAF直接拦截掉
这里尝试了一下比较常用的绕过后缀,比如:php3,php5,php::$DATA,php空格。发现都没法绕过(肯定没法绕过…如果这么简单就绕过了那这WAF也没法卖了)
既然常规的不可以,那来一些不那么常规的
这里对php后缀进行了一次换行,发现也不能绕过。那干脆一点,文件名和后缀每个字符都换行一次
GG思密达
之后还尝试了超长文件名,改包头,破坏boundary边界以及多个Content-Disposition的方法,可惜都没有绕过后缀校验。最后想起来这是个window环境,那么可不可以利用window文件命名的特性来绕过waf呢?
尝试一下上图的这些特殊字符和.字符,最后只有:+字符的形式可以绕过WAF,这是为啥呢????
0x02 绕过内容校验


结合上面的方法虽然成功上传了zz.php,但是访问zz.php后发现传上去的是个空文件,没有写入内容啊。
后来才知道,原来冒号会将文件内容置空,GG了啊,这可怎么搞
如果没有办法写入文件那岂不是传了php也是白传吗,拉闸下班了啊….
这时旁边的大佬提醒了一句说三个大于号可以用来写入文件
部分上传包如下:-----------------------------20902930710241Content-Disposition: form-data; name="file"; filename="aaa.txt<<<"Content-Type: text/plain123333333前提:首先要先上传一个aaa.txt才可以利用<<<向aaa.txt中写入文件
以upload-labs为例:

好了,我们现在写入一下php文件内容
呕吼,这里好像直接被waf拦截掉了,TMD真难啊
好在天无绝人之路,三个不行我用四个,没想到四个也能写笑了都不知道为什么
还是以upload-labs为例:

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

成功写入文件内容了,但是传shell的时候一直被拦截,估计对内容也会严格校验
首先正常的变量他就过不去,然后<?php 标签和某些场景混合时也过不去,成对的括号它也拦截。
举个例子:
怎么办到这里就不会了,试了好多都没有绕过去,后面看了看大佬怎么写的,发现大佬用了一个奇怪的方法
<?=
$a =<<< aa
assasssaasdfsdfsssssadfasdfdsfasdfds
aa;phpinfo();
?>
//这种赋值手法是php的一种特性,用于解决字符串中既有单引号又有双引号这种特殊情况,aa名称没意义,起什么都可以,在某些php版本中,末尾的aa后不能加其他语句,否则会报错。


这里使可以成功执行phpinfo的,既然能执行phpinfo,那么试一下system()

继续写一句话
果不其然被拦截了,尝试加点注释
访问之后一直在转圈圈无法访问(如果php报错的话就会一直页面转圈),本地试了一下,发现eval这句不能在aa;后面,又是语法错误
既然如此,那只能放大招了,那就是fopen大法,也就是通过php脚本文件向服务器写新文件,达到绕过流量层waf检测。
先写个txt试试水,所有字符能放开的最好直接用注释分开
<?=
$a =<<< aa
assasssaasdfsdfsssssadfasdfdsfasdfds
aa;fwrite/*232aa*/(/*232aa*/fopen/*232aa*/("zhl3.txt","w"),/*232aa*/'bbb')/*232aa*/;
?>


成功创建txt并向txt里写入内容了
那既然如此就好办多了,直接传个一句话

可惜,明文传输直接挂,流量还得过。
0x03 绕过流量校验
流量绕过就比较简单了,多次加密即可,这里上传了一个三次base64解密的马

传一个三次加密的冰蝎码

