web前端安全除了平常的XSS、CSRF外还存在一种安全问题就是网页劫持。所谓的网页劫持就是非法的网页被修改拦截了。来看下面的具体解释。
什么是网页劫持:
使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容。
分类
:
I、
跳转型劫持
:用户输入地址A,但是跳转到地址B
II、
注入型劫持
:过在正常的网页中注入广告代码(js、iframe等),实现页面弹窗提醒或者底部广告等。
1),注入js类劫持:在正常的页面注入js代码实现劫持。
2),iframe类劫持:将正常网页嵌套iframe或者页面增加iframe。
3),篡改页面类劫持:正常页面出现多余的劫持网页标签,导致页面整体大小发生变化。
防御
:
1. 跳转型劫持,若用单纯靠Web页面进行检测比较困难
2. 注入JS类:
1)
改写document.write方法
2)
遍历页面script标签,给外链JS增加白名单,不在白名单内js外链都上报
3.iframe类:
比较window.self 和window.top 或 比较parent 和 window,同时可增加白名单
获取正确地址
function getCorrectUrl() {
var url ;
if(parent != window) {
try {
url = parent.location.href;
}catch(){
url = document.referrer
}
}
}
4.特殊方式
类似电信捏造在白名单内的js URL和篡改页面内容的,我们用上面提到的方法检测不到这些信息,如果是在APP内,可以做的事情就比较多了,除了上面之外,还可以比较页面的 content-length。
script内核心代码如下:
function
hiJackSniffer
()
var
files
=
$
.
toArray
(
D
.
querySelectorAll
(
'script[src]'
));
var
arr
=[];
for
(
var
i
=
0
,
len
=
files
.
length
;
i
<
len
;
i
++){
files
[
i
].
src
&&
arr
.
push
(
files
[
i
].
src
);
}
if
(
arr
.
length
){
return
sendImg
(
arr
,
1
);
}
arr
=
getParentUrl
();
if
(
arr
&&
arr
.
length
){
//被嵌入iframe
return
sendImg
([
arr
],
2
);
}
if
(
D
.
documentElement
.
outerHTML
.
length
>
4e3
){
var
tmp
={};
var
headjs
=
$
.
toArray
(
D
.
head
.
querySelectorAll
(
'script'
));
var
unknownCode
=[];
if
(
headjs
.
length
){
unknownCode
=
unknownCode
.
concat
(
headjs
.
map
(
function
(
v
){
return
v
.
innerHTML
;
}).
filter
(
function
(
v
){
return
!!
v
;
}));
}
var
body
=
$
.
toArray
(
D
.
body
.
querySelectorAll
(
'*'
));
if
(
body
.
length
>
1
){
unknownCode
=
unknownCode
.
concat
(
body
.
map
(
function
(
v
)
return
v
.
outerHTML
.
split
(
'\n'
).
join
(
''
)
}).
filter
(
function
(
str
){
if
(
/^<script id="b">/
.
test
(
str
)){
return false
;
}
return true
;
}));
}
return
sendImg
(
unknownCode
,
3
);
}
sendImg
([],
0
);
}
漏洞挖掘
:
1)目标的HTTP响应头是否设置好了X-Frame-Options字段
确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击
DENY
:标示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许
sameorigin
: 表示该页面可以在相同域名页面的 frame 中展示。
allow-from uri
:表示该页面可以在指定来源的 frame 中展示。
2)目标是否有javascript的Frame Busting机制
3)尝试用iframe嵌入网站
参考资料: