php各个版本的特性以及绕过方式

news/2024/12/24 3:28:54 标签: php, 开发语言, linux, CTF, 安全

一.php各个版本的特性

二.绕过正则匹配的常见方式

1.绕过空格

a.空变量$@
l$@s
b.环境变量IFS(默认情况下IFS为空格、制表符和换行符)
l${IFS}s
c.重定向符(<,>)
cat < file.txt //把file.txt的内容给cat命令,显示在shell中
ls > file.txt //把ls命令显示在shell中的,写入到文件file.txt中
ls < file  //显示file那层的ls命令
d.逗号绕过
{cat,flag.txt} //和cat flag.txt一样

2.绕过某些关键字

a.反斜线绕过(shell中的\用来转义的)
ca\t fl\ag.txt //因为反斜线转义的是特殊字符,所以正常的字符不会转义,即绕过正则匹配又执行了代码
b.两个单引号拼接
l''s //和ls一样,在这里扩展一个python的特性,python字符相加不一定用加好可以直接'a''b',会输出'ab'
c.模糊匹配
1.*(星号):
匹配零个或多个字符。例如,*.txt 匹配所有以 .txt 结尾的文件名。
2.?(问号):
匹配单个字符。例如,file?.txt 可以匹配 file1.txt、fileA.txt 等,但不匹配 file12.txt 或 file.txt(因为 ? 只匹配一个字符)。
3.[](方括号):
匹配方括号内的任意一个字符。例如,file[123].txt 可以匹配 file1.txt、file2.txt 或 file3.txt。
还可以使用范围,如 [a-z] 匹配任何小写字母。
4.[^...](方括号内的否定):
匹配不在方括号内的任意字符。例如,file[^123].txt 不会匹配 file1.txt、file2.txt 或 file3.txt,但会匹配 fileA.txt。
5.{}(花括号):
通常用于扩展,而不是直接的模糊匹配,但可以用于生成一系列匹配的模式。例如,echo file{1..3}.txt 会输出 file1.txt file2.txt file3.txt。
d.内联执行
1.使用分号(;):
分号用于分隔要在单个命令行中顺序执行的命令。Shell会按照从左到右的顺序依次执行这些命令,无论前面的命令是否成功执行。
command1; command2; command3
在这个例子中,command1、command2和command3会依次执行。

2.使用逻辑与(&&):
逻辑与操作符用于连接两个命令,并且仅当第一个命令成功执行(即返回状态为0)时,才会执行第二个命令。
command1 && command2
如果command1成功执行,那么command2会被执行;如果command1失败(返回非0状态),那么command2不会被执行。

3.使用逻辑或(||):
command1 || command2
如果command1失败执行(返回非0状态),那么command2会被执行;如果command1成功执行(返回0状态),那么command2不会被执行。

4.使用子Shell:
你可以将命令放在括号()中,这样它们就会在一个新的子Shell进程中执行。子Shell中的命令之间也可以用分号、逻辑与或逻辑或来连接。
(command1; command2)
或者

(command1 && command2)
或者

bash
(command1 || command2)
5.使用管道符(|):
管道符用于将一个命令的输出作为另一个命令的输入。这通常用于文本处理任务中,而不是简单的命令串联。
command1 | command2
在这个例子中,command1的输出会被传递给command2作为输入。

6.使用后台执行(&):
如果你想要并行执行命令(即同时运行它们),你可以在命令的末尾加上&符号。但是,请注意,这种方式并不会等待第一个命令完成就开始第二个命令;它们会同时运行。
command1 & command2 &
e.编码绕过(类似于base64,16进制编码)

三.弱类型的绕过

详细看这篇文章

CTF之WEB(php弱类型绕过)-CSDN博客

四.常见的函数绕过

1.array_search

$c=(array)json_decode(@$_GET['c']);  //把输入的json格式转成php的数据格式
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){ //判断c数组里是否不为空,c[m]是否不是数字,并且c[m]是否大于2022
    if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){//判断c[n]是否是一个数组,c[n]数组是否有两个,并且c[n][0]也要是数组
        $d = array_search("DGGJ", $c["n"]);//查找是否含有DGGJ
        $d === false?die("no..."):NULL;
        foreach($c["n"] as $key=>$val){
            $val==="DGGJ"?die("no......"):NULL;//同上
        }
        $key2 = 1;
    }else{
        die("no hack");
    }
}else{
    die("no");
}

这里就用到了array_search查找匹配的时候用的是==而不是===,所以可以采用弱类型绕过

payload

c={"m":"2024a","n":[[],0]}

2.__wakeup(CVE-2016-7124)

漏洞影响版本:

PHP5 < 5.6.25

PHP7 < 7.0.10

漏洞产生原因:

如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行 

攻防世界web进阶区Web_php_unserialize,序列化大详解-CSDN博客

3.+绕过正则匹配

反序列化为啥可以利用加号绕过php正则匹配-CSDN博客

五.一些特殊的绕过

