之前在Webshell查杀的新思路中留了一个坑🙄️,当时没有找到具体找到全部变量的方法,后来通过学习找到了个打印全部量的方法,并再次学习了下PHP webshell绕过WAF的方法,以此来验证下此方法是否合理。
如有错误,还请指出,不胜感激! 🐢拜
在那篇文章中我突然想到一种检测webshell的方法,就是首先获取到当前文件中的所有变量(不明白的可以先去看下之前的文章),然后再根据正则库进行静态检测。
自认为这种方法虽然会检测不完全(每个检测机制都不能保障全部有效),但是感觉非常简单、实用,也没那么多高深的道理。
为了验证该检测机制,首先了解下目前PHP webshell绕过WAF的方法。
常见绕过WAF的PHP webshell
字符串变形
大小写、编码、截取、替换、特殊字符拼接、null、回车、换行、特殊字符串干扰
|
|
自写函数
利用assert()
|
|
回调函数
|
|
类
利用魔术方法、析构函数__destruct()
,__construct()
|
|
利用外部文件
利用curl
, fsockopen
等发起网络请求再结合file_get_contents
|
|
无字符特征马
编码、异或、自增
|
|
特殊请求头
利用getallheaders()
|
|
全局变量
利用getenv()
,arrag_flip()
,get_defined_vars()
,session_id()
|
|
PHP混淆加解密
以phpjiami为例
就是将函数名、变量名全部变成”乱码”,且改动任意一个地方,都将导致文件不能运行。具体可访问:https://www.phpjiami.com/
PHP webshell检测方法
目前我所了解的webshell检测方式有:
- 机器学习检测webshell:比如混淆度、最长单词、重合指数、特征、压缩比等
- 动态检测(沙箱)
- 基于流量模式检测webshell:agent
- 逆向算法+静态匹配检测webshell:比如D盾webshell查杀
- 根据文件入度出度来检测
实例展示
这里以PHPjiami的webshell为例,其中2.php
即为phpjiama的木马
可以明显看到明显的webshell规则了,这样再用静态规则、正则等即可轻松检测到。
简单检测思路
检测思路:
文件上传->文件包含->获取所有文件中的变量到临时文件中->静态规则匹配临时文件->返回匹配结果
|
|
conf中包含的是诸如下列的静态检测规则