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


    目录
    打赏
    0
    0
    0
    0
    18
    分享
    相关文章
    [网鼎杯 2020 白虎组]PicDown(精讲)
    [网鼎杯 2020 白虎组]PicDown(精讲)
    422 0
    [网鼎杯 2020 白虎组]PicDown(精讲)
    [CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
    [CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
    [CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解
    [网络安全] Dirsearch 工具的安装、使用详细教程
    [网络安全] Dirsearch 工具的安装、使用详细教程
    5587 0
    【漏洞复现】探索 Python 中原型链的利用与污染
    在本文中,我们从实际应用的角度出发,深入探讨原型链的利用方式,并剖析可能导致代码安全漏洞和意外行为的污染情形,同时希望读者深刻了解 Python 中原型链的概念、机制以及潜在的安全风险。
    |
    11月前
    |
    BUU [0CTF 2016]piapiapia
    BUU [0CTF 2016]piapiapia
    158 0
    详解python pickle中的反序列化漏洞
    今天我们来聊聊Python里的反序列化攻击。先来看看什么是序列化和反序列化。简单来说,序列化就是把数据结构转换成字节流,这样我们就可以把数据保存到文件里或者通过网络传输。反序列化则是把这些字节流再转换回原来的数据结构。 在Python里,常用的模块之一就是Pickle。它可以帮我们很方便地进行序列化和反序列化操作。比如,你可以把一个复杂的Python对象序列化保存下来,等需要用的时候再反序列化回来。 反序列化攻击的概述 反序列化过程有漏洞:如果我们反序列化了一个不可信的数据源,那就可能引发反序列化攻击。攻击者可以在序列化的数据里嵌入恶意代码,当你反序列化这个数据时,这些恶意代码就会被执
    AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等

    登录插画

    登录以查看您的控制台资源

    管理云资源
    状态一览
    快捷访问