1.php伪协议

  • php://input
    • 用途:读取原始POST数据。
    • 示例:
      php">$data = file_get_contents('php://input');
      echo $data;

      说明:这个伪协议允许你读取通过POST方法发送的原始数据,这在处理JSON、XML或其他非表单数据格式时非常有用。

  • php://output
    • 用途:写入数据到输出缓冲区。
    • 示例:
      php">$data = "Hello, World!";
      file_put_contents('php://output', $data);
    • 说明:这个伪协议允许你直接将数据写入到输出缓冲区,通常用于生成动态内容。
  • php://filter
    • 用途:读取或写入文件,并应用指定的过滤器。
    • 示例:
      php">$data = file_get_contents('php://filter/read=convert.base64-decode/resource=index.php');
      echo $data;
    • 说明:这个伪协议允许你在读取或写入文件时应用各种过滤器,比如base64编码/解码、字符串转换等。
  • php://memory 和 php://temp
    • 用途:读写内存中的数据流。
    • 示例:
      php">$stream = fopen('php://memory', 'r+');
      fwrite($stream, 'Hello, World!');
      rewind($stream);
      echo fread($stream, 13);
      fclose($stream);
    • 说明:php://memory 提供一个基于内存的流,数据会一直保留在内存中,直到脚本结束或显式地释放。php://temp 类似于 php://memory,但当数据大小超过预设限制时,数据会被写入临时文件。
  • zlib://
    • 用途:读取或写入gzip压缩文件。
    • 示例:
      php">$data = file_get_contents('zlib://compressed.gz');
      echo $data;
    • 说明:这个伪协议允许你读取gzip压缩文件的内容,而不需要先解压文件。
  • data://
    • 用途:读取数据URI(Data URI scheme)的内容。
    • 示例:
      php">$data = 'data://text/plain;base64,SGVsbG8sIFdvcmxkIQ==';
      $content = file_get_contents($data);
      echo $content;
      
      //file = data://text/plain;<?php system("ls"); ?>; 可以执行php代码
    • 说明:这个伪协议允许你使用base64编码的数据URI来直接嵌入数据。
  • glob://
    • 用途:读取匹配文件路径模式的结果。
    • 示例:
      php">$files = glob('glob://*.php');
      print_r($files);
    • 说明:这个伪协议允许你使用glob模式匹配文件路径,并返回匹配的文件列表。
  • phar://
    • 用途:读取Phar归档文件的内容。
    • 示例:
      php">$data = file_get_contents('phar://archive.phar/file.txt');
      echo $data;
    • 说明:这个伪协议允许你读取Phar归档文件(PHP Archive)的内容,Phar是PHP的打包格式,用于将多个PHP文件打包成一个单独的文件。

2.反单引号

程序中的反单引号“ ` ”-CSDN博客

cat `find` //会找到当前目录下的所有文件目录和文件,并输出
//执行过程是先执行find函数,找到目录和文件,在返回执行cat,cat会输出所有的不是目录的内容,目录不显示内容

六.一些特殊的知识

1.robots协议

举个例子,下面也就是不允许你访问f1ag_1l_h3re.php这个文件,详细看下面的链接

User-agent: *
Disallow: 
Disallow: f1ag_1s_h3re.php

robots协议-CSDN博客


http://www.niftyadmin.cn/n/5797265.html

相关文章

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据

在分布式系统中&#xff0c;etcd 是一个高可用的键值存储&#xff0c;用于存储和共享配置信息、服务发现、协调等。向 etcd 写入数据可以通过多种方式进行&#xff0c;常见的方式是使用 etcd 提供的 HTTP API 或者通过客户端库来进行操作。 目录 一、使用EtcdCtl工具来写入数据…

HarmonyOS ArkTS中视频播放Video组件实现竖屏到横屏切换

在开发HarmonyOS应用时&#xff0c;视频播放是一个常见的需求。ArkTS提供了Video组件来满足这一需求。本文将介绍如何使用ArkTS的Video组件&#xff0c;并实现视频播放时从竖屏切换到横屏的功能。 视频播放组件简介 Video组件是ArkTS中用于播放视频的内置组件&#xff0c;它支…

详解磁盘IO、网络IO、零拷贝IO、BIO、NIO、AIO、IO多路复用(select、poll、epoll)

1、什么是I/O 在计算机操作系统中&#xff0c;所谓的I/O就是输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write)&#xff0c;针对不同的对象&#xff0c;I/O模式可以划分为…

Pyqt6的tableWidget填充数据

代码 from PySide6.QtWidgets import QTableWidget QTableWidgetItemdef tableInit(self):self.tableWidgetself.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)module_keyWord readJsonToDict(keyWordFileDir module_name) #读取模块关键字json字典数据s…

UVM 验证方法学之interface学习系列文章(十一)virtual interface 再续篇

一 前言 并非总是可以将被测单元(DUT)视为一个黑盒,即仅监控和驱动DUT的顶层端口信号。这一点在从模块级测试转向更大规模的系统级测试时尤为明显。有时,我们需要了解实现细节以便访问DUT内部的信号。这被称为白盒验证。 Verilog一直提供从其他作用域访问几乎任何层次结构…

Positional Encoding-Transformer

文章目录 1. 创建一个位置编码类2. Python代码 1. 创建一个位置编码类 P E ( p o s , 2 i ) sin ⁡ ( p o s / 1000 0 2 i / d m o d e l ) \begin{equation} PE_{(pos,2i)}\sin(pos/10000^{2i/d_{model}}) \end{equation} PE(pos,2i)​sin(pos/100002i/dmodel​)​​ P E ( …

【时间之外】IT人求职和创业应知【74】-运维机器人

目录 OpenAI最强推理模型o3发布&#xff0c;AGI测试能力暴涨 英伟达宣布收购以色列AI初创企业Runai 汤姆猫首款AI机器人产品明日发售 心勿贪&#xff0c;贵知足。 感谢所有打开这个页面的朋友。人生不如意&#xff0c;开越野车去撒野&#xff0c;会害了自己&#xff0c;不如…