[BJDCTF2020]ZJCTF,不过如此1
打开题目可以看到一段php文件包含,源码如下
<?phperror_reporting(0); $text = $_GET["text"]; $file = $_GET["file"]; if(isset($text)&&(file_get_contents($text,'r')==="I have a dream")){echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";if(preg_match("/flag/",$file)){die("Not now!");}include($file); //next.php} else{highlight_file(__FILE__); } ?>简单分析一下这段代码,代码通过GET方法来传入text和file两个参数,并且传入的text参数通过file_get_contents函数以只读的方式打开,而且当它强等于"I have a dream"这个字符串是,才能够去输出并且去执行下面的那个if判断。下面的那个if判断只是简单地判断了一下file传入的值中是否包含flag这个字符串,如果包含的话,则会输出"Not now!",否则就会去包含file传入的这个文件参数。
关于file_get_contents函数的利用手法,看这里PHP文件包含漏洞利用思路与Bypass总结手册(一)_index.zip-CSDN博客大佬总结的特别好,我好爱。
在本题中file_get_contents函数的利用如下(burpsuite抓包)
POST /?text=php://input
……
……
……
I have a dream
可以看到通过这个办法是成功过了第一个if

看了一些博客还有一下是通过data协议来绕过的,直接就是?text=data://text/pain,I have a dream
在上面大佬的博客总结中也有提到。
那么第一个if绕过了接下来就是第二个if了,可以看到源码中是包含了文件,并且给了提示那么我们就可以通过php伪协议来读取next.php里面的内容了

我们利用php://filter协议来读取next.php内容,于是我们在burpsuite中就可以添加上file=php://filter/convert.base64-encode/resource=next.php,然后就得到了next.php的源码。

我们将返回的base64解码就是next.php的源码了,源码如下
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;function complex($re, $str) {return preg_replace('/(' . $re . ')/ei','strtolower("\\1")',$str);
}foreach($_GET as $re => $str) {echo complex($re, $str). "\n";
}function getFlag(){@eval($_GET['cmd']);
}
先学习一下preg_replace函数PHP preg_replace() 函数 | 菜鸟教程 (runoob.com)
函preg_replace 函数执行一个正则表达式的搜索和替换。
preg_replace ( $pattern , $replacement , $subject)
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
返回值:
如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。
如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
在next.php中,complex函数中使用了preg_replace /e模式,这会导致preg_replace中的第二个参数会被当做代码执行,但是这里的第二个参数是一个不可变的,但是存在一种特殊的情况:
在正则表达式替换中,strtolower("\\1") 这一部分中:
\\1 代表第一个捕获组中的内容。在正则表达式中,用圆括号 () 括起来的部分就是捕获组。捕获组中的内容会被记住,并且可以在替换字符串中引用。\1 是第一个捕获组的引用,在双引号字符串中需要用 \\1 来表示。
strtolower函数的作用是把字符串转化成小写。
preg_replace('/(' . $re . ')/ei','strtolower("\\1")',$str );那么这段代码作用就是
- 找到
$str中匹配正则表达式($re)的部分。- 将匹配到的部分传递给
strtolower函数。- 将
strtolower函数的返回值替换原匹配的部分。示例:
preg_replace('/(\w+)/ei', 'strtolower("\\1")', 'Hello World');这段代码会将
Hello和World都转换为小写,结果是hello world。
那么这样一来这段代码执行的就是preg_replace中的第三个参数了,这样即使第二个参数是不可变的也可以执行代码。
这样的话我们只需要利用这个方法来执行getFlag()函数,在传入cmd来执行命令就可以了
构造paylaod=/next.php?\S*=${getFlag()}&cmd=system('ls /') ;
解释一下:
\S*:匹配任意非空白字符。
\S*=${getFlag()}:这将构造一个匹配,并且将捕获组的内容作为代码执行。也就是这段代码会遍历传入的GET参数,将GET传入的变量名给了$re,把变量名的值给了$str,那么这样在传入paylaod的时候preg_replace会变成
preg_replace('/(\S*)/ei', 'strtolower("\\1")', '${getFlag()}');那么执行完的界面就是
发现flag,换一下命令就可以了,得到flag
参考文章:
[BUUCTF][BJDCTF2020]ZJCTF,不过如此1(做题记录_[bjdctf2020]zjctf,不过如此 1-CSDN博客
BUUCTF:[BJDCTF2020]ZJCTF,不过如此_[bjdctf2020]zjctf,不过如此-CSDN博客
PHP文件包含漏洞利用思路与Bypass总结手册(一)_index.zip-CSDN博客
相关文章:
[BJDCTF2020]ZJCTF,不过如此1
打开题目可以看到一段php文件包含,源码如下 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream")){echo "<br><h1>…...
全网最全 Kimi 使用手册,看完 Kimi 效率提升 80%
在当前AI文字大模型领域,ChatGPT4.0无疑是最强大。然而,最近最火爆的大模型非国产Kimi莫属。 相较于其它大模型,Kimi 最大的优势在于,超长文本输入,支持200万汉字,是全球范围内罕见的超长文本处理工具&…...
“Redis中的持久化:深入理解RDB与AOF机制“
目录 # 概念 1. RDB持久化 1.1 备份是如何执行的(RDB过程) 1.2 配置文件信息 1.3 RDB持久化操作 1.4 RDB优势 1.5 RDB劣势 1.6 RDB做备份 2. AOF持久化 2.1 AOF开启及使用 2.2 异常恢复 2.3 配置文件操作 2.4 AOF持久化流程 2.5 优点 2.6…...
PHP框架详解:Symfony框架讲解
PHP作为一种流行的服务器端编程语言,拥有众多框架,其中Symfony是备受开发者推崇的一个强大框架。本文将详细讲解Symfony框架的特点、优势及其主要组件和用法。 一、Symfony简介 Symfony是由Fabien Potencier于2005年创建的一个开源PHP框架。它基于MVC&…...
PR软件视频抠图换背景
1 新建项目 2 新建序列 在项目的右下角有个图标,新建 序列 序列是视频的制作尺寸,根据自己的需要选择 3 新建颜色遮罩 在项目的右下角--新建颜色遮罩--选择黑色--确定 4 导入视频 把要导入视频的文件夹打开,把视频拖到 项目 里 把黑色遮罩拖…...
下载依赖有问题(只有自己有问题)
有缓存! 删除node_modules 命令:npm run clean 前提是该项目支持这个命令:package.json > scripts 内有 clean 例如下面这个就没有clean,则直接手动删除 清除缓存 npm cache clean --force pnpm store prune删除lock文件 …...
vscode-关闭ts与js语义校验
1.ts与js语义校验 TypeScript(TS)和JavaScript(JS)在语义校验方面有很大的不同。TypeScript是一种静态类型检查的编程语言,它是JavaScript的一个超集,为JavaScript添加了类型系统和其他一些特性。而JavaScr…...
风控中的文本相似方法之余弦定理
一、余弦相似 一、 余弦相似概述 余弦相似性通过测量两个向量的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。 从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。结…...
Spring Boot定时任务编程指南:如何创建和配置周期性任务
🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 🔥 微信:zsqtcyw 联系我领取学习资料 …...
Java 获取客户端 IP 地址【工具类】
Java 获取客户端 IP 地址 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress;/*** 网络工具类*/ public class NetUtils {/*** 获取客户端 IP 地址** param request 请求* return {link String}*/public static String getIpAddress(HttpServletReq…...
区块链中nonce是什么,什么作用
目录 区块链中nonce是什么,什么作用 区块链中nonce是什么,什么作用 Nonce在以太坊中是一个用于确保交易顺序性和唯一性的重要参数。以下是对Nonce的详细解释: 定义 Nonce是一个scalar值,它等于从该地址发送的交易数量,或在具有关联代码的账户的情况下,由该账户创建的合…...
探索Python的多媒体解决方案:ffmpy库
文章目录 探索Python的多媒体解决方案:ffmpy库一、背景:数字化时代的多媒体处理二、ffmpy:Python与ffmpeg的桥梁三、安装ffmpy:轻松几步四、ffmpy的五项基本功能1. 转换视频格式2. 调整视频质量3. 音频转换4. 视频截图5. 视频合并…...
dmhs同步因目的端表自增列报错解决方法
dmhs同步因目的端表自增列报错解决方法 1 dmhs copy 装载数据时报错 HY000 CODE:-27232 配置源端捕获器cpt 1 dmhs copy 装载数据时报错 HY000 CODE:-2723 ERR:Only if specified in the column list and SET IDENTITY INSERT is ON, then identity column could be assigned …...
封装分发安装教程
【安装环境】 Linux伪静态 PHP7.1mysql5.6 SSL 证书 (使用宝塔) 1、在宝塔上面新建站点,把压缩包上传到根目录,解压出来,然后导入 sql 数据库文件,再 然后修改数据库配置 source\system\db_config.php 2、…...
redis从入门到进阶——数据类型、 操作、数值操作、发布订阅、消息队列、布隆过滤器、事务
文章目录 基础数据类型操作数值操作 进阶发布订阅消息队列布隆过滤器事务 基础 数据类型 string,set, hash, list, zset 操作 string符串类型: 保存一个字符串:set key value [EX seconds|PX milliseconds...] [NX|XX]EX:设置…...
剖析 Kafka 消息丢失的原因
文章目录 前言一、生产者导致的消息丢失的场景场景1:消息太大解决方案 :1、减少生产者发送消息体体积2、调整参数max.request.size 场景2:异步发送机制解决方案 :1、使用带回调函数的发送方法 场景3:网络问题和配置不当…...
阿里又出AI神器,颠覆传统图像编辑,免费开源!
文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 最近阿里开源了 Mi…...
git 大文本上传和下载git-lfs
1. ubuntu 1)下载脚本来自动化配置系统上的包存储库,导入签名密钥等过程。这些脚本必须在root下运行。 # apt/deb repos: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash # curl -s https://packag…...
Ps:脚本与动作
有三种脚本语言可用于编写 Photoshop 脚本:AppleScript(macOS)、JavaScript 和 VBScript(Windows)。 Photoshop 脚本文件默认文件夹 Win:C:\Program Files\Adobe\Adobe Photoshop 2024\Presets\Scripts Mac…...
MySQL数据库回顾(1)
数据库相关概念 关系型数据库 概念: 建立在关系模型基础上,由多张相互连接的二维表组成的数据库。 特点: 1.使用表存储数据,格式统一,便于维护 2.使用SQL语言操作,标准统一,使用方便 SOL SQL通用语法 …...
保姆级教程:在Ubuntu上复现‘easy溯源’靶场,手把手教你分析反弹Shell和内网穿透痕迹
在Ubuntu上复现‘easy溯源’靶场:从环境搭建到痕迹分析实战指南 当你第一次接触应急响应时,是否曾被各种专业术语和复杂场景搞得晕头转向?本文将带你从零开始,在Ubuntu系统上完整复现一个名为easy溯源的靶场环境。这不是简单的解题…...
自动驾驶中的路径规划实战:手把手教你用Python复现RRT与RRT*算法(含动态演示)
自动驾驶路径规划实战:Python实现RRT与RRT*算法全解析 从理论到实践的路径规划探索 在自动驾驶技术快速发展的今天,路径规划作为核心算法之一,直接决定了车辆能否安全高效地完成行驶任务。想象一下,当你驾驶车辆进入一个复杂的停车…...
OpenClaw+nanobot科研利器:自动抓取论文并生成综述
OpenClawnanobot科研利器:自动抓取论文并生成综述 1. 为什么需要自动化文献综述工具 作为一名经常需要跟踪前沿研究的科研工作者,我深刻体会到手动整理文献的痛苦。每次开题或写综述时,需要花费大量时间在arXiv、PubMed等平台反复搜索、下载…...
前端国际化:别让你的应用只懂一种语言
前端国际化:别让你的应用只懂一种语言 毒舌时刻这应用写得跟方言似的,出了本地就没人懂。各位前端同行,咱们今天聊聊前端国际化。别告诉我你的应用还只有中文版本,那感觉就像在国际会议上只说方言——能说,但没人懂。 …...
OFA-Image-Caption赋能Android应用:移动端图像智能描述实战
OFA-Image-Caption赋能Android应用:移动端图像智能描述实战 你有没有想过,手机拍下一张照片,它就能立刻告诉你照片里有什么?对于视障朋友来说,这不仅仅是便利,更是打开世界的一扇窗。而对于内容平台&#…...
系统资源全景掌控:TaskExplorer如何重塑进程管理体验
系统资源全景掌控:TaskExplorer如何重塑进程管理体验 【免费下载链接】TaskExplorer Power full Task Manager 项目地址: https://gitcode.com/GitHub_Trending/ta/TaskExplorer 在数字化办公环境中,系统卡顿、资源占用异常、进程无响应等问题时常…...
嵌入式ADC过采样驱动文档规范与实践
项目标题缺失有效技术信息,项目摘要仅为编码“PURS_ZI_007”,项目关键词为空,Readme文档内容未提供。根据嵌入式底层技术文档创作规范,所有输出必须严格基于输入的英文原始材料——包括功能描述、API定义、配置项、示例代码及架构…...
OpenClaw技能扩展实战:用百川2-13B-4bits量化模型开发自定义自动化模块
OpenClaw技能扩展实战:用百川2-13B-4bits量化模型开发自定义自动化模块 1. 为什么选择百川2-13B-4bits量化模型 去年冬天,当我第一次尝试用本地部署的大模型开发OpenClaw技能时,显存不足的报错成了家常便饭。直到发现百川2-13B的4bits量化版…...
嵌入式系统错误处理机制与实现
嵌入式系统中的错误处理机制深度解析1. 错误概念与分类1.1 错误分类体系在嵌入式系统开发中,错误处理是确保系统可靠性的关键环节。从严重性维度分析,程序错误可分为两类:致命性错误:系统无法执行恢复操作,典型处理方式…...
Vivado进阶指南:网表物理约束实战解析
1. 网表物理约束的核心价值 第一次接触Vivado的网表物理约束时,我和很多初学者一样困惑:明明RTL代码已经定义了所有功能,为什么还要多此一举?直到在某次高速ADC数据采集项目中,系统频繁出现时序违例,我才真…...

