“ 昨天,两个漏洞找到我,一个XSS,一个XXE,我说你这小漏洞不好用,XXE不服气,他说要和我试试,我说可以。我一说他啪的一下就起来了很快啊!一个OOB,一个Error-B**,我全部防住防出去了,防出去以后自然是常规渗透点到为止,Burp压在它鼻子上没打它,我笑了一下,准备收拳。因为这时间,按常规渗透的点到为止它已经输了,如果这Burp一压,它就直接日穿了,我收工的时间不打了,他突然袭击In-Band来打我脸,我大E了没有闪,来骗!来偷袭!我这个没经验的老实人,这好吗,这不好!这小漏洞不讲规矩,我劝这两个小漏洞以后不要再搞这样的聪明,小聪明啊,渗透要讲规矩,不要搞窝里斗......”
老实人B:“你找哪位?”
“我想找下XXE”:老实人A
老实人B:“X什么E???”
“XXE”:老实人A
老实人B:“什么XE???”
“XXE”:老实人A
老实人B:“XX什么???”
”行,表哥您先凉快吧。“:老实人A
老实人B:“好勒。”
......
五分钟后,两名路人边走边聊:“昨天又挖到一个外部实体注入的漏洞,给提上去了,不知道能不能审核通过。”
老实人B:“年轻人我劝你们不要再搞XXE这种玩小聪明的东西,昨天它啪的一下偷袭我这个老实人,不讲武德,搞窝里斗”
老实人A:“WTF???”
01
—
什么来头?
1.就你叫XXE?
哎,表哥你好,昨天偷袭你还没来得及作自我介绍,我叫XXE,全名是“XML External Entity”,大家一般都不叫我XEE,就像我表弟XSS,全名叫(Cross-site Scripting),所以,表哥下次你叫我XEE就好,莫叫错了。
我的中文名是XML外部实体攻击,是由于人们对非安全的外部实体数据进行处理时引发的一种安全问题。
“表哥,既然我偷袭了你,这样,我交代清楚我的来路,咱两就算平了。”
“嘚,那你说吧。”
2.介绍一下XML
(1)XML是什么?
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。一份XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
“插一嘴:HTML与数据表示相关,而XML更多与数据传输和存储有关 ”
(2)XML语法规则
所有的XML元素都必须有一个关闭标签
XML标签对大小写敏感
XML必须正确嵌套
XML属性值必须加引号" "
实体引用 (在标签属性,以及对应的位置值可能会出现<>符号,但是这些符号在对应的XML中都是有特殊含义的,这时候我们必须使用对应html的实体对应的表示,比如符号对应的实体就是gt)
在XML中,空格会被保留 (案例如:
a空格B
,这时候a和B之间的空格就会被保留)(3)XML实体
我们已经说过,XML是用来定义数据的标记语言,这使得采用不同技术的系统可以通过XML进行通信和交换数据。而XML实体是一种简单的存储单元,好比XML的变量一样,可以对它进行赋值并在XML文档的不同地方对它进行引用。当然,实体的功能并不只是用来存储,它还可以用来从本地文件和远程网络中调用相关数据。比如XML文档中包含system标识符定义的实体(Entity)[见下例],这些定义的实体能够访问本地或者远程的内容。
<?xml version="1.0" encoding="utf-8"?> ]>&entityes;
解释一下:
在解析XML文档的过程中,实体'entityes'的值会被替换为
URI(file://etc/passwd)内容值,也就是passwd文件的内容。关键字'SYSTEM'会指明这是一个外部实体,需要XML解析器去获取其中的外部资源并把它存储到内部实体中去,如果双引号中的内容类似与xml文档的标签,则解析器会报错。
XML中的实体类型包括以下几种:
通用实体(General):可在XML其他地方引用该实体
参数实体(Parameter):必须定义在单独的DTD区域,可以使用一个实体给另一个实体赋值
">
预定义实体(Predefined):是某些特殊符号的一组预定义数值集,使用十六进制表示一些特殊字符,避免解析错误
<
(4)XML文档举例
<?xml version="1.0" encoding="utf-8"?> //xml声明 //DTD(文档类型定义) //定义元素 //定义外部实体test]> &test; login
3.提提DTD这东西
(1)是个啥?
DTD是Document Type Definition的缩写,它定义了一个XML文档的结构以及其元素和属性的规范性,人们通过认同DTD标准来传递数据。
(2)长啥样?
DTD总是定义在根元素定义之上,使得DTD像实体一样可以从外部加载。
]>&subscribe;test
02
—
有什么可豪横的?
1.XXE原理
懂我的人,一般不说我豪横...
XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站、发起dos攻击等危害。xxe漏洞触发的点往往是可以上传xml文件的位置,没有对上传的xml文件进行过滤,导致可上传恶意xml文件。
2.后退,我要开始装AC了
漏洞危害
造成敏感数据泄露
潜在的DDOS攻击
“咋地,兄弟还能来这招?咋整的?
emmmm,下面这个exp就能造成DDOS攻击,它通过创建一项递归的 XML 定义,在内存中生成十亿个"abc"字符串,从而导致 DDoS 攻击。原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。 ”
请看EXP:
<?xml version="1.0"?> ]>&lol9;
任意文件读取:去读取一个文件时不一定都有回显,这时分两种情况讨论Payload。
有回显Payload:
<?xml version="1.0" encoding="uft-8"?>]>&xxe;
以读取PHP文件的Payload为例:
# 需要用到base64编码读取,然后解密得到对应内容<?xml version="1.0" encoding="uft-8"?>]>&xxe;
无回显Payload:
<?xml version="1.0"?>%dtd;%send;]>"> %payload;
无报错需要访问接受数据的服务器中的日志信息,可以看到经过base64编码过的数据,解码后便可以得到数据。这里注意参数实体引用%file;必须放在外部文件里。在内部DTD里,参数实体引用只能和元素同级而不能直接出现在元素声明内部,否则解析器会报错:PEReferences forbidden in internal subset。
命令执行
内网信息探测
攻击内网网站
3.这玩意咋用
(1)判断
burp抓包,修改HTTP请求方法、Content-Type头部字段等,查看返回包的响应,看看应用程序是否解析了发送的内容,一旦解析了,那么有可能XXE攻击漏洞。
(2)攻击方式
带内数据(in-band, Inband):XML解析后的输出会直接显示在屏幕上
基于错误(error-based, Error):只有一堆错误信息
外带数据(out-of-band, OOB):无任何输出响应,必须执行一些外带请求把目标数据提取出来
“插一嘴:OOB XXE Example,即服务器可以解析XML输入但没有任何输出响应,为了测试这种盲注XXE我们可以使用非文件路径的外部实体 ”
4.这玩意咋防
检查所使用的底层XML解析库,默认禁止外部实体的解析,如:
PHP:libxml_disable_entity_loader(true);JAVA:DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();dbf.setExpandEntityReferences(false);Python:from lxml import etreexmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
若是使用第三方应用代码需要及时升级补丁
对用户提交的XML数据进行过滤,如关键词:!ENTITY或者SYSTEM和PUBLIC等。
5.参考
https://www.freebuf.com/articles/network/225780.html
https://www.freebuf.com/company-information/165769.html
没有什么问题是左刺拳解决不了的,如果有,那就来右鞭腿。
THE END.