环回地址绕过
尝试访问内网 也就是127.0.0.1里面的flag.php
但是如果真的去访问127.0.0.1/flag.php 还是不行
也就是说127.0.0.1被过滤了
进制转换
127.0.0.1是点分十进制
可以用二进制八进制十六进制来绕过过滤
0x7F000001/flag.php
017700000001/flag.php(八进制前面是0)
成功绕过
也可以用八进制或者十六进制的点分式
0177.0000.0000.0001/flag.php
0x7F.0x00.0x00.0x01/flag.php 也可以只转一个0x7F.0.0.1/flag.php
添加@绕过
平常我们传入的url是url=http://127.0.0.1
如果 我们传入的url是url=http://quan9i@127.0.0.1
,它此时依旧会访问127.0.0.1
示例如下 题目给出提示
在这里插入图片描述
要求必须以http://notfound.ctfhub.com
开头,但我们访问内网文件的话,有这个,该怎么访问呢,这个时候就用到了@
字符,我们构造payload如下
url=http://notfound.ctfhub.com@127.0.0.1/flag.php
在这里插入图片描述
特殊数字(例如②)
有时候可以用特殊数字来绕过,构造特殊的127.0.0.1,如1②7.0.0.1
在这里插入图片描述
句号替代.绕过
用。
来代替.
在这里插入图片描述
省略0
当过滤127.0.0.1
整体时,还有一种绕过方式就是省略中间的0,这个时候也是可以访问的
特殊0
在windows中,0代表0.0.0.0
,而在linux下,0代表127.0.0.1
,如下所示
url=http://0/flag.php
302重定项绕过
若传入的私网地址被限制可以使用302重定向绕过。这需要一台公网服务器和它的公网IP,在服务器中创建重定向的代码文件,提交公网IP路径下的重定向代码文件,使SSRF漏洞服务器或主机访问从而重定向到自己内网地址或本机地址。
具体步骤就是我们在自己的公网服务器上设置302重定向到127.0.0.1/flag.php
然后通过访问我们的公网ip 显示出127.0.0.1/flag.php的内容
在自己的公网服务器上创建tmp/302/index.php
并且写入代码
php
<?php
header('Location: http://127.0.0.1/flag.php');
然后我们监听一下7777端口
php73 -S 0.0.0.0:7777
再去访问
即可成功得到
DNS重绑定
ssrf的防御机制
对于用户请求的URL参数,首先服务器端会对其进行DNS解析,然后对于DNS服务器返回的IP地址进行判断,如果在黑名单中,就pass掉。 但是在整个过程中,第一次去请求DNS服务进行域名解析到第二次服务端去请求URL之间存在一个时间差,利用这个时间差,我们可以进行DNS 重绑定攻击。我们利用DNS Rebinding技术,在第一次校验IP的时候返回一个合法的IP,在真实发起请求的时候,返回我们真正想要访问的内网IP即可。 要完成DNS重绑定攻击,我们需要一个域名,并且将这个域名的解析指定到我们自己的DNS Server,在我们的可控的DNS Server上编写解析服务,设置TTL时间为0,这是为了防止有DNS服务器对解析结果进行缓存。这样就可以进行攻击了,完整的攻击流程为:
服务器端获得URL参数,进行第一次DNS解析,获得了一个非内网的IP 对于获得的IP进行判断,发现为非黑名单IP,则通过验证 服务器端对于URL进行访问,由于DNS服务器设置的TTL为0,所以再次进行DNS解析,这一次DNS服务器返回的是内网地址。
攻击原理:利用服务器两次解析同一域名的短暂间隙,,更换域名背后的ip达到突破同源策略或过waf进行ssrf的目的。
DNS中的机制TTL:域名和IP绑定关系的Cache存活的最长时间。
所以最理想的TTL值为0
DNS重绑定这里简单的说就是我们先提供一个ip,然后在服务端进行解析的过程中再传127.0.0.1,此时就可能会出现访问到本地文件的情况 举个栗子,我们设置一个为127.0.0.1,另一个随便写一个公网的ip
然后去访问这个域名
域名重绑定网站
rbndr.us dns rebinding service
参考:
https://www.bilibili.com/video/BV1Fw41157v4?vd_source=294c9cb943c812caed99031fabfb135d