浅析服务器端请求伪造SSRF

导读:很多Web应用都提供通过用户指定的地址读取服务器本地或远程文件/数据的功能,如获取图片、下载文件、读取数据等,如果此功能被恶意使用,则可以利用服务器为跳板达成攻击目的,此类漏洞称为服务器端请求伪造。

SSRF简介

SSRF的全称为Server-Side Request Forgery,即服务器端请求伪造,利用此漏洞可从服务器端发起请求,从而突破客户端获取不到数据的限制。

它与常见的CSRFCross-Site Request Forgery)跨站请求伪造有很多相似之处,它们都是通过一些技术手段使被攻击者发出攻击者伪造的请求,从而达到攻击者的目的。它们的不同之处在于,CSRF的攻击对象是客户端,而SSRF的攻击对象是服务器端;CSRF的攻击目的大多是利用用户的Cookies信息伪造用户请求发送至服务器,而SSRF的攻击目的大多是以服务器为跳板绕过ACLAccess Control List,访问控制列表)或其他网络限制从而进行内网渗透,或任意读取服务器端文件等。

简单示例:

如某网站通过类似http://x.x.x?file=test.txturl地址读取指定文件,其中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是一种危害极大的安全漏洞,但目前并没有一种简单的工具可以直接发现并利用,仍然还需要手工查找漏洞点,测试其是否存在漏洞。但由于大部分开发测试人员对此漏洞的了解远不如其他常见漏洞,这就可能导致部分此类漏洞没有被发现或直接被忽略。另外对于防御措施不够严密的系统,还可以通过一些常用绕过措施绕过防御系统,这一部分也是可以继续深入研究的方向。