目录
SSRF简介
SSRF(Server-Side Request Forgery:服务器端请求伪造)
是由攻击者构造形成的由服务端发起请求的一个安全漏洞。
一般情况下,SSRF的攻击是目标网站的内部系统。(因为他是从内部系统访问,所有可以通过它攻击外网无法访问的内部系统,也就是把目标网站当做中间人)
通俗来讲,有两个网站:
A网站,所有人都可以访问的外网网站
B网站,只能内部访问的网站
A网站能访问B网站
所以,作为普通用户,我们可以访问A网站,然后篡改获取资源的来源,请求从B网站获取资源。A网站没有检测我的请求合不合法,以自己A网站的身份去访问B网站,于是我们就有机会攻击B网站。
SSRF漏洞发生场景
只要当前服务器有发送请求的地方都可能存在ssrf,如:
1. 分享功能
在早期
,Web应用的分享功能,会获取目标URL地址网页内容中标签或<meta name=“description”content=“”/>标签中content的文本内容,来为用户提供更好的体验。所以可以查看通过URL地址分享网页内容的地方是否有此漏洞
2. 转码服务
通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览
3. 在线翻译
通过 URL地址翻译对应文本的内容。例如百度翻译
4. 图片加载与下载
通过URL地址加载或下载图片,有的站长为了对图片进行加水印、打码等处理,会将图片下载到服务器上,就出现了SSRF漏洞
还有富文本编辑器中的点击下载图片到本地功能
5. 图片、文章收藏功能
这其实不算一个新的场景,图片收藏功能同4
,文章收藏同1
6. 未公开的api实现以及其他调用URL的功能
利用google 语法加上这些关键字去寻找SSRF漏洞
7. 云服务厂商
一些厂商会远程执行一些命令来判断网站是否存活,如果可以捕获相应的信息,就可以测试是否存在ssrf漏洞
8. 网站采集,网站抓取的地方
一些网站会针对用户输入的url进行信息采集工作
9. 数据库内置功能
比如mongodb的copyDatabase函数
10. 邮件系统
比如接收邮件服务器的地址
12. 从URL关键字中寻找
share
wap
url
link
src
source
target
u
3g
display
sourceURl
imageURL
domain
……
13…………
ssrf 防御
1.禁止私有Ip访问
2.限制远程连接的域名
3.防火墙限制
4.限制请求方式
5.过滤协议使用https
ssrf 绕过
1.利用@
url只解析@后面的域名 ,例如,在url栏里输入
https://www.qq.com@www.baidu.com
浏览器会跳到www.baidu.com界面,在这个过程中,火狐浏览器会提示你有风险
IE浏览器则报错,不能进入
360浏览器、谷歌浏览器则直接跳转到百度界面(所以一个好的浏览器是很重要的)
显然,服务器认为@前面的www.qq.com是账号,所以进入的是www.baidu.com站点
在php里,@是屏蔽错误信息,所以匹配到@前面的www.qq.com符合要求,就不匹配@后面内容。当然也可能是后端的正则表达式没表达正确
不只是@,?
,#
,\
,/
……都能绕过,用法和@差不多
2.利用302重定向
通过dns解析绕过私有地址限制,探测内网
有个很神奇的网站xip.io
当访问这个网站的子域名,例如127.0.0.1.xip.io,它会给你重定向到127.0.0.1
3.更改ip写法
例如:127.0.0.1
利用八进制绕过: http://0177.0.0.1
利用十六进制绕过: http://0x7f.0.0.1
利用十六进制整数格式绕过: http://0x7f000001
利用十进制整数格式绕过: http://2130706433
特殊的IP地址,如果中间两位是0,可以省略掉:
如127.0.0.1还可以写成http://127.1
4.TCP数据流绕过
对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤:
对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。
但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间查,利用这个时间差,可以进行DNS 重绑定攻击。
要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:
(1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
(2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证
(3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
(4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。
5.使用非http协议
http:// 可以用来探测是否存在ssrf
gopher:// 一个分布型的文件搜集获取网络协议,人称万能协议,没有默认端口,在WWW出现之前,Gopher 是Internet上最主要的检索工具,可以利用Gopher攻击Redis、攻击Fastcgi
dict:// 字典服务器协议,查看端口,软件版本信息,操作内网redis服务等
ftp:// 只能探测是否存在ftp,不能进行暴力破解
file:// 本地文件传输协议,可以读取本地文件
ldap:// 轻量目录访问协议
ssh:// 一种加密的网络传输协议,在不安全的网络中为网络服务提供安全的传输环境
telent:// 可以匿名访问及爆破
tftp:// UDP协议 发送UDP数据包
php:// 访问各个输入/输出流(I/O streams)
…………
参考资料
http://www.52bug.cn/hkjs/3100.html
https://www.t00ls.net/articles-41070.html