浅析SSRF的各种利用方式

302跳转

先让我们了解了解HTTP的302跳转吧

首先我们要知道状态码,状态码是HTTP请求过程结果的描述,由三位数字组成。这三位数字描述了请求过程中所发生的情况。状态码位于响应的起始行中,如在 HTTP/1.0 200 OK 中,状态码就是 200。

每个状态码的第一位数字都用于描述状态(“成功”、“出错”等)。如200 到 299 之间的状态码表示成功;300 到 399 之间的代码表示资源已经转移。400 到 499 之间的代码表示客户端的请求出错了。500 到 599 之间的代码表示服务器出错了。

那么302就属于重定向的状态码,它表示你要访问的资源在别的地方

301

Moved Permanently

在请求的URL已被移除时使用。响应的Location首部中应该包含资源现在所处的URL

302

Found

与301状态码类似;但是,客户端应该使用Location首部给出的URL来临时定位资源。将来的请求仍应使用老的URL

302表示临时重定向,而301表示永久重定向

接下来让我们看看题吧,CTFHub里ssrf的 302跳转 Bypass

首先看题目提示,抓取重要信息1.跟随302跳转 2.利用302跳转绕过ip 3.有个flag.php

第二步进去题目里,发现啥也没有,看网址有GET一个url

先传一个百度的网址看看url=http://www.baidu.com进去看看,这分明是存在是ssrf漏洞了,服务器请求伪造

进入主题,根据题目先传一个url=http://127.0.0.1/flag.php看看返回内容,然后返回说禁止访问内网ip,说明有WAF绕过,不能传内网地址,接下来就是绕过了

查了相关资料,在网络上存在一个很神奇的服务,网址为 xip.io,当访问这个服务的任意子域名的时候,都会重定向到这个子域名,举个例子:当我们访问 http://127.0.0.1.xip.io/flag.php,那么实际上我们访问的是就 http://127.0.0.1/flag.php。我们试一下,却发现失败了,所以这道题的本质就是ban了127

结合题目提示, 有一个302跳转的方法,即利用短地址跳转绕过 。我们生成一个较原链接更短的短链接,并使短链接重定向为原链接进行跳转绕过,http://127.0.0.1/flag.php生成短地址是 https://shorturl.at/bdp47。接下来我们访问这个地址https://shorturl.at/bdp47,flag就出来了

这道题就是利用短地址绕过WAF检测成功访问内网,感兴趣的hacker可自行摸索复现

数字IP Bypass

CTFHub里的数字ip bybass,打开环境

首先看题目提示(1)ban掉了127以及172. (2)不能使用点分十进制的ip (3)要访问127.0.0.1

进入题目,看到啥也没有,看网址GET传一个url参数

根据题目提示传http://127.0.0.1/flag.php肯定不行了,已经ban掉了,但是我们试着也传进去看看能返回什么信息给我们

返回了 hacker! Ban '/127|172|@/' 说明有WAF防护,ban了/127或172或@符号等,则我们得想着怎么去绕过WAF了,这时想起题目提示,不能使用点分十进制得ip,那么我们想想是否ip可以转成二进制来绕过呢,有想法则去网上看看是否有对应绕过方法

很显然有,则我们去网上找个在线ip进制转换器,把127.0.0.1转换成对应的进制ip来绕过

根据题目,它说不可以传入点分十进制的ip,所以我们试着只能传十进制没.的ip,则url=http://2130706433/flag.php进去,看看有没有flag,果然,绕过成功,拿到flag

扩展: 当有的对跳转的地址的长度有要求

host<5

url=http://0/flag.php (此题传这个也能达到绕过)

url=http://127.1/flag.php

host<3

url=http://0/flag.php也可以绕过

DNS重绑定 Bypass

先了解什么是DNS重绑定吧,在此之前我们再先来了解同源策略

同源策略(Same origin policy) 是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。

其实换句话来说就是在浏览器中,同一个域名下的网站只能调用本域名下的资源。就好比说现在有一个网址http://www.psgq.com/index.html的页面,在同源策略的约束下可以调用 http://www.psgq.com/index2.html的资源,但是不能调用http://www.psgq123.com/index.html的资源(<script>,<link>,<iframe>,<img>等标签的SRC属性除外)。同源策略最直接的表现就是能够区分出各个网站的cookie信息,使得我们能够有条不紊的访问各个网站而不会照成信息混乱。

另外,如果我在浏览器同时访问新浪和搜狐两个网站并且这两个网站都在浏览器存储了用户名和密码,那么他们各自只能访问各自存储的用户信息,无法交叉访问,否则就会造成用户信息泄露。

