网站内容劫持 广告(页面劫持使用HTTP请求请求网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文)
优采云 发布时间: 2021-12-25 23:01网站内容劫持 广告(页面劫持使用HTTP请求请求网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文)
前端页面劫持与反劫持页面劫持
当使用 HTTP 请求请求网站页面时,网络运营商会将精心设计的网络数据消息插入到正常的数据流中,让客户端(通常是浏览器)显示“错误”的数据,通常会弹出一些视窗。促销广告或网站内容的直接展示。
常见劫持方式: 跳转劫持:
用户输入地址A,但跳转到地址B
为了获取流量,一些需要流量合作的电商或者百度等网站会有自己的联盟系统,通过给予一定的奖励来获得分流,比如:百度或者电商会有渠道共享。
为了区分哪些是被第三方转用的,通常会在URL地址中添加source和from等参数,或者在进入页面之前使用“中间页面”cookie。
这样,当用户输入一个普通的URL时,劫持者就会将他重定向到带有共享或频道号的“中间页面”或在网络层带有频道号的页面。这样,劫持者就会在用户下单或搜索时获得“佣金”。
DNS劫持:在DNS服务器中,改变域名对应的IP地址。您解析的域名对应的IP在劫持前后不同;
中间人劫持发生在第三步:因为恶意攻击者控制了你的网关,当你发送搜索到的IP请求时,中间人拦截并返回给你的IP恶意网站,你的浏览器这个IP会被认为是你要访问的域名的IP!!该IP是攻击者模仿目标网站前端接口构建的接口。打。
注入劫持:
与跳转式劫持不同,是指在普通网页中注入广告代码(js、iframe等),实现页面弹出提醒或底部广告等,分为以下三个子类:
1.注入js类劫持:
劫持是通过将被劫持的js代码注入普通页面来实现的;注入js的方法可以是通过document.write或者直接改html代码片段等,给页面添加外部js。有些运营商为了增加检测难度,会编造一个no Existing URL地址,使其不被过滤或检测。
案例一:运营商会使用自己识别的ip或者域名作为js URL,只能在浙江移动网下解析,ip也一样
案例2:运营商很聪明,知道页面可以检测所有外链js域名,例如:我只允许/static外链js,其他js会被记录和反馈;为了不被发现,我遇到了一个案例电信会议访问了一个不存在的地址,比如:/static/abc.js,这个地址直接从运营商处返回被劫持的js代码,请求不会发送到百度的服务器。
2.iframe 劫持:
将普通页面嵌入到 iframe 中或在页面中添加 iframe 页面;通常,SEO 是通过流行的 关键词 完成的。打开网站时,没有广告等实际内容,而是页面嵌入了另一个网站。我们如果确认它不是嵌入的,则需要对其进行测试。
3.篡改页面劫持:
过多的劫持网页标签出现在正常页面上,导致页面整体大小发生变化;
HTTP劫持:识别HTTP连接。天上的许多连接中有许多种协议。第一步,在TCP连接中找出应用层使用HTTP协议的连接,并进行识别;篡改HTTP响应体,通过网关获取数据包。进行内容篡改;抢先返回数据包,被篡改的数据包会抢占正常站点返回的数据包到达用户侧,使得后续的正常数据包到达后直接丢弃。
劫持检测方法1、跳转劫持
仅依靠网页更难检测跳转型劫持。当时我们在手机百度(Handbai)中进行了检测,所以比较简单。用户输入搜索词(查询),打开百度的页面URL,然后页面加载时,APP比较访问的URL是否是之前访问过的,如果不一致,记录并报告.
2、注入js页面
MutationObserver 是 HTML5 的新 API。它非常强大,并且为开发人员提供了当 DOM 树在一定范围内发生变化时做出适当反应的能力。即MutationObserver在观察时发现新元素不会立即回调,而是将一个时间段内出现的所有元素一起传输。所以我们需要在回调中进行批处理。此外,当指定的 DOM 节点(目标节点)发生变化时,会调用回调。调用时,观察者对象会向函数传递两个参数。第一个参数是一个收录
多个 MutationRecord 对象的数组,第二个参数是观察者对象本身。
var observer = new MutationObserver(function (mutations, observer) {
mutations.forEach(function(mutation) {
console.log(mutation);
});
});
var article = document.querySelector('article');
var options = {
'childList': true,
'attributes':true
} ;
observer.observe(article, options);
// 保存原有接口
var old_setAttribute = Element.prototype.setAttribute;
// 重写 setAttribute 接口
Element.prototype.setAttribute = function(name, value) {
// 匹配到 类型
if (this.tagName == 'SCRIPT' && /^src$/i.test(name)) {
// 白名单匹配
if (!whileListMatch(whiteList, value)) {
console.log('拦截可疑模块:', value);
return;
}
}
// 调用原始接口
old_setAttribute.apply(this, arguments);
};
// 建立白名单
var whiteList = [
'www.yy.com',
'res.cont.yy.com'
];
/**
* [白名单匹配]
* @param {[Array]} whileList [白名单]
* @param {[String]} value [需要验证的字符串]
* @return {[Boolean]} [false -- 验证不通过,true -- 验证通过]
*/
function whileListMatch(whileList, value) {
var length = whileList.length,
for (i = 0; i < length; i++) {
// 建立白名单正则
var reg = new RegExp(whiteList[i], 'i');
// 存在白名单中,放行
if (reg.test(value)) {
return true;
}
}
return false;
}
3、检测是否被iframe嵌套
window.self:返回对当前窗口对象的引用。
: 返回窗口系统中最顶层窗口的引用。
if (self != top) {
// 我们的正常页面
var url = location.href;
// 父级页面重定向
top.location = url;
}
4、特殊方法
前面提到过,类似于电信在白名单中编造js URL,篡改页面内容,我们无法通过上述方法检测到这些信息。如果是在APP里面,除了上面的,还有更多的事情可以做。此外,您还可以比较页面的内容长度。当时,手白的做法是:
当用户开始输入查询时,APP访问一个空白页面,页面中只有html、title、head、body、script,script标签中的主要代码是嗅探是否被劫持。
因为一般劫持不会针对某个页面,而是针对整个网站域名,我们的空白页面也会被劫持。
劫持防御
最简单最粗鲁的就是直接去HTTPS,一劳永逸。然后是证据采集
、诉讼或警告渠道骗子。此外,我们可以继续使用空白页面进行劫持检测。
在没有全量https的时期(毕竟整个站点https涉及的工作量不小),当用空白页面嗅探当前网络环境存在劫持风险时,在这个启动期间调用客户端接口告诉客户端使用https,这样不仅可以降低被劫持的风险,还可以通过这个页面的小流量测试https数据。日后全额https后,还可以通过空白页面打开旧版APP全额。