一、SSRF是什么?

​ SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。

URI VS URL

​ 在web中每次请求的目标叫一个资源,可以有照片、视频等。

​ URI:在文本中都有一个统一标识符确定,这个标识符称为统一资源标识符,是一组字符串。

​ URL:最常用的uri形式,统一资源定位符,也叫web地址。

URI结构

​ uri就类似一个独一无二的身份标识。

​ 准确的说是某个网络资源的特有标识(用来区别于其他资源的独一无二的标识)
具体什么样的叫做uri呢?我就直接给个java所举的uri的例子:

(First line of HTTP request )HTTP请求的第一行 uri
POST /some/path.html HTTP/1.1 /some/path.html
GET http://foo.bar/a.html HTTP/1.0 /a.html
HEAD /xyz?a=b HTTP/1.1 /xyz

​ 从中可以看到,不同请求返回的uri是不一样的。

URL结构

URL 的完整语法结构如下图所示,总共包含七个部分:

img

  • 模式schema ),相当于 URL 的类型,通常用来表示访问协议,比如 HTTP
  • 用户信息userinfo ),用于访问资源的用户信息,可选;
  • 主机host ),资源所在主机,可选;
  • 端口port ),资源所在主机端口,可选,不填则使用协议的默认端口;
  • 路径path ),资源所在路径,一般为”/“来分层;
  • 查询query ),用于访问资源的参数,比如网页传参,以”?”作为起点标识可选;
  • 片段fragment ),指定资源中的某个片段,比如网页中的锚,不会发到服务端,可选;

二、SSRF漏洞原理

​ SSRF的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。例如,黑客操作服务端从指定URL地址获取网页文本内容,加载指定地址的图片等,利用的是服务端的请求伪造。SSRF利用存在缺陷的Web
应用作为代理攻击远程和本地的服务器。
​ 主要攻击方式如下所示。

  • 对外网、服务器所在内网、本地进行端口扫描,获取一些服务的banner信息。
  • 攻击运行在内网或本地的应用程序。
  • 对内网Web应用进行指纹识别,识别企业内部的资产信息。
  • 攻击内外网的Web应用,主要是使用HTTP GET请求就可以实现的攻击(比如struts2、SQli等)。
  • 利用file协议读取本地文件等。

http://payloads.net/ssrf.php?url=192.168.1.10:3306

http://payloads.net/ssrf.php?url=file:///c:/windows/win.ini

三、可能场景

​ SSRF漏洞一般出现在由调用外部资源的场景中,比如社交服务的分享功能、图片识别服务、网站收集服务、远程资源请求、文件处理服务等

​ 在对存在SSRF漏洞的应用进行测试的时候,可以尝试能否控制、支持常见的协议,如:

​ file:从本地读取文件,比如:file:///etc/passwd

​ dict:字典服务器协议,原本的用途就是用于字典查询。由于他支持自定义内容,所以可以用于端口探测,获取banner,发送一些简单的流量给其他服务,如redis

​ gopher:分布式文档传递服务,一种万金油协议,作用非常大。可实现向特定的ip和端口发送任意内容,包括不可见字符。可以模拟HTTP、redis、mysql等请求。

​ 协议URL:

1
gopher://<host>:<port>/_<url编码的TCP数据>

​ 这个url编码的TCP数据是gohper如此强大的原因,我们可以把任意TCP协议的流量,经url编码后通过gopher这个载体发送出去。这里有一个限制,gopher会一次性将流量全部发送出去,这里就要求它所承载的数据是无状态的单次连接。

​ 对语言有版本要求

img

常见的文件路径如下:

​ /etc/passwd 几乎所有的linux发行版都有这个文件,可以作为是否能读取本地文件的评判标准。同时还保存了系统有哪些用户

​ /etc/apache2/* 这个目录包含了apache2的配置文件,可以了解web目录,开放端口等信息

​ /etc/issue 这个文件一般表示该系统是什么linux发行版

​ /proc 这目录存放着系统运行的状态信息,其中含有以pid命名的文件夹,保存这个进程的信息。还有self软连接指向当前运行的进程

​ /proc/[pid]/cmdline 程序运行的命令行

​ /proc/[pid]/env 程序运行的环境变量

​ /proc/[pid]/fd/* 程序打开的文件

​ /proc/net 系统的网络状态信息