服务器被挂暗链,页面底部或源代码里出现了大量赌博、色情的关键词和链接,但首页文件翻遍了却找不到任何被修改的痕迹。这种情况十有八九是模板注入点被利用了。攻击者并没有直接篡改你的静态HTML文件,而是利用了程序动态渲染模板时的漏洞,把恶意代码写进了数据库或者配置文件里,再通过正常的模板渲染机制输出到前端。要快速定位注入点,不能只盯着文件修改时间看,得顺着数据的流向往回追。
从页面异常渲染区域反推模板路径打开被挂暗链的页面,按F12打开开发者工具,在元素审查模式下找到暗链所在的DOM节点。注意看这个节点在页面结构中的位置,是出现在文章正文里、侧边栏、底部版权区还是某些特定的内容块。接着,右键查看网页源代码,对比暗链在源代码中的位置与模板标签的对应关系。很多CMS的模板文件都有明显的注释或者特定的class命名,比如WordPress的主题通常会在侧边栏外包一层class="widget"的容器。根据这个DOM结构特征,去服务器上的主题目录里搜索对应的模板片段。用grep命令直接递归搜索关键词,例如在WordPress站点根目录下执行:
grep -r "widget" wp-content/themes/你的主题名/
这会列出所有包含该关键词的模板文件。但注意,攻击者往往不会直接修改这些PHP文件,因为文件修改时间会暴露。他们更倾向于通过后台的主题设置功能、自定义CSS模块或者某些插件的数据存储接口,把恶意代码写入数据库的options表或post_meta表。所以当你发现模板文件本身是干净的,但页面却渲染出了异常内容时,注入点很可能在数据库里。
追踪数据库中的动态配置项绝大多数CMS都提供了后台自定义头部、尾部代码的功能,这些功能本质上是把用户输入的字符串直接或者经过简单过滤后存入数据库,然后在模板渲染时用echo或者print输出。攻击者一旦获得管理员权限,会优先利用这些现成的入口。以WordPress为例,检查wp_options表中option_name为“theme_mods_主题名”的记录,这里面存储了主题的各类自定义设置,包括自定义CSS、页脚脚本等。用phpMyAdmin或者MySQL命令行执行:
SELECT * FROM wp_options WHERE option_name LIKE '%theme_mods_%';
展开option_value字段,仔细查看里面是否包含eval、base64_decode、strrev或者直接就是完整的恶意链接代码。攻击者经常使用字符串反转或者base64编码来绕过肉眼检查,所以看到类似“edoced_46esab”或者一长串无意义字符时,就要高度警惕。同样,检查所有插件的配置项,很多SEO插件、页脚编辑插件、自定义代码片段插件都会在数据库里单独存储可执行的PHP或HTML代码。用以下SQL可以批量搜索可疑内容:
SELECT * FROM wp_options WHERE option_value LIKE '%