zoukankan      html  css  js  c++  java
  • PHP漏洞全解(七)-Session劫持

    本文主要介绍针对PHP网站Session劫持。session劫持是一种比较复杂的攻击方法。大部分互联网上的电脑多存在被攻击的危险。这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能。

    服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用 户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的http表头内包含session id 的值。服务器使用http表头内的session id来识别时哪个用户提交的请求。

    session保存的是每个用户的个人数据,一般的web应用程序会使用session来保存通过验证的用户账号和密码。在转换不同的网页时,如果 需要验证用户身份,就是用session内所保存的账号和密码来比较。session的生命周期从用户连上服务器后开始,在用户关掉浏览器或是注销时用户 session_destroy函数删除session数据时结束。如果用户在20分钟内没有使用计算机的动作,session也会自动结束。

    php处理session的应用架构

    会话劫持

    会话劫持是指攻击者利用各种手段来获取目标用户的session id。一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。

    攻击者获取目标用户session id的方法:

    1)暴力破解:尝试各种session id,直到破解为止。

    2)计算:如果session id使用非随机的方式产生,那么就有可能计算出来

    3)窃取:使用网络截获,xss攻击等方法获得

    会话劫持的攻击步骤

    实例

    1. //login.php 
    2. session_start(); 
    3. if (isset($_POST["login"])) 
    4. $link = mysql_connect("localhost", "root", "root") 
    5. or die("无法建立MySQL数据库连接:" . mysql_error()); 
    6. mysql_select_db("cms") or die("无法选择MySQL数据库"); 
    7. if (!get_magic_quotes_gpc()) 
    8. $query = "select * from member where username=’" . addslashes($_POST["username"]) . 
    9. "’ and password=’" . addslashes($_POST["password"]) . "’"; 
    10. else 
    11. $query = "select * from member where username=’" . $_POST["username"] . 
    12. "’ and password=’" . $_POST["password"] . "’"; 
    13. $result = mysql_query($query) 
    14. or die("执行MySQL查询语句失败:" . mysql_error()); 
    15. $match_count = mysql_num_rows($result); 
    16. if ($match_count) 
    17. $_SESSION["username"] = $_POST["username"]; 
    18. $_SESSION["password"] = $_POST["password"]; 
    19. $_SESSION["book"] = 1; 
    20. mysql_free_result($result); 
    21. mysql_close($link); 
    22. header("Location: http://localhost/index.php?user=" . 
    23. $_POST["username"]); 

    …..

    1. //index.php 
    2. // 打开Session 
    3. session_start(); 
    4. 访客的 Session ID 是:echo session_id(); ?> 
    5.  
    6. 访客:echo htmlspecialchars($_GET["user"], ENT_QUOTES); ?> 
    7.  
    8. book商品的数量:echo htmlspecialchars($_SESSION["book"], ENT_QUOTES); ?> 
    9. 如果登录成功,使用 
    10. $_SESSION["username"] 保存账号 
    11. $_SESSION["password"] 保存密码 
    12. #_SESSION["book"] 保存购买商品数目 

    登录以后显示

    开始攻击

    1. //attack.php 
    2. php 
    3. // 打开Session 
    4. session_start(); 
    5. echo "目标用户的Session ID是:" . session_id() . "<br />"; 
    6. echo "目标用户的username是:" . $_SESSION["username"] . "<br />"; 
    7. echo "目标用户的password是:" . $_SESSION["password"] . "<br />"; 
    8. // 将book的数量设置为2000 
    9. $_SESSION["book"] = 2000; 
    10. ?> 

    提交 http://localhost/attack.php?PHPSESSID=5a6kqe7cufhstuhcmhgr9nsg45 此ID为获取到的客户session id,刷新客户页面以后

    客户购买的商品变成了2000

    session固定攻击

    黑客可以使用把session id发给用户的方式,来完成攻击

    http://localhost/index.php?user=dodo&PHPSESSID=1234 把此链接发送给dodo这个用户显示

    然后攻击者再访问 http://localhost/attack.php?PHPSESSID=1234 后,客户页面刷新,发现

    商品数量已经成了2000

    防范方法

    1)定期更改session id

    函数 bool session_regenerate_id([bool delete_old_session])

    delete_old_session为true,则删除旧的session文件;为false,则保留旧的session,默认false,可选

    在index.php开头加上

    session_start();

    session_regenerate_id(TRUE);

    ……

    这样每次从新加载都会产生一个新的session id

    2)更改session的名称

    session的默认名称是PHPSESSID,此变量会保存在cookie中,如果黑客不抓包分析,就不能猜到这个名称,阻挡部分攻击

    session_start();

    session_name("mysessionid");

    ……

    3)关闭透明化session id

    透明化session id指当浏览器中的http请求没有使用cookies来制定session id时,sessioin id使用链接来传递;打开php.ini,编辑

    session.use_trans_sid = 0

    代码中

    int_set("session.use_trans_sid", 0);

    session_start();

    ……

    4)只从cookie检查session id

    session.use_cookies = 1 表示使用cookies存放session id

    session.use_only_cookies = 1 表示只使用cookies存放session id,这可以避免session固定攻击

    代码中

    int_set("session.use_cookies", 1);

    int_set("session.use_only_cookies", 1); p>

    5)使用URL传递隐藏参数

    session_start();

    $seid = md5(uniqid(rand()), TRUE));

    $_SESSION["seid"] = $seid;

    攻击者虽然能获取session数据,但是无法得知$seid的值,只要检查seid的值,就可以确认当前页面是否是web程序自己调用的。

  • 相关阅读:
    进程和线程的概述
    注意两个词汇的区别:并行和并发
    WebRTC MCU( Multipoint Conferencing Unit)服务器调研
    (译)WebRTC实战: STUN, TURN, Signaling
    关于图数据库查询语言:Cypher
    Neo4j安装后的密码修改
    XYC2016上半年工作笔记整理
    WebRTC技术调研
    在Django中使用Neo4j
    传统企业做互联网的困局
  • 原文地址:https://www.cnblogs.com/milantgh/p/3839987.html
Copyright © 2011-2022 走看看