XXE漏洞

XML基础

XML:eXtensible Markup Language (可扩展标记语言)。和HTML的差别,XML的标签自定义的。
用途 1. 配置文件 2. 交换数据

XML格式

<?xml version="1.0" encoding="UTF-8"?>
<TranInfo>     ##XML根元素
		<CbtrInf>   ##XML子元素
				<Id>12345</Id>
				<Name>张三</Name>
		</CbtrInf>
		<Dbtrinf>
				<Id>67890</Id>
				<Name>李四</Name>
		</Dbtrinf>
		<Amt>100</Amt>
</TranInfo>

格式的要求:

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

XML格式校验 —— DTD(Document Type Definition)文档类型定义
DTD内容——元素(ELEMENT)

<!DOCTYPE TranInfo[
<!ELEMENT TranInfo(CdtrInf,DbtrInf,Amt)>
<!ELEMENT CbtrInf(Id,Name)>
<!ELEMENT DbtrInf(Id,Name)>
<!ELEMENT Amt>
]>

DTD内容——实体(ENTITY) 相当于全局变量

<?xml version="1.0" encoding="UTF=8"?>
<!DOCTYPE name[
<!ELEMENT name ANY >
<!ENTITY cs “xingjiang”]>

实体使用,
内部实体,下面的代码使用,&cs输出的是 xingjiang

<people>
<name>ding</name>
<area>&cs;</area>
</people>

还有外部实体。

<?xml version="1.0" encoding="UTF=8"?>
<!DOCTYPE name[
<!ENTITY cs SYSTEM “file:///D:/xml/entity,dtd”>
]>

外部实体引用的协议:

协议使用方法
filefile:///ddd/ttt
phpphp://ddd/read=convert.base64-encode/resource=index.php
httphttp//:fsdfa/edf.dtd

完整的XML内容

<!--第一部分 声明-->
<?xml version="1.0" encoding="UTF-8"?>

<!--第二部分 文档类型定义-->
<!DOCTYPE Human[
<!ELEMENT name ANY >
<!ENTITY area SYSTEM “file:///D:/xml/entity,dtd”>
<!--SYSTEM还可以用PUBLIC代替--> 
]>
<Human>     ##XML根元素
		<InFo>   ##XML子元素
				<Id>12345</Id>
				<Name>张三</Name>
				<Area>&area;</Area>
		</InFo>
</Human>

XXE

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

靶场 XXE-lab

我们先看看它参数传输的格式,
在这里插入图片描述重消息头和请求中可以看到的,是XXE格式的。所以我们试一下,直接构造XML声明和DTD部分,引用外部实体去读取文件。用burpsuit的重放攻击。
在这里插入图片描述
定义DTD和外部实体

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE DD [
<!ENTITY dd SYSTEM "file:///C:\Users\17646\Desktop\ddd.txt">]>

读取到了文件。
在这里插入图片描述
还可以用DNSlog来测试
在这里插入图片描述这样它可以访问这个网站,那自然可以访问其他网站,我们搭建一个网站,设置一个接口,来接收访问靶机的数据。

防御:

  • 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数据敏感字符 ’ " ‘’(two apostrophe) “” < > ]]> ]]>> /–> --> <!-- <! <!

  • WAF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值