SSRF漏洞的原理及防御

一、什么是SSRF漏洞

服务端请求伪造(Server-Side Request Forgery),是指服务器使用用户输入的URL进行资源请求时,未对该URL进行安全校验,从而导致请求内容不可控,其危害主要表现为:

  • 可以被黑客利用,将服务器当作代理攻击其它任意的服务器;
  • 对外网、内网和本机的端口进行扫描,枚举出内网服务;
  • 访问内网或者本机上不对外开放的web内容;
  • 攻击内网或者本地有其它漏洞的应用程序;
  • 使用file等协议读取内网的文件,造成信息泄露(支持多种网络协议的API);
  • 执行上传的恶意脚本(支持执行脚本的API);

二、SSRF漏洞的绕过

我们以Java代码为例展示这个漏洞是如何发生的:

@PostMapping(value = "/getOtherSiteContent")
public ModelAndView getOtherSiteContent(HttpServletRequest request, HttpServletResponse response){
  String uri = request.getRequestURI();
  // 未对用户输入的URL做校验就打开连接
  HttpURLConnection connection = (HttpURLConnection)new URL(uri).openConnection();
  // 省略处理逻辑...
}

倘若,黑客传入的URL是localhost:8080,那么就可以逐步扫描本地所有对外开放的端口服务;同样的,黑客也可以猜测一些常见的内网IP地址进行输入,从而扫描内网的一些原本不对外开放的端口服务;这些通过BP工具可以很容易地做到。

假设开发人员已经意识到了如上的问题,采用了注入黑名单和白名单的方法,那么就能解决SSRF漏洞问题吗?不一定。

  • 如果黑客构造的URL是带有@符号的,比如http://[email protected],那么实际访问的是@后面的http://danger.com这个地址;如此,可以绕过白名单校验;
  • 如果目标URL使用了诸如xip.io这样的开源泛域名服务,比如将www.example.xip.io映射为www.danger.com那么黑客构造的URL是http://www.example.xip.io,那么实际访问的地址是www.danger.com的内容;如此可以绕过黑名单;
  • 如果黑客使用十进制来访问某个ip,比如http://10.10.10.10写成了http://168430090,也是可以正常访问的;如此可以绕过黑名单;
  • 现在有很多长短链接转换工具,可以将原来的的URL替换为另外一个URL,从而绕过黑名单;

三、如何防御SSRF漏洞

  • 只允许发起HTTP(S)协议的请求;
  • 限制访问端口;
  • 限制不能访问内网IP;
  • 特殊符号和字符过滤;
  • 设置白名单/黑名单;

四、参考内容

SSRF 漏洞记录

SSRF漏洞

你可能感兴趣的:(SSRF漏洞的原理及防御)