CTF真题 | [HITCON 2017]SSRFme

简介: CTF真题 | [HITCON 2017]SSRFme

文前小谈

最近一直在做知识总结,细心的师傅估计在之前的文章中也看到了,之前一直有一些总结类的文章发到公众号上。

干货 | xss攻击、绕过总结

干货 | ssrf形成原因、各种场景的利用方法总结

干货 | 总结各种骚姿势绕过文件上传

等过段时间空下来了,我在把这种总结类的文章全部放在一个专栏里面,供师傅们翻阅查找。

这篇文章也是最近写的RCE中的一个Perl中open命令执行小点,RCE总结完整版估计需要一段时间才能写完,因为没有找到一些比较完整且比较好的靶场环境,所以要自己一个一个知识点去搭建靶场找真题,有点费时间。


环境

这题环境我是在BUUCTF里面打开的,师傅们有想复现的直接在BUUCTF里面搜[HITCON 2017]SSRFme这个题目就好了。


源码  


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

    代码审计

    首先$_SERVER方式把HTTP_X_FORWARDED_FOR给请求过来,然后通过explode函数分割,在把ip地址截取出来,在用echo函数输出出来,这就是我们第一行看到的IP地址

    640.png

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


    sandbox变量为sandbox/后面拼接一个(orange拼接输出的ip)的MD5值在通过

    @mkdir($sandbox);

    @chdir($sandbox);

    创建sandbox这个目录



    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));


    这里的GET不是我么平常的GET方法传参,这里的GET是Lib for WWW in Perl中的命令 目的是模拟http的GET请求,GET函数底层就是调用了open处理


    首先我们到kali里面去测试一下这个GET有什么作用

    640.png

    这里GET一个根目录,功能类似于ls把它给列出来


    可以读取文件

    640.png

    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));

    那么这句代码的意思就是,把shell_execGET过来的结果保存到escapeshellarg中用get(此处getget请求)接收的参数中,并且这个参数是可以在shell命令里使用的参数。

     

    然后用pathinfo函数分割get过来的filename,最后替换点,截取前面目录,最终用file_put_contents函数把之前$data给写进这个目录里面。知道了代码的流程我们就可以构造我们的参数了。


    构造参数

    首先我们GET根目录且让其放进test目录里

    640.png

    然后我们对其访问,路径是sandbox+拼接的MD5+test

    640.png

    640.png

    根目录下有flagreadflag文件,但是打不开,我们要利用readflag去读取flag,接下来就到我们标题所说的

    Perlopen命令执行(GET)内容了。


    因为GET的底层是使用open函数的,如下


    file.pm84: opendir(D, $path) or132:    open(F, $path) or returnnew

    而这个open函数会导致我们的RCE,最终造成GETRCE

    640.png

    因为GET使用file协议时候会调用perl中的open函数

    640.png

    所以我们这题就需要利用file来进行绕过了。

     

    这里够造了好久也没构造出来,看了下wp,执行命令需要满住如下条件

     

    要执行的命令先前必须要有以命令为文件名的文件存在(这里不是很理解,大佬可以告知一下)

     

    既然要满住这个条件,那我们构造的payload如下



    1、?url=&filename=|/readflag2、?url=file:|/readflag&filename=test

    最终访问拿到flag

    640.png


    目录
    相关文章
    |
    2天前
    |
    存储 人工智能 算法
    第十四届蓝桥杯真题解析
    第十四届蓝桥杯真题解析
    59 0
    |
    7月前
    |
    C++
    西安石油大学期末考试C++真题解析(二)
    西安石油大学期末考试C++真题解析(二)
    43 0
    |
    2天前
    |
    安全 Java PHP
    CTF中的一些做题姿势
    该文主要讨论了版本控制漏洞,提到了 `.git`, `.svn`, `.hg`, `CVS` 和 `.bzr` 等版本控制系统可能导致的源代码泄露。另外,文章指出压缩文件如 `.rar`, `.zip` 等如果备份在Web目录下,可能被攻击者下载。`.DS_Store` 文件和 `.filename.swp` (vim的临时文件)也可能泄漏敏感信息。域名的`txt`记录、`tz.php`探针和`phpinfo()`函数的滥用可暴露服务器详情。文中还探讨了多种绕过过滤的策略,并举例说明了如何利用`PHP`构造payload来执行命令或读取文件,强调了POST请求可能规避某些过滤限制。
    18 0
    |
    2天前
    |
    测试技术
    蓝桥杯真题|02普及-真题
    蓝桥杯真题|02普及-真题
    |
    2天前
    |
    人工智能 算法
    第十三届蓝桥杯真题解析
    第十三届蓝桥杯真题解析
    32 3
    |
    2天前
    |
    测试技术
    蓝桥杯刷题|01普及-真题
    蓝桥杯刷题|01普及-真题
    |
    2天前
    |
    算法 测试技术 编译器
    蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
    蓝桥杯-02-蓝桥杯C/C++组考点与14届真题
    |
    7月前
    |
    存储 C++
    西安石油大学期末考试C++真题解析(一)
    西安石油大学期末考试C++真题解析
    59 0