服务器日志是网站最诚实的体检报告。当你的网站被植入黑链、挂马或者做了隐形跳转,前端页面往往看不出任何异常,因为攻击者会针对搜索引擎爬虫和真实用户返回完全不同的内容。这种手法叫“斗篷”(Cloaking),而识破它的唯一铁证就藏在日志里。
很多运营者习惯只看流量报表,却从不碰原始日志,这等于把家门钥匙插在锁孔里还觉得挺安全。日志不会撒谎,每一个异常的POST请求、奇怪的User-Agent、非正常的响应码,都是攻击者留下的脚印。下面直接讲从日志里揪出SEO被黑迹象的具体方法,不讲空泛理论。
第一步:先把日志字段看全,别只看访问路径拿到一份原始日志,至少要关注这几个字段:客户端IP、请求时间、请求方法、请求URL、HTTP状态码、返回字节大小、Referer来源、User-Agent。很多被黑迹象就藏在组合信息里。比如一个正常页面通常返回200状态码,字节大小在几万到十几万之间波动,如果某天同一URL返回的字节数突然暴增到几百KB,或者骤降到只有几KB,这就是异常信号。字节暴增可能是页面底部被塞了大量隐藏链接和垃圾关键词,字节骤降可能是页面被做了302跳转,爬虫拿到的是几乎为空的响应体。
具体操作上,先用命令行把每个URL的日均返回字节数算出来,建立一条基线。以Apache/Nginx日志为例,假设日志格式是通用的combined格式,用awk提取请求URL和返回字节数:
awk '{print $7, $10}' access.log | sort | uniq -c | sort -rn | head -50
这条命令会列出访问量最高的50个URL及其返回字节数分布。如果发现某个核心页面出现了两种截然不同的字节大小,且其中一种远小于正常值,就要立刻警惕。再结合User-Agent交叉过滤,看小字节响应是否专门针对爬虫。
精准过滤爬虫流量,识破“斗篷”伪装攻击者做SEO黑帽最常用的手段就是判断User-Agent,遇到百度蜘蛛、搜狗蜘蛛或者其他搜索引擎爬虫时,返回一堆菠菜、色情、博彩类关键词和链接;遇到真实用户浏览器则正常显示,以此躲避站长检查。所以排查日志时,必须单独把爬虫流量拉出来看。
用grep过滤主流爬虫的UA标识,比如百度蜘蛛包含“Baiduspider”,搜狗包含“Sogou”,360包含“360Spider”,必应包含“bingbot”。命令示例:
grep -i 'Baiduspider\|Sogou\|360Spider\|bingbot' access.log > spider.log
拿到爬虫专属日志后,重点看三件事。第一,爬虫访问的URL里有没有你根本不存在的目录或文件,比如突然冒出大量“/uploads/2024/12/cheap-nike-shoes.html”这种垃圾路径,说明网站已经被生成了大量静态垃圾页面。第二,爬虫请求返回的状态码,正常应该是200,如果大量出现301或302跳转,而且跳转目标指向外部域名,那就是被挂了隐形跳转。第三,查看爬虫请求返回的字节大小,如果某个正常文章页对普通用户返回80KB,对百度蜘蛛却返回200KB,多出来的120KB基本可以确定是注入内容。
抓取异常POST请求,定位后门上传点SEO被黑不只是内容被篡改,更致命的是服务器上被留下了后门文件。攻击者通过后门可以随时批量生成垃圾页面、修改.htaccess跳转规则、甚至直接篡改数据库。而这些后门的上传和激活,在日志里会留下明显的POST请求痕迹。
正常网站绝大多数请求都是GET类型,POST一般只出现在登录、评论提交、搜索框等少数功能点。如果日志里出现对静态资源或图片目录的POST请求,几乎可以断定是攻击行为。用下面命令快速筛选所有POST请求:
grep '"POST' access.log | awk '{print $1, $4, $7, $9}' | sort | uniq -c | sort -rn
这条命令会统计每个POST请求的来源IP、时间、URL和状态码。重点关注POST目标为.php、.asp、.aspx等可执行脚本的请求,尤其是那些状态码返回200或201(创建成功)的。如果发现某个IP在极短时间内向一个奇怪的文件名(比如“config.bak.php”或“up.php”)连续POST数据,并且返回201,那这个文件百分之百是刚被上传的webshell。
另外还要留意PUT、DELETE这类HTTP方法,绝大多数Web服务器默认禁用它们,如果日志里出现了,说明服务器配置可能被篡改,或者攻击者已经拿到了较高权限。
检查Referer字段,发现黑链流量入口黑链的本质是攻击者在你的网站上植入指向他们客户网站的链接,用来传递权重。但黑链要发挥作用,必须有爬虫来爬取这些链接,而且攻击者自己也会点击这些链接来检验效果。这些行为都会在Referer字段里留下痕迹。
正常Referer应该来自搜索引擎、社交媒体或者友链站点。如果某天日志里突然出现大量Referer来自陌生论坛、色情网站、博彩导航站,甚至是完全乱码的域名,说明你的页面可能已经被这些站点当成了外链资源。更隐蔽的情况是,Referer显示来自你自己的域名,但引荐路径是一个你从未创建过的URL,这通常意味着攻击者在你的站点内部生成了大量互相链接的垃圾页面群,也就是“站内群”黑帽手法。
用awk提取Referer并统计出现次数:
awk -F'"' '{print $4}' access.log | awk '{print $3}' | sort | uniq -c | sort -rn | head -30
逐条审视这些来源域名,凡是陌生的、内容低质的、与你行业无关的,都需要点进去看看对方页面是否真的挂了你的链接。如果确认是黑链,不仅要清除自己网站上的注入代码,还要考虑向搜索引擎提交拒绝链接申请,避免被算法连带惩罚。
分析响应码分布,发现被劫持的404和301很多SEO被黑案例中,攻击者会劫持网站的404错误页面或者301重定向规则。正常404应该是返回“页面未找到”并给出404状态码,但被篡改后,某些不存在的URL会返回200状态码,并展示一堆垃圾内容,让搜索引擎误以为这些页面真实存在并收录。更恶劣的是,攻击者会修改.htaccess或Nginx配置,让整站对所有爬虫返回301跳转到他们的目标站。
排查方法很简单,统计日志里所有状态码的分布:
awk '{print $9}' access.log | sort | uniq -c | sort -rn
如果301/302的数量异常高,就要进一步筛选出这些跳转的目标地址。在日志里,跳转目标通常记录在响应头或者下一个请求的Referer中,但更直接的方法是手动模拟爬虫请求可疑URL,用curl命令带上蜘蛛UA去访问:
curl -I -H "User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" https://你的网站/可疑路径
观察返回的HTTP头,如果Location字段指向外部域名,那就是被挂了301劫持。这种攻击极其隐蔽,因为真实用户用浏览器访问完全正常,只有爬虫被重定向,不查日志根本发现不了。
建立时间维度的对比分析,抓住攻击时间点单看一天的日志容易遗漏缓慢渗透的攻击。SEO黑帽攻击往往不是一次性完成,而是分阶段:先上传后门,隔几天再批量生成页面,再过几天修改robots.txt引导爬虫来抓取。所以必须把日志按天甚至按小时切片对比。
用命令统计每天的总请求数、独立IP数、新出现URL数量:
awk '{print $4}' access.log | cut -d: -f1 | sort | uniq -c
如果某一天新出现的URL数量突然暴增,比如平时每天新增50个URL,某天突然新增了2000个,而且这些URL的命名规则高度相似(比如都是“/keyword1-keyword2-city.html”这种长尾词组合),那就是批量生成垃圾页面的铁证。再结合这些URL首次出现的时间点,反查那个时间段前后所有POST请求和文件修改记录,就能定位到攻击者使用的后门脚本和上传漏洞。
检查User-Agent的异常聚集,识别模拟爬虫真正的搜索引擎爬虫有固定的IP段和规范的抓取频率。攻击者为了快速让垃圾页面被收录,往往会用自己写的脚本模拟爬虫UA,向搜索引擎提交抓取请求,或者直接用采集工具疯狂抓取自己的垃圾页面制造“热度”。这些假爬虫的行为模式和真实爬虫完全不同。
真实百度蜘蛛的抓取是有节制的,同一个IP段不会在1秒内请求几十次。而假爬虫往往从一个或几个IP发出超高频率请求,User-Agent虽然写着Baiduspider,但IP归属地却是某云服务商的VPS。用下面命令统计每个自称爬虫的IP请求频率:
grep 'Baiduspider' access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
如果某个IP一天内发起了数万次请求,而其他蜘蛛IP只有几百次,这个IP基本可以判定为伪造。进一步用IP归属地查询工具确认,如果不是百度官方公布的蜘蛛IP段,直接封禁即可。同时检查这个假蜘蛛都抓取了哪些URL,这些URL大概率就是攻击者想要推送给搜索引擎的垃圾页面,顺藤摸瓜全部清理掉。
不要忽略robots.txt和sitemap的异常访问日志里对robots.txt和sitemap.xml的访问记录也很有价值。攻击者上传垃圾页面后,往往会修改robots.txt,故意放行爬虫去抓取垃圾目录,或者屏蔽正常页面让搜索引擎只看到他们想让你看到的内容。如果日志显示某个IP在凌晨时段反复请求robots.txt,并且请求后紧接着就有一批新URL被爬虫抓取,那这个IP很可能就是攻击者在测试规则是否生效。
同样,如果sitemap.xml里突然多出了大量你不认识的URL,而这些URL在日志里显示是由某个非官方IP提交生成的,说明后台或文件上传接口已被攻破。定期用diff命令对比sitemap文件的版本变化,结合日志里对sitemap.xml的PUT或POST请求记录,能快速发现篡改行为。
把日志分析和文件系统监控联动起来日志只能告诉你发生了什么,要根治问题还得回到服务器文件层面。当你从日志里定位到异常时间点和可疑脚本路径后,用find命令查找那个时间段前后被修改过的文件:
find /网站根目录 -type f -newermt "2024-12-20 03:00:00" ! -newermt "2024-12-20 04:00:00" -ls
这个命令会列出在凌晨3点到4点之间被修改的所有文件。如果日志显示那个时间段有可疑POST请求,而文件系统又恰好有.php文件被更新,那这个文件就是后门或者已经被污染。重点检查最近被修改的.htaccess、index.php、wp-config.php、以及uploads目录下的可执行文件。很多攻击者喜欢把后门伪装成图片,用双扩展名如“logo.jpg.php”来绕过上传限制,这类文件在日志里往往表现为对.jpg路径的POST请求,非常具有欺骗性。
日志分析不是一次性工作,把它写成定时脚本,每天自动跑一遍关键指标:新URL数量、爬虫返回字节异常、POST请求激增、陌生Referer来源。一旦指标偏离基线就自动告警,这样才能在攻击发生的几小时内发现并止损,而不是等搜索引擎发了惩罚通知才后知后觉。SEO安全的核心不是亡羊补牢,而是让日志成为你的全天候哨兵。
