8.攻防世界 mfw

进入题目页面如下

在about中查看,给出提示信息

提示git源码泄露

这里需要下载githack在python2的环境中运行

在下载的index.php 文件中看到源码,进行代码审计

<?php
// 判断GET请求中是否包含名为 'page' 的参数
if (isset($_GET['page'])) {  
    // 如果存在 'page' 参数,则将其值赋给变量 $page
    $page = $_GET['page'];
} else {    
    // 如果不存在 'page' 参数,则将 $page 设置为 'home'
    $page = "home";
}

// 构造要包含的文件路径,将 'templates/' 与 $page 的值和 '.php' 拼接起来
$file = "templates/" . $page . ".php";

// 使用 assert 函数进行断言,检查 $file 中是否包含 '..'
// strpos 函数用于查找 '..' 在 $file 中第一次出现的位置,如果不存在则返回 false
// 如果包含 '..',则输出 "Detected hacking attempt!" 并终止脚本
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");  

// 使用 assert 函数进行断言,检查 $file 所代表的文件是否存在
// file_exists 函数用于检查文件是否存在,如果不存在则输出 "That file doesn't exist!" 并终止脚本
assert("file_exists('$file')") or die("That file doesn't exist!");
?>
<!DOCTYPE html>
<html>
    <head>
        <!-- 设置字符编码为 UTF-8 -->
        <meta charset="utf-8">
        <!-- 设置浏览器兼容性模式 -->
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <!-- 设置页面在移动设备上的自适应显示 -->
        <meta name="viewport" content="width=device-width, initial-scale=1">
        
        <!-- 设置页面标题 -->
        <title>My PHP Website</title>
        
        <!-- 引入 Twitter Bootstrap 的 CSS 文件 -->
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
    </head>
    <body>
        <!-- 创建一个固定在顶部的导航栏 -->
        <nav class="navbar navbar-inverse navbar-fixed-top">
            <div class="container">
                <!-- 导航栏头部,包含导航栏按钮和品牌名称 -->
                <div class="navbar-header">
                    <!-- 用于在小屏幕设备上显示导航栏菜单的按钮 -->
                    <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
                        <span class="sr-only">Toggle navigation</span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                        <span class="icon-bar"></span>
                    </button>
                    <!-- 导航栏品牌名称 -->
                    <a class="navbar-brand" href="#">Project name</a>
                </div>
                <!-- 导航栏菜单,可在小屏幕设备上折叠 -->
                <div id="navbar" class="collapse navbar-collapse">
                    <ul class="nav navbar-nav">
                        <!-- 首页导航链接,如果当前页面是首页,则添加 'active' 类 -->
                        <li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
                        <!-- 关于页面导航链接,如果当前页面是关于页面,则添加 'active' 类 -->
                        <li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
                        <!-- 联系页面导航链接,如果当前页面是联系页面,则添加 'active' 类 -->
                        <li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
                        <!-- 注释掉的链接,可能指向包含 flag 的页面 -->
                        <!--<li <?php if ($page == "flag") { ?>class="active"<?php } ?>><a href="?page=flag">My secrets</a></li> -->
                    </ul>
                </div>
            </div>
        </nav>
        
        <!-- 页面内容容器,设置顶部边距以避免被导航栏遮挡 -->
        <div class="container" style="margin-top: 50px">
            <!-- 包含之前构造的文件内容 -->
            <?php
                require_once $file;
            ?>
            
        </div>
        
        <!-- 引入 jQuery 库 -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" />
        <!-- 引入 Twitter Bootstrap 的 JavaScript 文件 -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" />
    </body>
</html>

assert 函数的使用风险assert 函数在 PHP 中可以执行任意代码。在代码中,assert 函数的参数是一个字符串,该字符串会被当作 PHP 代码执行。可以控制这个字符串,执行任意代码。

文件包含漏洞:代码通过 require_once $file 来包含文件,而 $file 是由用户输入的 page 参数构造的。尽管代码对 .. 进行了检查,但可以绕过

由于代码中注释掉了指向 flag 页面的链接,推测 flag 可能存储在 templates/flag.php 文件中。可以尝试通过构造合适的 page 参数来包含该文件。

利用代码漏洞执行系统命令并尝试获取 templates 目录下 flag.php 文件内容的恶意请求参数

原代码中存在使用 assert 函数的部分:

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
assert("file_exists('$file')") or die("That file doesn't exist!");

这里的 assert 函数会将传入的字符串当作 PHP 代码来执行。而变量 $file 是由用户通过 GET 请求传入的 page 参数拼接而成的

payload:

?page=').system('cat+./templates/flag.php');//

'此单引号用于闭合之前在 assert 函数内部拼接字符串时可能存在的单引号。在原代码里,assert 函数的参数形如 "strpos('$file', '..') === false",当 $file 被替换为恶意输入时,单引号的存在会导致语法错误,所以先输入一个单引号来闭合前面的单引号,从而使后续代码能够正常执行。

) 用于闭合 strpos 函数调用,(点号)在 PHP 里是字符串连接运算符,其作用是将前后的代码连接起来

system 是 PHP 中的一个函数,它的功能是执行外部系统命令,并把命令执行结果输出。cat+./templates/flag.php 是要执行的系统命令。在 Unix/Linux 系统中,cat 命令用于查看文件内容,./templates/flag.php 表示当前目录下 templates 文件夹里的 flag.php 文件。这里使用 + 来代替空格是因为在 URL 中,空格通常需要进行编码(比如 %20),直接使用 + 也可以达到分隔命令参数的目的

在 PHP 中,// 是单行注释符号。使用它来注释掉原 assert 函数中剩余的代码,防止其干扰恶意代码的执行。例如,原 assert 函数剩余的 === false 部分就会被注释掉,这样恶意代码就能顺利执行。


最终获取 templates 目录下 flag.php 文件的内容

用burp suite抓包,最终得到flag

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值