CTF web题总结--SSRF

本文深入解析了SSRF(Server-Side Request Forgery)漏洞的概念及原理,并通过PHP代码示例展示了如何利用file_get_contents()函数存在的漏洞实施攻击。此外,文章还提供了一种获取内网资源的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内网。(正因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内网)
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤和限制。即SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有发现这个请求是非法的,然后服务器以他的身份来访问其他服务器的资源。

利用php中file_get_contents()漏洞:

<?php
if (isset($_POST['url'])) {
    $url = $_POST['url'];
    if (preg_match('/^http[s]?:\/\/([(\w|\d)+\.]+[\/]?)*/', $url, $matches)) {
        $content = file_get_contents($_POST['url']);
        $filename = str_replace('/', '', $matches[1]);
        $filename = './chuoybinu/' . md5($filename) . $matches[1];
        file_put_contents($filename, $content);
        $image = getimagesize($filename);
        $image_type = $image[2];
        if(in_array($image_type, array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP))) { 
            echo '<img src="' . $url . '">';
        } else {
            echo '<a href="' . $url . '">' . $url . '</a>';
        }
    } else if (preg_match('/^file:\/\/([\/\w\d\.]+)/', $url)) {
        $content = file_get_contents($url);
        readfile($file);
        $filename = './chuoybinu/' . md5(time());
        file_put_contents($filename, $content);
        if (strpos($url, '_')) {
            echo '<p>Flag is not such easy to get!(:◎)≡</p>';
        } else {
            echo '<a href="' . $filename . '">' . $filename . '</a>';
        }
    } else {
        echo '<p>Protocol Not Supported!(:◎)≡</p>';
    }
} else {
?>

审计代码发现开头必须是 http[s]😕/ 或者是 file:// ,可以进行SSRF攻击:

  1. 首先读取index.php:
file:///var/www/index.php
  1. 观察到flag在 flag_chunibyou.php 中,但是index限制读取的文文件不不能包含 _ ,所以只能找其他方法。
  2. 根据提示,数据库文件是可以访问的,从index文件中可以看到数据库结构,因此可以下载ibd文文件:
file://.../ctf/user.ibd
  1. 通过 strings user.idb 可以拿到password,进而拿到flag。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值