同源的定义:**如果两个 URL 的 协议、域名、端口都相同的话,则这两个 URL 是同源

举例来说, PsgQ - 博客园 这个网址中, https 是协议, www.cnblogs.com是域名,端口是443(https协议默认端口可以省略,你也可以把他看成PsgQ - 博客园)。任意两个网址,只要这三点全部相同,那么浏览器就认为它们是同源的,任意一个不相同都会被浏览器认为是跨域。

什么是DNS重绑定攻击?

在网页浏览过程中,用户在地址栏中输入包含域名的网址。浏览器通过DNS服务器将域名解析为IP地址,然后向对应的IP地址请求资源,最后展现给用户。而对于域名所有者,他可以设置域名所对应的IP地址。当用户第一次访问,解析域名获取一个IP地址;然后,域名持有者修改对应的IP地址;用户再次请求该域名,就会获取一个新的IP地址。对于浏览器来说,整个过程访问的都是同一域名,所以认为是安全的。(浏览器同源策略) 这就是DNS Rebinding攻击。

通过DNS重绑定攻击可以绕过同源策略,攻击内网的其他设备。

攻击条件:

1.攻击者可以控制恶意的DNS服务器,来回复域名查询,如 www.attacker.com

2.攻击者可以欺骗用户在浏览器加载 www.attacker.com。可以通过多种方式,从网络钓鱼到持久性XSS,或购买HTML横幅广告,来实现这一目标

3.攻击者 控制 www.attacker.com 钓鱼网站的服务器。

下面是DNS重绑定攻击的原理图:

1.受害者打开钓鱼邮件的链接,他们的Web浏览器会发出DNS查询请求,查询www.attacker.com的IP地址,基本流程:浏览器缓存 -> 系统缓存 -> 路由器 缓存 -> ISP DNS解析器缓存 -> 根域名服务器 -> 顶级域名服务器 -> 权威域名服务器,具体解析过程可参考之前关于DNS的介绍文章。

2.攻击者控制的DNS服务器收到受害者的DNS请求时,会使用www.attacker.com的真实IP地址93.185.216.36进行响应。 它还将响应的TTL值设置为0秒,以便受害者的机器不会长时间缓存它。

3.受害者的浏览器向钓鱼网站服务器发出HTTP请求加载网页。

4.攻击者进行HTTP响应,并通过JS加载一些恶意代码,该页面反复向www.attacker.com 发出POST请求。(POST请求包含恶意代码)

5.因为之前DNS ttl设置为0,缓存很快就失效,所以浏览器继续向恶意权威域名服务器发出查询。

6.此时,恶意DNS服务器收到查询后,回复一个内网设备的IP(也可以是一些物联网设备),如192.168.0.5。

7.因为满足同源策略,浏览器认为是安全的,于是向内网其他设备发送POST恶意请求。

为什么绕过了同源策略?

因为同源策略浏览器看的是协议,域名,端口,这些并没有变化,而背后的IP地址却已经变了,所以造成了跨域的请求。

那么了解过后。我们就来看看CTFHub的题目了

先看看附件,附件是跳转知乎,合天网安实验室对DNS重绑定漏洞的解释浅谈DNS重绑定漏洞 - 知乎,这是链接,感兴趣的hacker们可学习

回到题目,只提示了是DNS重绑定,打开题目,也是GET传一个url进去

老套路,传百度的网址进去,跳转到了百度,这纯纯就是ssrf漏洞了

根据之前题目的铺垫,肯定是要传一个http://127.0.0.1/flag.php,这里不多解释了,flag.php可以用dirsearch来扫出来

传进去发现,也是ban掉了内网ip,那我们先不看题目提示,看看来绕过行不行,先来个进制转换绕过试试

直接返回请求失败,之后我试过了短链接、@符号绕过也是如此,说明这题目前只能用DNS重绑定来做了,那想一想,每次访问域名的时候 解析域名获取一个IP地址,当再次解析域名的时候, 获取一个新的IP地址 ,那么我们可以把127.0.0.1和其他ip放在一个域名下,来进行绕过它的检测, 可以利用这个网站获取一个测试用的域名:hhttps://lock.cmpxchg8b.com/rebinder.html

然后直接访问,成功拿到flag

Gopher协议

什么是Gopher协议?

定义:Gopher是Internet上一个非常有名的信息查找系统,它将Internet上的文件组织成某种索引,很方便地将用户从Internet的一处带到另一处。在WWW出现之前,Gopher是Internet上最主要的信息检索工具,Gopher站点也是最主要的站点,使用tcp70端口。但在WWW出现后,Gopher失去了昔日的辉煌。现在它基本过时,人们很少再使用它;在SSRF中经常会使用Gopher来构造GET/POST包攻击应用

