SSRF漏洞的原理以及防御方案

最近在看一些安全知识的时候,发现了一个新的漏洞,叫做SSRF,这个漏洞原理其实并不复杂,但是由于是第一次遇到,还是简单记录一下。

什么是SSRF

服务端请求伪造(Server-Side Request Forgery),指的是攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。SSRF攻击通常针对外部网络无法直接访问的内部系统。

原理

SSRF漏洞形成的原因主要是服务器端所提供的接口中包含了所要请求的内容的URL参数,并且未对客户端所传输过来的URL参数进行过滤。

假设某公司的网站部署在A服务器上,为了让用户能够访问到,所以A服务器有自己的I公网P地址(或者经过NAT网关配置,有了自己的公网IP+PORT),同时公司还有一台B服务器,存放着一些重要的数据,这台B服务器部署在在内网,没有公网的IP,所以正常情况下,外网是无法访问的。

而这个时候,A服务器上的网站有的服务需要用到B上的数据,所以会向B发送请求,由于A知道B在哪里,所以A可以访问。

这个时候A就相当于B的一个反向代理了,只不过这个代理只能发出A网站上的指定的几个请求。

如果这个时候,A所能发出的请求没有经过严格的限制,可以随便拼凑参数,那A就相当于为黑客开了一扇大门,可以直通B服务器。

举例

很多web应用都提供了从其他的服务器上获取数据的功能。使用指定的URL,web应用便可以获取图片,下载文件,读取文件内容等。SSRF的实质是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。一般情况下, SSRF攻击的目标是外网无法访问的内部系统,黑客可以利用SSRF漏洞获取内部系统的一些信息(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

SSRF危害

探测内部主机的任意端口

这种情况比较极端,基本不会出现,就是说A会通过请求参数中的ip和端口号去找B,也就是说,B的具体信息是A解析了请求中的IP和Port得出来的

不过这种情况一旦出现,攻击者就可以伪造各种IP和PORT去访问,根据返回结果不同,得到内网中的网络结果和每个服务器的端口开发情况。

利用ssrf获取内网敏感文件信息

在服务器上有一个ssrf.php的页面,该页面的功能是获取URL参数,然后将URL的内容显示到网页页面上。

我们访问该链接:http://127.0.0.1/ssrf.php?url=http://127.0.0.1/test.php ,它会将test.php页面显示

我们可以将URL参数换成内网的地址,则会泄露服务器内网的信息。将URL换成file://的形式,就可以读取本地文件。

防御方式

1、过滤返回的信息,如果web应用是去获取某一种类型的文件。那么在把返回结果展示给用户之前先验证返回的信息是否符合标准。

2、统一错误信息,避免用户可以根据错误信息来判断远程服务器的端口状态。

3、限制请求的端口,比如80,443,8080,8090。

4、禁止不常用的协议,仅仅允许http和https请求。可以防止类似于file:///,gopher://,ftp://等引起的问题

5、使用DNS缓存或者Host白名单的方式。

参考链接:

https://zhuanlan.zhihu.com/p/91819069

https://www.jianshu.com/p/612c010e588e