SSRF安全漏洞以及防御实现

简介

SSRF即服务端请求伪造,利用漏洞伪造服务端发起请求,从而突破客户端获取不到数据的限制

形成的原因

服务端提供了从其他服务器获取数据的功能且没有对目标地址做过滤和限制

场景

当我们向一台服务器发起请求的时候,我们把请求的地址改成了获取与该服务器相连的内网服务器资源的地址,从而可以获取另一台服务器上的数据

解决方案

协议的限制

当请求方法允许其他协议的时候,可能利用file,ftp等协议进行第三方服务利用来获取权限
对URL的协议默认只能允许http和https,当然用户可以根据自己的实际情况再补充一些允许访问的协议

IP限制

  1. 当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值全部转换为整数,然后比较大小即可。

  1. 利用这个理论还能解决另外一个问题,假设此时有一个ip:10.0.0.1,它的八进制形式为012.0.0.1,相应的还有它的十六进制,十进制以及省略写法,请求012.0.0.1将相当于请求10.0.0.1,所以仅仅凭借IP字符串是否相同是不能做到有效的过滤的,为了解决这个问题,采用了和上面一样的解决办法,将IP的各个形式转换成一个整数,比较整数是否相等判断是否是同一个IP
    在这里我调用了一个第三方的库来实现这个功能。
  2. 设置白名单和黑名单验证:首先判断该IP是否在黑名单中,不在直接访问;在的话接着判断是否在白名单中,在则允许访问,否则不允许访问

域名限制

不能通过简单的将域名放到白名单黑名单中对比来判断是不是允许访问,我们需要首先将域名解析成ip,因为该域名所绑定的IP可能是一个恶意IP,然后再对IP进行上述的判断

URL跳转

当我们请求的目标返回3xx状态的时候,如果没有禁止跳转的设置,如果跳转的地址是内网地址,将会造成SSRF漏洞
对此有两种解决办法:

  • 不允许目标进行跳转
  • 每跳转一次就检查新的HOST是否符合上面的验证规范

实现过程:

  • 创建一个HttpURLConnection连接对象
  • 使用这个对象创建一个URL连接,如果返回的状态码为3xx,说明发生了重定向,再去返回的头信息的location字段中找到要重定向的url
  • 接着重复上述过程
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,408评论 18赞 399
  • 0x00原理 一般的请求:客户端发起请求,服务器响应。 另外一种请求:客户端发起请求(向服务端提供一个URL),服...
    0x525c阅读 2,696评论 0赞 1
  • 期中考试成绩出来了,闺女的成绩在我意料之中没考好,离我对她的要求差很多,她自己也觉着很难过,中午吃饭时我一提...
    若尘_27ac阅读 152评论 0赞 0
  • 昔日年少愁思却, 潋滟低眉累丝斜。 须臾春秋几多载, 已教清浅渡寒劫。 半盏风存花色旧, 折枝惊雀入残穴。 莫欺稚...
    男神是浩森吖阅读 402评论 0赞 0
  • 回看QQ相册里的老照片,没有美颜,没有高清像素,但是笑的像个孩子,毕竟那时候我就是个孩子! 长大了,老妈还记得我的...
    李紫涩阅读 1,198评论 0赞 1

友情链接更多精彩内容