简介
SSRF即服务端请求伪造,利用漏洞伪造服务端发起请求,从而突破客户端获取不到数据的限制
形成的原因
服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤和限制
场景
当我们向一台服务器发起请求的时候,我们把请求的地址改成了获取与该服务器相连的内网服务器资源的地址,从而可以获取另一台服务器上的数据
解决方案
协议的限制
当请求方法允许其他协议的时候,可能利用file,ftp等协议进行第三方服务利用来获取权限
对URL的协议默认只能允许http和https,当然用户可以根据自己的实际情况再补充一些允许访问的协议
IP限制
- 当IP为内网IP时,默认情况下是不允许访问的,通常将以下四个段设置为内网IP段:
192.168.0.0 ~ 192.168.255.255
10.0.0.0 ~ 10.255.255.255
127.0.0.0 ~ 127.255.255.255
172.16.0.0 ~ 172.31.255.255
如何判断一个IP地址是否属于内网IP段呢?众所周知,IP地址是可以转换成一个整数的,而且IP地址是和整数一一对应的,我们判断一个IP是否在一个IP段里面,只需将Ip段的起始值,目标IP值全部转换为整数,然后比较大小即可。
- 利用这个理论还能解决另外一个问题,假设此时有一个ip:10.0.0.1,它的八进制形式为012.0.0.1,相应的还有它的十六进制,十进制以及省略写法,请求012.0.0.1将相当于请求10.0.0.1,所以仅仅凭借IP字符串是否相同是不能做到有效的过滤的,为了解决这个问题,采用了和上面一样的解决办法,将IP的各个形式转换成一个整数,比较整数是否相等判断是否是同一个IP
在这里我调用了一个第三方的库来实现这个功能。 - 设置白名单和黑名单验证:首先判断该IP是否在黑名单中,不在直接访问;在的话接着判断是否在白名单中,在则允许访问,否则不允许访问
域名限制
不能通过简单的将域名放到白名单黑名单中对比来判断是不是允许访问,我们需要首先将域名解析成ip,因为该域名所绑定的IP可能是一个恶意IP,然后再对IP进行上述的判断
URL跳转
当我们请求的目标返回3xx状态的时候,如果没有禁止跳转的设置,如果跳转的地址是内网地址,将会造成SSRF漏洞
对此有两种解决办法:
- 不允许目标进行跳转
- 每跳转一次就检查新的HOST是否符合上面的验证规范
实现过程:
- 创建一个HttpURLConnection连接对象
- 使用这个对象创建一个URL连接,如果返回的状态码为3xx,说明发生了重定向,再去返回的头信息的location字段中找到要重定向的url
- 接着重复上述过程
网友评论