在web服务器上传webshell是网站攻击者控制web服务器进一步渗透的常用方法。检测和防御webshell是网站安全防御和减少网站损失的重要方法。目前,PHPwebshell的检测技术主要分为静态特征检测技术和动态特征检测技术两类。静态特征检测是指无需代码运行,根据文件中是否存在常见的恶意字符串特征,结合文件的信息熵等特征进行检测;动态特征检测是指通过分析WAF中的网络流量来检测和防御webshell。这两种webshell检测方法很难有效检测混淆变形或加密的webshell。
鉴于目前检测PHPwebshell的方法不足,本文分析了PHP代码运行过程和PHP核心中各种webshell变形的特点,提出了基于PHP扩展的webshell检测和防御方法。该方法通过监控PHP扩展中PHP代码的编译和运行,结合外部输入变量的标记跟踪和黑白列表机制,可以实时存在。
检测webshell并阻止webshell的有效运行。这种方法不仅可以检测webshell,还可以防止webshell的运行。
PHP原理
在PHP生命周期中,PHP在web容器上的运行方式主要有三种:模块加载运行;CGI运行;FastCGI运行。无论采用哪种方式运行,PHP程序的生命周期都需要经过模块初始化、请求初始化、代码执行、请求结束和模块结束。不同运行方式的区别在于生命周期各阶段执行的频率和次数。
执行PHP代码的过程。
PHP是一种解释性语言,代码需要翻译成中间字节码,然后由ZEND引擎进行解析。PHP代码的执行过程主要包括四个步骤:词法分析、语法分析、代码编译、opcodes(中间字节码)执行。词法分析是指将PHP代码转换成语言片段,语法分析是将语言片段转换成简单而有意义的表达式。代码编译是指将表达式编译成opcodes,opcodes执行是指zend虚拟机执行opcodes并输出结果。
内核hookPHP机制。
hookPHP函数是指在PHP内核中通过函数重写或修改编译函数来改变对PHP函数运行的监控,从而获得函数运行时的参数。PHP的函数有两种,一种是Zend提供的函数,比如eval;另一种是PHP_FUNCTION宏编写的函数,比如shell_exec。在这些函数中,Zend提供的函数可以通过修改编译函数zend_compile_string来进行HOOK;PHP_FUNCTION宏编写的函数可以通过操作函数表来重写。PHP内核除了这两种方法外,还提供了通用的HOOK方法,即使用zend_set_user_opcode_handler修改中间字节码对应的处理函数。