当前位置: 首页 > article >正文

【BUUCTF】[HITCON 2017]SSRFme1

打开题目页面直接给了PHP源码

进行代码审计

<?php
// 这里的 192.168.122.15 可能是一个误写或者调试遗留的内容,它不属于有效的 PHP 代码部分
// 以下开始是正常的 PHP 代码

    // 检查是否存在 HTTP_X_FORWARDED_FOR 头信息
    // HTTP_X_FORWARDED_FOR 头通常用于代理服务器传递客户端的真实 IP 地址
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        // 如果存在 HTTP_X_FORWARDED_FOR 头,将其按逗号分隔成数组
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        // 取数组的第一个元素作为客户端的 IP 地址,并更新 REMOTE_ADDR
        // REMOTE_ADDR 通常保存客户端的 IP 地址
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }

    // 输出客户端的 IP 地址
    echo $_SERVER["REMOTE_ADDR"];

    // 构建沙箱目录名
    // 使用 md5 函数对字符串 "orange" 和客户端 IP 地址拼接后的结果进行哈希处理
    // 拼接上 "sandbox/" 作为沙箱目录的完整路径
    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);

    // 尝试创建沙箱目录
    // @ 符号用于抑制可能出现的错误信息
    @mkdir($sandbox);

    // 尝试切换当前工作目录到沙箱目录
    // @ 符号用于抑制可能出现的错误信息
    @chdir($sandbox);

    // 执行系统命令
    // 从 GET 请求中获取 url 参数,使用 escapeshellarg 函数对其进行转义处理
    // 然后执行 GET 请求的系统命令,将结果存储在 $data 变量中
    // 注意:这里的 "GET" 命令可能并不是标准系统命令,可能是自定义脚本或者环境中的命令
    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));

    // 获取文件名的相关信息
    // 使用 pathinfo 函数解析从 GET 请求中获取的 filename 参数
    // 返回一个包含文件名各部分信息的关联数组
    $info = pathinfo($_GET["filename"]);

    // 处理目录名
    // 从 $info 数组中获取目录名部分,使用 basename 函数获取基础名称
    // 再使用 str_replace 函数将其中的点号替换为空字符串
    $dir  = str_replace(".", "", basename($info["dirname"]));

    // 尝试创建目录
    // @ 符号用于抑制可能出现的错误信息
    @mkdir($dir);

    // 尝试切换当前工作目录到新创建的目录
    // @ 符号用于抑制可能出现的错误信息
    @chdir($dir);

    // 将命令执行结果写入文件
    // 从 $info 数组中获取基础文件名,使用 basename 函数确保是基础文件名
    // 将之前命令执行结果 $data 写入该文件
    // @ 符号用于抑制可能出现的错误信息
    @file_put_contents(basename($info["basename"]), $data);

    // 高亮显示当前 PHP 文件的源代码
    highlight_file(__FILE__);

这段 PHP 代码尝试获取客户端的真实 IP 地址。

根据客户端 IP 地址创建一个沙箱目录。执行一个 GET 命令,获取指定 url 的数据。

根据用户提供的文件名创建相应的目录和文件,并将 GET 命令的结果写入该文件。最后高亮显示当前 PHP 文件的源代码。

着重看这里,提示md5加密,可以使用下面这个工具

MD5在线加密/解密/破解—MD5在线

构造URL

/sandbox/md5加密后的内容/ez

创建一个目录

再通过sandbox沙盒目录访问

得到根目录 

存在flag但不能点击

再次访问

最终得到flag

SSRF知识点

SSRF(Server-Side Request Forgery),即服务器端请求伪造,是一种网络安全漏洞。

SSRF 是一种攻击方式,攻击者能够诱使服务器端应用程序向攻击者选择的目标发起请求。由于服务器通常具有更高的权限和更广泛的网络访问权限,因此可以绕过网络访问控制,访问内部系统或其他受保护的资源。

攻击原理

当应用程序需要从用户输入中获取 URL 并发起请求时,攻击者可以通过构造恶意的 URL 来发起 SSRF 攻击。例如,一个应用程序需要从用户输入的 URL 中读取数据,攻击者可以将这个 URL 指向内部网络地址或其他受保护的资源。

常见的触发点

文件上传功能:当应用程序对上传的文件进行处理,如解析文件中的 URL 并发起请求时。URL 重定向功能:如果应用程序将用户提供的 URL 进行重定向,可能会被利用。              第三方服务集成:例如,使用用户提供的 URL 调用外部 API 或从其他服务获取数据。

信息泄露

攻击者可以访问内部系统的敏感信息,如数据库、文件服务器等。例如,利用 SSRF 访问内部的 http://localhost:8080 可能会获取到内部服务器上运行的服务信息。

服务端请求攻击

可以对内部网络的其他服务发起攻击,例如对内部的 Redis 服务发送恶意命令,进行数据篡改或信息窃取。

绕过防火墙

绕过网络防火墙,因为请求是从内部服务器发起的,而不是外部攻击者直接发起。


http://www.kler.cn/a/516447.html

相关文章:

  • mock可视化生成前端代码
  • 使用HTML5 Canvas 实现呼吸粒子球动画效果的原理
  • 如何理解json和json字符串
  • 系统思考—业务协同
  • Linux 消息队列的使用方法
  • Apache Hive3定位表并更改其位置
  • 总结7。。
  • 指针生成网络(PGN)详细指南(引入)
  • 【橘子Kibana】Kibana的分析能力Analytics简易分析
  • mybatis-plus之使用lombok的@Builder注解之后的坑
  • selenium xpath定位一组元素中的某一个
  • 使用BitaHub部署DeepSeek-R1
  • malloc与new的比较
  • JAVA-快速排序
  • war包 | Docker部署flowable-ui
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(六)-分巧克力、K倍区间
  • 2000-2020年各省第二产业增加值数据
  • uniapp商城项目之创建启动(一)
  • Unity——鼠标是否在某个圆形Image范围内
  • Frida使用指南(三)
  • ThreeJS示例教程200+【目录】
  • 大数据学习(39)- Flink并行度
  • Springboot3 自动装配流程与核心文件:imports文件
  • machine learning knn算法之使用KNN对鸢尾花数据集进行分类
  • AIP-127 HTTP和gRPC转码
  • ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件