ctfshow-SSRF
web351
flag在flag.php下,直接访问没有权限
使用curl_exec访问才有权限
web352
开始上过滤了
使用0.0.0.0
访问本机上的服务
url = http://0.0.0.0/flag.php
0.0.0.0:
- 表示本机上的所有IPV4地址,比如一个主机上有两个IP地址:192.168.1.1和10.1.2.1,并且该主机上的起了一个监听端口为0.0.0.0的服务,那么可以通过这两个IP访问这个服务。
- 在路由中,0.0.0.0表示默认路由,即当路由表中没有找到完全匹配的路由时所对应的路由。
web353
直接拿web352可以打通
web354
- trick:sudo.cc
sudo.cc == 127.0.0.1
- DNS Rebind:
依靠DNS解析返回127.0.0.1以及服务端没有合法的DNS解析后的IP校验机制进行解题
web355
查看一下127.0.0.1
的多种写法即可
web356
拿上一题的payload直接打通
web357
开始检查DNS解析后的IP, 第一次的DNS解析就寄了
好在他这个源码也写得"巧妙":
在DNS设置的IP的TTL比较短的时候,在经过第一次的DNS解析后(gethostbyname
),可以返回一个正常的IP;由于短TTL,在file_get_contents
时需要再发起一次DNS解析,这次的DNS解析是没有经过任何校验的,所以可以使用DNS重绑定攻击。
题目给的源码如下:
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
$ip = gethostbyname($x['host']); // DNS解析,返回IPV4地址
echo '</br>'.$ip.'</br>';
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
die('ip!');
}
// file_get_contents的参数为$_POST['url']
echo file_get_contents($_POST['url']);
}
else{
die('scheme');
}
?>
该域名绑定的IP一个是随意的,另一个是127.0.0.1
即可
web358
直接给了源码:
利用@绕过ctf,@前面的字符串为身份认证信息
利用参数查询?
,或者锚点#
绕过show
<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if(preg_match('/^http:\/\/ctf\..*show$/i',$url)){
echo file_get_contents($url);
}
web359
发现有DNS解析
试试DNS重绑定:不太行,可能flag压根不在同个目录下
按照提示是打mysql服务,有脚本可以直接用gopher协议打:https://github.com/tarunkant/Gopherus
然后在burpsuite中URL编码传参,写入木马
蚁剑连接,虚拟终端下直接cat /flag.txt
可以获取flag
web360
用上面的脚本打redis即可