VulnHub-XXE

简介

本以为该靶机是利用XXE获取权限,做的过程中才发现该靶机不已拿权限为目的,该靶机为CTF题,目的在于学习XXE漏洞。
靶机下载地址:https://www.vulnhub.com/entry/xxe-lab-1,254/

信息收集

使用nmap --min-rate 10000 192.168.142.136 --script=vuln -sV扫描目标主机发现开启80和5355端口,80端口中间件为Apache 2.4.27,存在robots.txt文件,如图:
a.png
访问80端口为Apache默认页面,查看robots.txt文件,如图:
b.png
访问/xxe目录为登录页面,如图:
c.png
提交用户名和密码发现提交的数据是xml格式,如图:
d.png
扫描网站目录及文件发现admin.php文件,如图:
e.png

漏洞发现

根据靶机名称及提交的数据格式猜测存在XXE漏洞,直接利用主动扫描发现存在XXE漏洞,如图:
f.png
读取到/etc/passwd文件内容,如图:
g.png

漏洞利用

利用XXE读取admin.php文件,如图:
h.png
Base64解码之后如下:

<?php
   session_start();
?>
<html lang = "en">
   <head>
      <title>admin</title>
      <link href = "css/bootstrap.min.css" rel = "stylesheet">
      <style>
         body {
            padding-top: 40px;
            padding-bottom: 40px;
            background-color: #ADABAB;
         }
         .form-signin {
            max-width: 330px;
            padding: 15px;
            margin: 0 auto;
            color: #017572;
         }
         .form-signin .form-signin-heading,
         .form-signin .checkbox {
            margin-bottom: 10px;
         }
         .form-signin .checkbox {
            font-weight: normal;
         }
         .form-signin .form-control {
            position: relative;
            height: auto;
            -webkit-box-sizing: border-box;
            -moz-box-sizing: border-box;
            box-sizing: border-box;
            padding: 10px;
            font-size: 16px;
         }
         .form-signin .form-control:focus {
            z-index: 2;
         }
         .form-signin input[type="email"] {
            margin-bottom: -1px;
            border-bottom-right-radius: 0;
            border-bottom-left-radius: 0;
            border-color:#017572;
         }
         .form-signin input[type="password"] {
            margin-bottom: 10px;
            border-top-left-radius: 0;
            border-top-right-radius: 0;
            border-color:#017572;
         }
         h2{
            text-align: center;
            color: #017572;
         }
      </style>
   </head>
   <body>
      <h2>Enter Username and Password</h2>
      <div class = "container form-signin">
         <?php
            $msg = '';
            if (isset($_POST['login']) && !empty($_POST['username']) 
               && !empty($_POST['password'])) {
               if ($_POST['username'] == 'administhebest' && 
                  md5($_POST['password']) == 'e6e061838856bf47e1de730719fb2609') {
                  $_SESSION['valid'] = true;
                  $_SESSION['timeout'] = time();
                  $_SESSION['username'] = 'administhebest';
                echo "You have entered valid use name and password <br />";
		$flag = "Here is the <a style='color:FF0000;' href='/flagmeout.php'>Flag</a>";
		echo $flag;
               }else {
                  $msg = 'Maybe Later';
               }
            }
         ?>
      </div> <!-- W00t/W00t -->
      <div class = "container">
         <form class = "form-signin" role = "form"
            action = "<?php echo htmlspecialchars($_SERVER['PHP_SELF']);
            ?>" method = "post">
            <h4 class = "form-signin-heading"><?php echo $msg; ?></h4>
            <input type = "text" class = "form-control"
               name = "username"
               required autofocus></br>
            <input type = "password" class = "form-control"
               name = "password" required>
            <button class = "btn btn-lg btn-primary btn-block" type = "submit"
               name = "login">Login</button>
         </form>
         Click here to clean <a href = "adminlog.php" tite = "Logout">Session.
      </div>
   </body>
</html>

从源码中发现用户名:administhebest,密码MD5值:e6e061838856bf47e1de730719fb2609,解密后为:admin@123
登录之后,如图:
i.png
点击Flag之后跳转到flagmeout.php文件,但显示404,访问xxe/ flagmeout.php后页面空白,查看源码:
j.png
读取flagmeout.php文件如图:
k.png
Base64解码后如下:

<?php
$flag = "<!-- the flag in (JQZFMMCZPE4HKWTNPBUFU6JVO5QUQQJ5) -->";
echo $flag;
?>

读取xxe.php内容,然后Base解码,如下:

<?php
libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$info = simplexml_import_dom($dom);
$name = $info->name;
$password = $info->password;

echo "Sorry, this $name not available!";
?>

由于靶机没有开始ssh服务,因此不考虑读取ssh私钥文件,探测内网端口无果,通过搜索后发现该靶机无法getshell,需要解密flag。
通过Base32解码再Base64解码flagmeout.php文件返回的信息后为:/etc/.flag.php,读取该文件内容,如图:
l.png
在线运行后报错信息中不包含flag,需要自行搭建环境运行。

### 关于 Pikachu-Master 项目中的 XXE 漏洞 #### 解决方案概述 针对 Pikachu-Master 项目中存在的 XML 外部实体 (XXE) 漏洞,主要的防护措施集中在防止恶意输入被解析器处理以及限制外部资源访问。具体来说: - **禁用外部实体扩展**:通过配置应用程序使用的 XML 解析库来阻止其加载来自外部的 DTD 实体声明[^3]。 - **验证并清理用户输入**:确保所有接收自用户的 XML 数据都经过严格的模式校验或白名单过滤机制,从而排除潜在危险字符和结构。 - **采用安全编码实践**:遵循 OWASP 推荐的安全开发指南,在编写涉及文件操作、网络请求等功能模块时特别注意防范注入类风险。 #### 技术实现细节 对于 PHP 应用程序而言,可以通过设置 `libxml_disable_entity_loader(true)` 来关闭默认开启的外部实体加载功能,这一步骤应当尽可能早地执行以覆盖整个应用生命周期内的所有 XML 解析活动[^4]。 另外一种方法是在服务器端对上传的内容进行预处理,移除不必要的 DOCTYPE 声明部分,并替换掉可能引起问题的标准实体引用形式,例如下面这段代码展示了如何利用正则表达式完成这一任务: ```php <?php function sanitize_xml($input){ $pattern = '/<!DOCTYPE.*?>/'; return preg_replace($pattern, '', htmlspecialchars($input)); } ?> ``` 此外,还可以考虑引入专业的第三方组件如 [XMLReader](https://www.php.net/manual/en/book.xmlreader.php),它提供了更细粒度控制的能力用于读取大型 XML 文档而不必一次性将其全部载入内存中;同时配合使用 [DOMDocument::loadHTML()](https://www.php.net/manual/en/domdocument.loadhtml.php) 方法代替原始的 load 函数也能有效规避某些类型的 XXE 攻击向量。 #### 预防建议 为了进一步降低遭受此类攻击的可能性,开发者还应该定期审查依赖项是否存在已知漏洞,并及时更新至最新版本;保持良好的日志记录习惯以便快速响应异常情况的发生;最后也是最重要的一点就是加强团队内部关于 Web 安全意识方面的培训教育工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值