本篇文章给大家分享的是有关分析webshell以及eval与assert区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一句话木马可以在目标服务器上执行PHP代码,并和客户端(如菜刀,Cknife、冰蝎、蚁剑)进行交互的webshell,俗称小马。根据PHP语法,编写较多代码,并在服务器上执行,完成所有功能的Webshell,俗称大马利用系统逻辑漏洞(如php uaf漏洞),绕过访问控制或执行特殊功能的WebShell上述函数都是可以作为一个简单的webshell执行一些系统的命令,那么与客户端(菜刀,CKnife,蚁剑,冰蝎)完成交互的webshell是什么样的呢?准备一个一句话木马在蚁剑添加手动代理,用Burp抓包分析,如下图所示:将cmd参数解码可以看到将此代码放置在eval函数中执行,返回结果如下图所示:这说明了eval函数将字符串按照php code解析并执行了,所以客户端只要构造好相应的php code,发送给服务器上的webshell,则可以执行并返回。当我们再使用列目录的时候截断,可以看到如下图所示,蚁剑客户端还是将封装好的代码发送给了服务端免费云主机域名的webshell其中od0d1a967133cb=QzovcGhwU3R1ZHkvV1dXLw==,这个od0d1a967133cb key的value值是base64解码之后就是我的web服务的根目录,可以看见,其实用于eval函数执行的代码都是大体相同的,只是更改了try-catch代码块中的逻辑,对于传统的webshell管理工具,连接webshell并且执行相关命令需要使用类似eval,assert等函数将字符串当作php代码执行的性质,当连接成功之后,就可以利用当前web容器可解析的语言执行代码,并完成相关的操作。这里总结一下,脚本要将字符串(或文件流)当做PHP代码来执行,主要会使用到以下函数:eval
:PHP 4,PHP 5,PHP 7+ 均可用,接收一个参数,将字符串作为PHP代码执行assert
: PHP 4,PHP5,PHP7.2以下均可使用,一般接收一个参数,PHP5.4.8版本后可以接受两个参数正则匹配类:prge_replace
,mb_erge_replace
,prge_filter
等文件包含类:include
,include_once
,require
,require_once
,file_get_contents
等话说做webshell检测的时候,因为要绕过HIDS,常规的一句话木马,大马都基本上会被拦截,不得不去找了一些php提供的”安全函数“(ps,这里我所指的“安全函数”是php的内置的回调函数,因为本身这些方法都是php自提供的,所以还是一定程度上可以绕过的)。开始使用的时候发现eval不能作为回调函数的后门?而是要用assert函数来代替eval?意思就是当我们构造一个双变量马的时候,不能使用1=eval&2=xxx来使用,而只能使1=assert&2=command做为密码连接,或者1=system&2=whoami来执行命令好奇心害死猫查看官方文档,他告知我如下:eval是一个语言构造器,而不是一个函数,不能被可变函数调用;然后我又去查询什么是可变函数,官方的定义如下:PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途,可变函数不能用于例如 echo,print,unset(),isset(),empty(),include,require 以及类似的语言结构。需要使用自己的包装函数来将这些结构用作可变函数。到这里其实官方已经说得很清楚了,但是我还是想一探究竟,深入浅出安装vld扩展(这里提示,安装扩展在linux下,且php是自编译的,安装扩展是最简单的)使用vld扩展,可以清楚的看到php5
,php7
assert
函数,eval
函数在opcode
中执行过程关于php解释型语言以及opcode的一些解释php是解释型语言,所谓“解释型语言”就是指用这种语言写的程序不会被直接编译为本地机器语言(native machine language),而是会被编译为一种中间形式(代码),很显然这种中间形式不可能直接在CPU上执行(因为CPU只能执行本地机器指令),但是这种中间形式可以在使用本地机器指令(如今大多是使用C语言)编写的软件上执行。PHP使用主要虚拟机(Zend虚拟机,译注:HHVM也是一种执行PHP代码的虚拟机,但很显然Zend虚拟机还是目前的主流)可以分为两大部分,它们是紧密相连的:编译栈(compile stack):识别PHP语言指令,把它们转换为中间形式执行栈(execution stack):获取中间形式的代码指令并在引擎上执行,引擎是用C或者汇编编写成的OPCodeZend VM的一个OPCode对应虚拟机的一个底层操作。Zend虚拟机有很多OPCode:它们可以做很多事情。随着PHP的发展,也引入了越来越多的OPCode,这都是源于PHP可以做越来越多的事情。可以在PHP的源代码文件Zend/zend_vm_opcodes.h中看到所有的OPCode。Zend VM的每个OPCode的工作方式都完全相同:它们都有一个handler(译注:在Zend VM中,handler是一个函数指针,它指向OPCode对应的处理函数的地址,这个处理函数就是用于实现OPCode具体操作的),这是一个C函数,这个函数就包含了执行这个OPCode时会运行的代码(例如“add”,它就会执行一个基本的加法运算)。每个handler都可以使用0、1或者2个操作数:op1和op2,这个函数运行后,它会后返回一个结果,有时也会返回一段信息(extended_value)如下图所示,可以看到eval
是INCLUDE_OR_EVAL
去处理,而assert
是用DO_FCALL
去处理在php源文件Zend/zend_vm_opcodes.h中看到所有的OPCode,其中在Zend/zend_vm_def.h文件中可以看见DO_FCALL这个OPCode的具体操作在这里说一下第一个判断条件,因为确实不懂,在网上找了与一下相关的解释然后如果C原生态数组里没有这个函数,就会进入else if中,进行一个哈希查找,并把函数指针放入 EX(function_state).function,最后再调用该函数到这里就可以看到为什么eval参数中必须是php代码,而不是命令,当在eval中的参数为命令的时候,就会出现eval() 'd code
的错误,当参数为php代码的时候,就会直接编译执行参数。从OPCode中可以看到,eval就是Zend函数,assert是宏编写的,最后在调用上是不同的,如下图所示,eval就不是宏定义的在php7+中,assert断言也已经成为语言解释器,再也不是函数了,所以在php7中使用assert作为回调后门不能成功的原因就在于此给大家留点彩蛋吧哈哈哈,我实在太菜了以上就是分析webshell以及eval与assert区别是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注云编程开发博客行业资讯频道。
1、Open/NONE 完全不认证也不加密,任何人都可以连到无线基地台使用网络。 2.WEP (Wired Equivalent Privacy) 有线等效加密 最基本的加密技术,手机用户、笔记型计算机与无线网络的Access Point(网络金钥AP)…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。