SSRF漏洞学习

SSRF漏洞原理

SSRF(Server-Side Request Forgery:服务器端请求伪造)

是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简而言之就是以服务器的身份来执行请求。

常见利用方式

伪协议读取文件

伪协议读取文件,在SSRF中常用的伪协议就是file:///协议

/?url=file:///var/www/html/flag.php

内网访问

我们从目标主机内网环境访问其本地的flag.php

/?url=http://127.0.0.1/flag.php

端口扫描

在SSRF中,dict协议与http协议可用来探测内网的主机存活与端口开放情况。

dict协议定义:词典网络协议,在RFC 2009中进行描述。它的目标是超越Webster protocol,并允许客户端在使用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。(摘自百度百科)

可以利用BP的爆破模块,也可以用python写脚本来进行端口爆破扫描

Gopher协议的利用

gopher协议是一种信息查0找系统,他将Internet上的文件组织成某种索引,方便用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。利用此协议可以攻击内网的 Redis、Mysql、FastCGI、Ftp等等,也可以发送 GET、POST 请求。这拓宽了 SSRF 的攻击面

gopher协议的格式:gopher://IP:port/_TCP/IP数据流

POST请求

有4个参数为必要参数

Content-Type,Content-Length,host和post内容

注意:Content-Length和POST的参数长度必须一致

例如

POST /flag.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 36

key=3e0d2cb7daa9987bb95eab15605f71d7

以一题目为例子

CTFHUB-SSRF-POST请求

GET请求

get请求要求没有POST请求那么多

例如:

GET/flag.php HTTP/1.1
Host: 127.0.0.1

不论是GET请求还是POST请求,我们都需要将其进行一次url编码,再将所有%0a换成%0d%0a之后再进行一次url编码

FastCGI协议

如果目标服务器使用的是php,并且存在ssrf,那么就可以构造FastCGI请求报文,直接让php解析服务进行解析,进而执行任意代码

利用条件:

  • libcurl版本>=7.45.0

  • PHP-FPM监听端口

  • PHP-FPM版本 >= 5.3.3

  • 知道服务器上任意一个php文件的绝对路径

CGI全称"通用网关接口"(Common Gateway Interface),用于HTTP服务器与其它机器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。

传统CGI接口方式的主要缺点是性能较差,因为每次HTTP服务器遇到动态程序时都需要重启解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发访问几乎是不可用的,因此就诞生了FastCGI。另外传统的CGI接口方式安全性也很差。

FastCGI是一个可伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口(FastCGI接口在Linux下是socket(可以是文件socket,也可以是ip socket)),主要优点是把动态语言和HTTP服务器分离开来。多数流行的HTTP服务器都支持FastCGI,包括Apache、Nginx和lightpd。

同时,FastCGI也被许多脚本语言所支持,比较流行的脚本语言之一为PHP。FastCGI接口方式采用C/S架构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程执行,然后将得到的结构返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

 以一题为例

 CTFHUB-SSRF-FastCGI协议

Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写

Redis协议

redis是一个key-value存储系统,是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
 

利用方式

  1. 绝对路径写webshell

  2. 写ssh公钥

  3. 写contrab计划任务反弹shell

以一题为例

CTFHUB-SSRF-Redis协议

浅析Redis中SSRF的利用

常见防御以及绕过

URL BYPASS

url可能必须以 “xxx” 开头。我们可以利用@来绕过,如 xhttp://x@127.0.0.1实际上是以用户名 whoami 连接到站点127.0.0.1,即 http://notfound.ctfhub.com@127.0.0.1http://127.0.0.1请求是相同的,该请求得到的内容都是127.0.0.1的内容。

我们扫描目录,发现了flag.php,构造如下payload即可绕过限制访问flag.php:

/?url=http://notfound.ctfhub.com@127.0.0.1/flag.php

以一题目为例

BUU [第二章 web进阶]SSRF Training

数字IP BYPASS

服务器有可能进制了127.0.0.1的地址,来防御内网探测,可以使用一些不同的进制替代ip地址,从而绕过WAF

利用进制的转换

127.0.0.1:
八进制:0177.0.0.1
十六进制:0x7f.0.0.1
十进制:2130706433

利用其他各种指向127.0.0.1的地址

http://localhost/
http://0/
http://[0:0:0:0:0:ffff:127.0.0.1]/
http://①②⑦.⓪.⓪.①

302跳转 BYPASS

302重定向又称之为暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。

可以用BP拦截请求访问

可以用curl命令直接访问

因为BP和curl命令都不会跟随302跳转

DNS重绑定 BYPASS

DNS重新绑定是计算机攻击的一种形式。 在这种攻击中,恶意网页会导致访问者运行客户端脚本客户端脚本,攻击网络上其他地方的计算机。 从理论上讲,同源策略(Same origin policy)可防止发生这种情况:客户端脚本只能访问为脚本提供服务的同一主机上的内容。 比较域名是实施此策略的重要部分,因此DNS重新绑定通过滥用域名系统(DNS)来绕过这种保护。

 要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。

我们可以自己配置一个自定义DNS服务器,并设定好某些域名的解析IP

可以用此测试网站来实现

https://lock.cmpxchg8b.com/rebinder.html

/?url=7f000001.c0a80001.rbndr.us/flag.php

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pikachu中的SSRF(Server-Side Request Forgery)漏洞可以通过不受信任的用户输入来构造恶意请求,并导致服务器对外部资源的未授权访问。 在pikachu中,SSRF漏洞主要表现为通过构造URL或使用file_get_contents函数来访问远程资源。文章中提到了两种主要的SSRF漏洞形式:SSRF(URL)和SSRF(file_get_contents)。 在SSRF(URL)中,攻击者可以利用不受信任的输入构造URL,通过服务器发起对外部资源的请求。这种漏洞可以导致攻击者访问内部网络、绕过防火墙、获取敏感信息等。 在SSRF(file_get_contents)中,攻击者可以构造恶意的URL参数,通过file_get_contents函数获取远程资源内容。这种漏洞可以用于读取文件、执行任意代码等。 在pikachu中,可能会存在一个漏洞页面,该页面接受一个名为url的参数,并使用curl库来访问该参数指定的URL。攻击者可以通过构造恶意的URL参数来利用SSRF漏洞进行攻击。例如,攻击者可以构造一个URL参数为'http://127.0.0.1/pikachu/vul/ssrf/ssrf_info/info1.php'的请求,从而获取该URL返回的内容。 为了防止SSRF漏洞的利用,开发者应该始终对用户输入进行严格的验证和过滤。可以使用白名单机制来限制可以访问的URL,或者使用特定的URL解析器来解析用户输入的URL,并确保只允许访问合法的URL。此外,还可以对URL参数进行限制,禁止访问内部网络地址和私有IP地址。 总结起来,pikachu中的SSRF漏洞是一种安全风险,攻击者可以通过构造恶意的URL或使用file_get_contents函数来访问远程资源,并可能导致服务器对外部资源的未授权访问。开发者应该谨慎处理用户输入,进行严格的验证和过滤,以及限制可访问的URL范围,来防止这种漏洞的利用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值