PHP漏洞全解(七)-Session劫持

黄舟
发布: 2023-03-03 20:58:01
原创
1869 人浏览过

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

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

php处理session的应用架构

72.jpg

会话劫持

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

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

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

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

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

会话劫持的攻击步骤

73.jpg

实例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

//login.php        

             

             

session_start();               

if (isset($_POST["login"]))                    

{              

$link = mysql_connect("localhost", "root", "root")                         

or die("无法建立MySQL数据库连接:" . mysql_error());                             

mysql_select_db("cms") or die("无法选择MySQL数据库");                                 

if (!get_magic_quotes_gpc())                                       

{                                          

$query = "select * from member where username=’" . addslashes($_POST["username"]) .                                                

"’ and password=’" . addslashes($_POST["password"]) . "’";                                                 

}                                                      

else                                                           

{                                                              

$query = "select * from member where username=’" . $_POST["username"] .                                                                    

"’ and password=’" . $_POST["password"] . "’";                                                                     

}                                                                          

$result = mysql_query($query)  

     

or die("执行MySQL查询语句失败:" . mysql_error());                                                                                  

$match_count = mysql_num_rows($result);                                                                                        

if ($match_count)                                                                                          

{                                      

$_SESSION["book"] = 1;                                                                                                         

mysql_close($link);                                                                                                    

header("Location: http://localhost/index.php?user=" . $_POST["username"]);                                                                                                                         

}  

…..

    // 打开Session                                                                                                                                               

         

             

    访客的 Session ID 是:echo session_id(); ?>                                                                                                                                                      

                                                                                             

                                                                                     

                                                                     

                                                             

                                                                                     

                                                            

登录后复制

74.jpg

登录以后显示

75.jpg

开始攻击




//attack.php 
php 
// 打开Session 
session_start(); 
echo "目标用户的Session ID是:" . session_id() . "
"; 
echo "目标用户的username是:" . $_SESSION["username"] . "
"; 
echo "目标用户的password是:" . $_SESSION["password"] . "
"; 
// 将book的数量设置为2000 
$_SESSION["book"] = 2000; 
?> 


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

76.jpg

session固定攻击

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

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

77.jpg


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


78.jpg

防范方法

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程序自己调用的。

 以上就是PHP漏洞全解(七)-Session劫持的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!