CTF web题总结--SSRF

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

利用php中file_get_contents()漏洞:


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 '. $url . '">';
        } else {
            echo '. $url . '">' . $url . '';
        }
    } 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 '

Flag is not such easy to get!(:◎)≡

'
; } else { echo '. $filename . '">' . $filename . ''; } } else { echo '

Protocol Not Supported!(:◎)≡

'
; } } 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。

你可能感兴趣的:(网络)