ctfshow_SSRF(web351-360)

发布时间 2023-08-11 20:46:38作者: Icfh

ctfshow-SSRF

web351

flag在flag.php下,直接访问没有权限

使用curl_exec访问才有权限

url = http://127.0.0.1/flag.php

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校验机制进行解题

image-20230716171824065

web355

查看一下127.0.0.1的多种写法即可

http://127.1/flag.php

http://0/flag.php

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即可

image-20230716190931179

web358

直接给了源码:

利用@绕过ctf,@前面的字符串为身份认证信息

利用参数查询?,或者锚点#绕过show

http://ctf.ctf@127.0.0.1/flag.php?show

http://ctf.ctf@127.0.0.1/flag.php#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解析

image-20230716201057572

试试DNS重绑定:不太行,可能flag压根不在同个目录下

按照提示是打mysql服务,有脚本可以直接用gopher协议打:https://github.com/tarunkant/Gopherus

image-20230716203012191

然后在burpsuite中URL编码传参,写入木马

蚁剑连接,虚拟终端下直接cat /flag.txt可以获取flag

web360

用上面的脚本打redis即可