web漏洞之SSRF

一、概述

SSRF(Server-Side Request Forgery,服务器端请求伪造):一种由攻击者构造形成由服务端发起请求的一个安全漏洞,通俗来将就是我们利用存在SSRF漏洞的服务器来构造我们所需要的请求数据包得到客户端所不能得到的数据。常见的就是当我们不能访问某内网中的一台服务器时,但是这个内网中有一台公网服务器并且它与我们想访问的服务器互通,我们就可以利用这个公网上的服务器来访问内网中的服务器。

 1.1分类

根据SSRF对攻击者的一个相应可以分为两种类型:

1、直接回显(basic):在服务器获取攻击者要求的URL或者请求后,把响应发送回攻击者

2、不显示响应(类似于盲注):在服务器获取攻击者要求的URL或请求后,不会把响应内容发送给攻击者,需要通过抓包或查看服务器日志判断是否存在服务端请求伪造漏洞。

1.2相关危险函数

       SSRF涉及到的危险函数主要是网络访问,支持伪协议的网络读取。以PHP为例,涉及到的函数有 file_get_contents() / fsockopen() / curl_exec() 等

二、产生原理

SSRF漏洞原因主要是由于服务端提供了从其他服务器获取数据的功能,但未对目标地址进行过滤和校验,比如常见的从指定URL地址获取网页文本内容,加载指定地址的文件和图片,下载等

三、产生的位置

       对外发起网络请求的地方都可能存在SSRF漏洞

       1、图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

       2、在线翻译:给网址翻译网页内容

       3、具有社交分享功能:获取超链接的标题等内容进行显示

       4、未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

       5、邮件系统:比如接收邮件服务器地址

       6、转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

       7、编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

四、漏洞验证

对于basic型:可以在输入框中直接输入URL回车,看网页是否会返回我们所需要的内容,比如http://www.xxx.com/a.php?image=(地址)的就可能存在SSRF漏洞

对于blind型:通过服务器日志信息判断,查看日志是否存在对外访问请求

 

五、攻击方法

       1、通过dict协议获取服务器端口运行的服务:kali机器中在终端输入:curl -v ‘dict://127.0.0.1:80’  //此命令是显示HTTP通信的整个过程,包括端口连接和HTTP request头信息

       2、让服务端去访问自己所处内网的一些指纹文件来判断是否存在相应的cms

       3、可以使用file、ftp协议进行请求访问相应的文件,比如file:///etc/passwd

       4、判断内网主机是否存活,通过直接请求可能存在的主机及其端口

       5、DoS攻击,请求大文件,始终保持连接keep-alive always

六、防御方法

1、禁止跳转

2、过滤返回信息,验证远程服务器对请求的响应是比较容易的方法。如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

3、禁用不需要的协议,仅仅允许http和https请求。可以防止类似于file://, gopher://, ftp:// 等引起的问题

4、设置URL白名单或者限制内网IP(使用gethostbyname()判断是否为内网IP)

5、限制请求的端口为http常用的端口,比如 80、443、8080、8090

6、统一错误信息,避免用户可以根据错误信息来判断远端服务器的端口状态

7、对DNS Rebinding,考虑使用DNS缓存或者Host白名单

七、绕过方式

       1、对IP地址进行改写编码,比如192.168.1.1可以转成八进制、十六进制等等

       2、短网址绕过,对网址进行缩短。比如站长之家的短网址生成http://tool.chinaz.com/tools/dwz.aspx

       3、URL跳转绕过,比如http://www.xxxxxx.cn/xxxxx.php?url=http://192.168.0.1/

       4、xip.ip绕过,比如http://xxx.192.168.0.1.xip.io/ 等同于192.168.0.1 (xxx 可以是任意)

       5、利用句号绕过,比如:192.168.1.1可以写成192。168。1。1

       6、@符号绕过,比如http://www.baidu.com@1.1.1.1与http://1.1.1.1请求是相同的

       7、添加端口号绕过,比如: http://www.xxxxxx.cn/xxxxx.php?url=http://192.168.0.1:80

       8、利用IPv6来绕过,有些服务可能没有考虑到IPv6,但是内网服务又支持IPv6,可以用IPv6来进行绕过

八、危害

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

2、攻击运行在内网或本地的应用程序,比如溢出

3、对内网Web应用进行指纹识别,通过访问默认文件实现

4、攻击内外网的Web应用,主要是使用Get参数就可以实现的攻击(比如Struts2漏洞利用,SQL注入等)

5、利用File、ftp协议读取本地文件

posted @ 2020-03-19 10:54  oh卟懂ta  阅读(336)  评论(0编辑  收藏  举报