了解后上题目

进去后传一个http://127.0.0.1/flag.php进去发现有东西弹出,细看后啥也没有

打开查看源代码, 发现了只能本地访问,并且有key ,则是叫我们 POST key ,但是没有搜索框,再往下看试试还有啥

根据题目,发现还有个302.php,传进去发现返回not found,则这里通过302.php的跳转来实现gopher协议伪造

我们构造一个post请求包上去

gopher://127.0.0.1:80/_POST /flag.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 36
key=41a8a51f9cfaf9e3b4addc92c83de1ea

可以是查看源码得到得key。然后把它进行url编码且在后面 把%0A替换成%0d%0A,结尾加上%0d%0A,并且末尾要加上%0d%0a(\r\n)

gopher%3A//127.0.0.1%3A80/_POST%20/flag.php%20HTTP/1.1%0d%0AHost%3A%20127.0.0.1%3A80%0d%0AContent-Type%3A%20application/x-www-form-urlencoded%0d%0AContent-Length%3A%2036%0d%0Akey%3D41a8a51f9cfaf9e3b4addc92c83de1ea %0d%0a

然后在进行一次URL编码

gopher%3A//127.0.0.1%3A80/_POST%2520/flag.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252036%250D%250A%250D%250Akey%253D41a8a51f9cfaf9e3b4addc92c83de1ea%250D%250A

然后把这个payload传上去,成功拿到flag

FastCGI协议

先来了解一下什么是FastCGI吧。

Fastcgi其实是一个通信协议,和HTTP协议一样,都是进行数据交换的一个通道。

HTTP协议是浏览器和服务器中间件进行数据交换的协议,浏览器将HTTP头和HTTP体用某个规则组装成数据包,以TCP的方式发送到服务器中间件,服务器中间件按照规则将数据包解码,并按要求拿到用户需要的数据,再以HTTP协议的规则打包返回给服务器。

类比HTTP协议来说,fastcgi协议则是服务器中间件和某个语言后端进行数据交换的协议。Fastcgi协议由多个record组成,record也有header和body一说,服务器中间件将这二者按照fastcgi的规则封装好发送给语言后端,语言后端解码以后拿到具体数据,进行指定操作,并将结果再按照该协议封装好后返回给服务器中间件。

php-fpm

官方对php-fpm的解释是FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。也就是说php-fpm是FastCGI的一个具体实现,其默认监听9000端口

了解之后,那我们来做做CTFHub的题目

打开题目,提示有附件,对我们有帮助,进入附件,则是对FastCGI协议的解析,网址Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写_mysteryflower的博客-CSDN博客

进入题目,是GET传一个url,根据题目提示,让我们攻击FastCGI协议

那么这里介绍一个工具Gopherus,这个工具可以直接生成攻击FastCGI协议的payload

执行命令python2 gopherus.py --exploit fastcgi

用工具扫出来的目录/var/www/html/index.php

然后再输入执行2的命令ls查看目录列表

则自动生成payload(已经是url编码过了),然后拿payload进行二次url编码, 因为url会对其解码一次,curl也会解码一次,所以要编码两次

然后没有看到我们想要找的,则再次使用这条命令 "find / -name flag*"

拿生成的payload进行url编码传进去,看到了/flag_08ae6c968e96f994c7df137667e07738,我们要找的应该在这里

所以我们用cat命令查看/flag_08ae6c968e96f994c7df137667e07738文件(payload生成雷同上面),拿到后传进去拿到flag

Redis协议

什么是Redis协议呢?

Redis服务器与客户端通过RESP(REdis Serialization Protocol)协议通信。

RESP协议是在Redis 1.2中引入的,但它成为了与Redis 2.0中的Redis服务器通信的标准方式。这是您应该在Redis客户端中实现的协议。

RESP实际上是一个支持以下数据类型的序列化协议:简单字符串,错误,整数,批量字符串和数组。

总所周知,redis服务是开在6379端口,通常是利用redis未授权访问而达到写入shell或者反弹ssh等目的。

这里我本来想着用gopherus 直接生成针对redis未授权访问,写入shell

了解之后,直接上题目

题目提示redis协议,上工具Gopherus 来生成payload ,写一个一句话木马进去

自动生成payload(已经是url编码过了),然后拿payload进行二次url编码,抓包后传入,虽然返回了504,但是shell了已经写入

用蚁剑连接或用命令查看,这里用命令,shell.php?cmd=ls /,看到里面有个flag_5858b38b7b9ad01e6bebc52d3249453d

然后同cat命令查看flag_5858b38b7b9ad01e6bebc52d3249453d,获取flag

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tacokings

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值