导读:很多Web应用都提供通过用户指定的地址读取服务器本地或远程文件/数据的功能,如获取图片、下载文件、读取数据等,如果此功能被恶意使用,则可以利用服务器为跳板达成攻击目的,此类漏洞称为服务器端请求伪造。
SSRF简介
SSRF
的全称为Server-Side Request Forgery
,即服务器端请求伪造,利用此漏洞可从服务器端发起请求,从而突破客户端获取不到数据的限制。
它与常见的CSRF
(Cross-Site Request Forgery
)跨站请求伪造有很多相似之处,它们都是通过一些技术手段使被攻击者发出攻击者伪造的请求,从而达到攻击者的目的。它们的不同之处在于,CSRF
的攻击对象是客户端,而SSRF
的攻击对象是服务器端;CSRF
的攻击目的大多是利用用户的Cookies
信息伪造用户请求发送至服务器,而SSRF
的攻击目的大多是以服务器为跳板绕过ACL
(Access Control List
,访问控制列表)或其他网络限制从而进行内网渗透,或任意读取服务器端文件等。
简单示例:
如某网站通过类似http://x.x.x?file=test.txt
的url
地址读取指定文件,其中file
参数为需要读取的文件的地址,可尝试将test.txt
修改为file:///etc/passwd
,如果能正常读取到passwd
文件的内容,那么这个URL
就存在SSRF
漏洞。
SSRF的检测
一般来说,如果服务器读取资源的路径是由用户控制的,并且没有对用户输入进行过滤和限制,那么就很可能存在SSRF
漏洞。此类漏洞可能存在于以下地方:
- 从指定URL地址获取网页文本内容
- 加载/收藏指定地址的图片
- 读取/下载指定地址的文件
- 在线翻译,通过url地址翻译内容
- 分享指定URL信息的功能
在找到可能存在SSRF
漏洞的地址后,还需要进一步确认其是否存在此漏洞。可以通过修改其中服务器读取文件的地址,利用一些常见的协议观察服务器是否能正常获取数据。常见的协议如下:
file://
http(s)://
ftp(s)://
data://
除了以上常用的协议之外,还可以测试多种不常用的协议,如:
dict
,gopher
,imap(s)
,ldap(s)
,pop3(s)
,smb(s)
,smtp(s)
,telnet
,glob
,php://
,phar
等如果是输入参数是文件名或相对路径,那么还可以测试一下相对路径和绝对路径,如
../../../../etc/passwd
和/etc/passwd
等。
SSRF的危害
如果目标存在SSRF
漏洞,那么可以利用此漏洞达到很多渗透目的,常见危害如下:
- 端口扫描。访问某个端口的服务时,未开放的端口和已开放的端口返回的消息是不同的,可以通过服务器返回的信息来判断端口是否开放,从而达到端口扫描的目的。
- 攻击内网web应用。由于服务器与其内网一般处于同一网段,那么可以以服务器为跳板,攻击内网中其他的Web应用。
- 读取本地文件。可以通过file协议或相对路径等方式,访问服务器本地文件,如passwd,/etc/shadow,Web应用的源代码等。
- 攻击本地应用程序或服务。通过结合gopher和dict等协议,可攻击内网多种应用如:redis,discuz,fastcgi,memcache,webdav,struts,jboss,axis2等。
- 主机信息收集。通过访问一些特定的系统文件,可以获得服务器的一些重要信息,如:CPU、内存、磁盘等信息。
- 穿越防火墙或ACL等。一般防火墙会设置白名单或黑名单,但一般服务器都可以正常访问,所以可以通过服务器渗透内网从而攻击其他服务器。
SSRF的防御
根据SSRF的特点和一般的漏洞利用方式,常见的防御方法如下:
过滤返回信息,检查返回信息是否符合标准
统一错误页面,防止用户根据不同的错误获取信息
限制请求端口,防止端口扫描
设置IP地址黑名单或白名单
禁用不使用的协议,防止类似file等协议引起的问题
通过以上措施,基本可以防御SSRF,使其危害降至最低。
总结
SSRF是一种危害极大的安全漏洞,但目前并没有一种简单的工具可以直接发现并利用,仍然还需要手工查找漏洞点,测试其是否存在漏洞。但由于大部分开发测试人员对此漏洞的了解远不如其他常见漏洞,这就可能导致部分此类漏洞没有被发现或直接被忽略。另外对于防御措施不够严密的系统,还可以通过一些常用绕过措施绕过防御系统,这一部分也是可以继续深入研究的方向。