服务器端请求伪造(Server-Side Request Forger ,SSRF)漏洞是近年来比较常 见的一种漏洞。SSRF漏洞本身并不危险,与SQL注入或XSS相比较危害不大,但 近年来有人通过将SSRF结合未授权访问漏洞进行渗透,危害就非常严重了。并
且,因为SSRF漏洞本身危害不大,导致甲方对于这个漏洞不重视,更容易成为渗 透中的突破口。
5.5.1 简介
SSRF是一种攻击者构造恶意数据包,使服务器端向另一个服务器发起请求的 安全漏洞。大多数情况下,SSRF的目标是网站内部的系统。攻击者通过构造恶意 数据包,使服务器向内部系统发送恶意构造的请求,从而达到攻击目的。
1.SSRF常见的用处
SSRF的常见用处如下:
· 向外网、服务器所在内网、本地进行端口扫描,获取服务的banner信息等。
·攻击运行在内网或本地的应用(如Struts2 、SQL 、Redis等)。
·对内网Web应用进行指纹识别,通过访问默认文件实现(如readme等文 件)。
图5-14 SSRF常见应用场景
·利用file协议读取本地文件等。
2.SSRF应用场景
分享页面。一些Web程序应用为了提供更好的用户体验,在分享的功能中通
常会获取目标URL网页内容中的标签文本内容。如若此功能中没有对URL地址进 行过滤及限制处理,则可能存在SSRF漏洞,如图5-14所示。
在线翻译,加载图片、文章。上传头像、加载图片等处理常常会涉及远程加 载的功能,过分信任用户输入,没有做严谨的过滤限制,这也会造成SSRF漏洞, 如图5-15所示。
图5-15 图片加载
3.SSRF的常用绕过技巧
SSRF漏洞常用的绕过技巧如下:
图5-16 短网址
·利用@符号绕过,例如www.baidu.com@127.0.0.1。
·利用短网址绕过,如图5-16所示。
·利用xip.io 127.0.0.1.xip.io绕过,如下所示:
·利用封闭式字母数字(Enclosed alphanumeric )绕过,如下所示:
5.5.2 检测方法
利用SSRF进行内网探测的攻击方式常见于进行内网端口扫描,以及对Redis 服务进行攻击。这里介绍内网扫描的情况。
判断是否存在SSRF ,只需在漏洞URL处输入公网服务器的Web应用地址,然 后在公网服务器上监控访问的数据,发现有存在漏洞的IP访问,便说明存在SSRF 漏洞。
比如https://www.target.com/ueditor/getRemote.jspx?upfile=xxx.xxx.xxx ,此处的 URL参数可控并且经过验证,确实可以通过修改参数中的地址实现访问。以此为 例,编写SSRF的内网探测脚本,具体步骤如下:
1)构造portscan方法,接收两个参数,第一个参数为拼接成SSRF漏洞的地 址,第二个参数作为内网探测地址。
2)通过访问构造的URL ,根据返回值判断端口是否开放:
# -*- coding-utf-8 -*-
import requests
def portscan(url,rurl) :
# 测试端口,可以根据需求添加或更改
ports = [21,22,23,25,80,443,445,873,1080,1099,1090,1521,3306,6379,27017] for port in ports:
try:
url = url + '/ueditor/getRemoteImage .jspx?upfile= ' + rurl +
' :{port} ' .format(port=port)
response = requests .get(url, timeout=6)
except :
超过6秒就认为端口是开放的,因为如果端口不开放, 目标肯定会发一个TCP REST, 连接会立刻中断,说明漏洞存在
print( '[+]{port} is open ' .format(port=port))
if __name__ == '__main__ ' :
# portscan( 'target site ', 'hacker test site ')
portscan('Target : Expect More. Pay Less. ', '192 .168 .23 .1 ')
192.168.23.1代表需要探测的内网地址,运行效果如图5-17所示。
图5-17 运行效果
5.5.3 防御策略
对于SSRF的防御策略,可以从漏洞的成因进行分析。造成SSRF漏洞的主要 原因在于:
·传入服务器需要访问的地址或者需要访问的参数用户可控。
·对于用户传入的参数,服务器端没有做校验限制。
严格控制传入参数的内容,校验参数的合法性,便能有效地防御此漏洞。比 如一个加载远程头像的功能点,就应该限制传入的参数必须为网址,而不是IP , 并且校验网址的后缀是否为图片的地址,否则将不予访问。按照此思路,对于不 同的功能点需求限制传入参数的特定作用范围,如此便能有效地防御此漏洞。