一、初识SSRF漏洞

1.定义

SSRF漏洞(跨站服务器攻击)是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。

就相当于是你可以访问A网站,不可以访问B网站,A和B是都同一个服务器之下,通过服务器伪造命令,利用A网站的权限登录B网站。直接是SSRF漏洞最简单直接的理解,但是实现这个漏洞的过程还是很复杂的,需要用到代码审计也就是语言,这个也不是一定的,因为还是有一些个别的网站不是用JavaScript写的还是要针对不同的语言来找特殊的参数,尤其是在做白盒测试中,代码审计是很重要的。关键要看一些特征参数。

2.产生原理

很多web应用都提供了从其他的服务器上获取数据的功能。使用指定的URL,web应用便可以获取图片,下载文件,读取文件内容等。SSRF的实质是利用存在缺陷的web应用作为代理攻击远程和本地的服务器。一般情况下,

SSRF攻击的目标是外网无法访问的内部系统,黑客可以利用SSRF漏洞获取内部系统的一些信息(正是因为它是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统)。SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制。

3.会导致的危害

从上面的示例代码可以看出,请求是从服务器发出的,那么攻击者可以通过构造恶意的url来访问原本访问不到的内网信息,攻击内网或者本地其他服务。这里根据后续处理逻辑不同,还会分为回显型ssrf和非回显型ssrf,所谓的回显型的ssrf就是会将访问到的信息返回给攻击者,而非回显的ssrf则不会,但是可以通过dns

log或者访问开放/未开放的端口导致的延时来判断。

SSRF的最大的危害在于穿透了网络边界,但具体能做到哪种程度还需要根据业务环境来判断。例如我们在SSRF的利用中,如果需要更深一步扩展,第一反应通常是去攻击可利用的redis或者memcache等内网服务拿shell,但需要注意的是操作redis,memcache的数据包中是需要换行的,而http/https协议一般无法满足我们要求,所以即使内网存在可利用的redis,也并非所有的ssrf都能利用成功的。但是,对于memcache来说,即使只能使用https协议,利用memcache来getshell却并非不可能,本文会详细介绍一种新型的攻击方式。

4.常见产生SSRF的地方

平常在做渗透测试工作的过程中哪些地方容易产生SSRF漏洞,可以看到大部分相关资料都会显示,容易产生SSRF的地方在社交分享、图片加载、邮件系统、数据库等。为什么这些地方会出现呢,社交分享可能会分享到其他网址对吧,如果我们替换其网址为我们的本地地址呢,会出现什么样的情况?同一个地址更换不同的端口又会有什么不同,加载图片请求的服务器可能和你所访问的网站不是同一个服务器,这样是不是能探测内网的同一局域网段的情况呢,邮件系统也是同一道理,这些都是探测SSRF漏洞的手段。

5.常见缺失函数

二、SSRF漏洞利用

1.函数

(1) file_get_contents

这个函数的名称很简单 就是获取文件的参数
file_get_contents() 把整个文件读入一个字符串中。
该函数是用于把文件的内容读入到一个字符串中的首选方法

<?phpecho file_get_contents("test.txt");?>

输出:test.txt文本中所写的内容

(2)fsockopen()

这个函数的意思就是说可以从服务器获取用户的url数据
fsockopen函数实现获取用户制定url的数据(文件或者html)。这个函数会使用socket跟服务器建立tcp连接,传输原始数据。

<?php$fp = fsockopen("191.168.100.100", 80, &$errno, &$errstr, 10);if(!$fp){echo "$errstr ($errno)<br>\n";}else {fputs($fp,"GET / HTTP/1.0\nHost: 191.168.100.100\n\n");while(!feof($fp)) {echo fgets($fp,128);}fclose($fp);} ?>

(3) curl_exec()

执行一个curl会话
下面代码演示来源于菜鸟教程

 <?php// 创建一个cURL资源
$ch = curl_init();
// 设置URL和相应的选项curl_setopt($ch, CURLOPT_URL, "http://www.w3cschool.cc/");curl_setopt($ch, CURLOPT_HEADER, 0);
// 抓取URL并把它传递给浏览器curl_exec($ch);
// 关闭cURL资源,并且释放系统资源curl_close($ch);?>

2.协议

(1)file协议

