【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 服务发送恶意命令,进行数据篡改或信息窃取。
绕过防火墙
绕过网络防火墙,因为请求是从内部服务器发起的,而不是外部攻击者直接发起。