大家好,又见面了,我是你们的朋友全栈君。
SSRF漏洞原理
SSRF(Server-Side Request Forgery:服务器端请求伪造)
是一个由攻击者构造请求,在目标服务端执行的一个安全漏洞。攻击者可以利用该漏洞使服务器端向攻击者构造的任意域发出请求,目标通常是从外网无法访问的内部系统。简而言之就是以服务器的身份来执行请求。
常见利用方式
伪协议读取文件
伪协议读取文件,在SSRF中常用的伪协议就是file:///协议
代码语言:javascript复制/?url=file:///var/www/html/flag.php
内网访问
我们从目标主机内网环境访问其本地的flag.php
代码语言:javascript复制/?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请求
代码语言:javascript复制有4个参数为必要参数
Content-Type,Content-Length,host和post内容
注意:Content-Length和POST的参数长度必须一致
例如
代码语言:javascript复制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请求那么多
例如:
代码语言:javascript复制GET/flag.php HTTP/1.1
Host: 127.0.0.1
不论是GET请求还是POST请求,我们都需要将其进行一次url编码,再将所有 换成 之后再进行一次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(主从)同步。
利用方式
- 绝对路径写webshell
- 写ssh公钥
- 写contrab计划任务反弹shell
以一题为例
CTFHUB-SSRF-Redis协议
常见防御以及绕过
URL BYPASS
url可能必须以 “xxx” 开头。我们可以利用@
来绕过,如 xhttp://x@127.0.0.1实际上是以用户名 whoami 连接到站点127.0.0.1,即 http://notfound.ctfhub.com@127.0.0.1与 http://127.0.0.1请求是相同的,该请求得到的内容都是127.0.0.1的内容。
我们扫描目录,发现了flag.php,构造如下payload即可绕过限制访问flag.php:
代码语言:javascript复制/?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
代码语言:javascript复制/?url=7f000001.c0a80001.rbndr.us/flag.php
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152817.html原文链接:https://javaforall.cn