其实很简单看到file的就是读取文件 格式:file:///文件路径

(2)http协议

HTTP——(hypertext transfer protocol)超文本传输协议

GET——获取资源;
POST——传输资源;
PUT——更新资源;
DELETE——删除资源;
HEAD——获取报文首部;

(3)dict协议

这个协议主要是数组的交互。是一种以键-值对形式存储数据的数据结构,就像电话号码簿中的名字和电话号码一样。这里的键是指你用来查找的东西,值是查找得到的结果

(4)gopher协议

gopher协议是一种信息查0找系统,他将Internet上的文件组织成某种索引,方便用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。利用此协议可以攻击内网的

Redis、Mysql、FastCGI、Ftp等等,也可以发送 GET、POST 请求。这拓宽了 SSRF 的攻击面.

三、绕过

1.绕过方式

(1)检查IP是否为内网IP

很多开发者认为,只要检查一下请求url的host不为内网IP,即可防御SSRF。

通常使用正则过滤以下5个IP段:

192.168.0.0/16
10.0.0.0/8
172.16.0.0/12
127.0.0.0/8
0.0.0.0/8   #在Linux下,127.0.0.1与0.0.0.0都指向本地

这种通常可以用IP地址进制转换绕过

利用八进制IP地址绕过 0177.0.0.1
利用十六进制IP地址绕过 0x7f000001
利用十进制的IP地址绕过 2130706433

(2)Host获取与DNS绕过

检查获取到的Host是否是内网IP防御SSRF

这种防御方法可以用DNS解析绕过

Host可能是IP形式,也可能是域名形式。

如果Host是域名形式,我们是没法直接比对的,只要其解析到内网IP上,就可以绕过。

网上有个神奇域名 http://xip.io (有墙),www.127.0.0.1.xip.io,会自动解析到127.0.0.1

(3)通过各种协议

GOPHER:通过GOPHER我们在一个URL参数中构造Post或者Get请求,从而攻击内网应用,例如Redis服务。

File:用File协议访问本地计算机中的文件,例如file:///etc/password.

(4)利用URL解析器滥用问题

某些情况下,后端程序可能会对访问的URL进行解析,对解析出来的host地址进行过滤。

这时候可能会出现对URL参数解析不当,导致可以绕过过滤

http://www.baidu.com@127.0.0.1

当后端程序通过不正确的正则表达式,对上述URL的内容解析的时候

会认为访问URL的host为www.baidu.com,而实际上请求的是127.0.0.1上的内容

四、修复

修复方案

SSRF的修复比较复杂,需要根据业务实际场景来采取不同的方案,例如前面说到的python中不同url库对url的解析就不一致,所以对于有条件的公司,建立一个代理集群是比较可靠的方案,将类似请求外部url的需求整理出来,分为纯外网集群和内网集群进行代理请求。

如果需要从代码层面来修复的话,需要注意一下几点:

  1. 去除url中的特殊字符

  2. 判断是否属于内网ip

  3. 如果是域名的话,将url中的域名改为ip

  4. 请求的url为3中返回的url

  5. 请求时设置host header为ip

  6. 不跟随30x跳转(跟随跳转需要从1开始重新检测) 其中第一步是为了防止利用url parse的特性造成url解析差异,第三步是为了防止dnsrebinding,第5步是为了防止以ip请求时,某些网站无法访问的问题,第6步是为了防止30x跳转进行绕过。

SSRF漏洞基础讲解相关推荐

  1. 29.CSRF及SSRF漏洞案例讲解

    文章目录 CSRF&SSRF---漏洞案例讲解 1. CSRF---跨站请求伪造攻击 CSRF漏洞解释,原理 导图 原理详解 CSRF漏洞检测,案例,防御 防御方案 2. SSRF(服务器端请 ...

  2. CSRF和SSRF漏洞案例讲解

    CSRF的概念 CSRF:跨站请求伪造(Cross-site request forgery)CSRF是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法.当用户访问含有恶意代码的网 ...

  3. PHP代码审计8—SSRF 漏洞

    文章目录 一.SSRF漏洞基础 1.漏洞原理与防御方法 2.引发函数与漏洞场景 3.常见的利用场景 4.常见的防御绕过方法 二.SSRF-labs分析利用 1.file_get_content() 2 ...

  4. 大一第二学期周报8Web基础之XXS跨站漏洞详解——1XSS漏洞基础详解

    挖到XSS漏洞可以挖到cookie(储存在用户本地终端上的数据),也可找到后台地址. 难点:挖掘中的 闭合 和 绕过 内容大纲 1.XSS漏洞基础讲解: 2.XSS漏洞发掘与绕过: 3.XSS漏洞的综 ...

  5. SSRF服务器端请求伪造漏洞基础

    SSRF服务器端请求伪造漏洞基础,下面分五个专题来说 1.什么是ssrf? 2.ssrf的相关协议 3.有无回显的ssrf漏洞确认 4.ssrf如何利用? 5.ssrf漏洞的绕过 6.ssrf漏洞的加 ...

  6. 【干货】web安全基础学习之SSRF漏洞

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

  7. web渗透漏洞实例讲解视频课程

    课程介绍 XX学院联合知道创宇404 实验室·漏洞社区组共同打造了<漏洞实例讲解>课程.这门课程针对当下流行的 9 类可直接威胁企业安全的高危漏洞进行讲解,通过对15 个经典漏洞的深入剖析 ...

  8. 【漏洞学习——SSRF】腾讯某处SSRF漏洞(非常好的利用点)附利用脚本

    漏洞细节 ## 1. 描述 本文章将概述一些经典的SSRF漏洞利用原理,从Fuzz扫描开放的服务到漏洞的自动化利用,刚好腾讯的这个漏洞点,非常适合做为案例来演示. ### 1.1 漏洞信息 > ...

  9. SSRF漏洞之常见Bypass篇

    SSRF–(Server-side Request Forge, 服务端请求伪造) 定义:由攻击者构造的攻击链接传给服务端执行造成的漏洞,一般用来在外网探测或攻击内网服务 SSRF漏洞思维导图如下,本 ...

最新文章

  1. 北汽蓝谷极狐阿尔法S与T
  2. java bufferedwriter 写入tab_一个Java程序员的成长历程(014,015)天
  3. nagios学习手札
  4. c语言作用域有哪两种变量,2017年计算机二级C语言字考点归纳:变量的存储类别、作用域及生存期...
  5. java 静态资源变量_Java中读取配置文件中的内容,并将其赋值给静态变量的方法...
  6. Zookeeper的典型应用场景(1)
  7. Google调查了人们过去24小时的观看记录,发现了这些......
  8. Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap简单的区别
  9. 机器学习实战(MachineLearinginAction) 第三章 决策树
  10. 从C# 到 Java 点滴
  11. 最少拦截系统,简单dp,(学长说这是贪心?!。。。。。。也是醉了)
  12. 拉取ftp服务器上的文件_无公网IP环境下搭建外部访问FTP文件共享服务器
  13. win10专业版修改家庭计算机,win10家庭版升级专业版的最完美的方法_win10专业版技巧...
  14. 错误: -source 1.6 中不支持 diamond 运算符的解决办法
  15. 【Transformer】李沐论文逐段精读学习笔记
  16. stata最大值最小值命令_用Stata实现数据标准化
  17. Android几种定时任务实现方式汇总
  18. 推荐一个开源库(Calligraphy)将ttf字体库加入到项目中,轻松实现各种字体
  19. 【Pyecharts】Python数据可视化:英雄联盟2020赛季数据全方位解读~
  20. 利用ajax实现织梦dedecms瀑布流无限加载功能

热门文章

  1. 社区+团购:看“团购电影票”怪现象
  2. 骁龙660是32位还是64位_高通骁龙632和660哪个好 骁龙660和632区别对比 (全文)
  3. python计算机二级含金量-计算机二级证书含金量到底有多高?你真的知道吗?
  4. 8个python自动化脚本提高打工人幸福感~比心~
  5. 2022圣诞树(C语言摇钱树版本)
  6. 微信小程序小笔记(未完待整理...)
  7. 邮件合并应用计算机教学,高职计算机应用基础微课设计 邮件合并
  8. Neuroimage | LMDA-Net第一作者亲自讲述其设计思想
  9. 关于ImageMagick出现无效参数(invalid parameter)的解决方法
  10. 指令系统-CISC和RISC的区别