会话固定攻击 - yxcms session固定漏洞

会话固定攻击

Session fixation attack(会话固定攻击)是利用服务器的session不变机制,借他人之手获得认证和授权,然后冒充他人。

session固定漏洞最为核心的其实应该是程序使用session作为认证方式,但又放开了session_id的设置,并且设置session_id在session_starts()执行之后,session_id以key/value的形式指定了后端使用哪个session。

1.Attacker先打开一个网站http://www.baidu.com,然后服务器会回复他一个session id。比如SID=abcdefg。Attacker把这个id记下了。
2.Attacker给UserA发送一个电子邮件,他假装是什么推销什么,诱导UserA点击链接http://unsafe/?SID=abcdefg,SID后面是Attacker自己的session id。
3.UserA被吸引了,点击了http://unsafe/?SID=abcdefg,像往常一样,输入了自己的帐号和口令从而登录到银行网站。
4.因为服务器的session id不改变,现在Attacker点击http://unsafe/?SID=abcdefg后,他就拥有了Alice的身份。可以为所欲为了。

e.g.

yxcms session固定攻击

  1. 用chrome新注册用户作为攻击用户,取得 PHPSESSID = qhi5f1rj7tu07dfkq53ngfqim2

  2. 模拟受害者使用firefox登陆管理后台,此时正常管理员 PHPSESSID= ib9pf18oh90ngm13q9m3utjp26, 后台地址为 http://192.168.27.136/yxcms/index.php?r=admin/index/index

  3. 攻击者诱使受害者访问恶意链接: http://192.168.27.136/yxcms/index.php?r=admin/index/index&sessionid=qhi5f1rj7tu07dfkq53ngfqim2

  4. 攻击者使用chrome访问后台链接:http://192.168.27.136/yxcms/index.php?r=admin/index/index , 账号变为管理员

分析

漏洞代码在:yxcms/protected/include/lib/common.function.php 中:

640 function session($name='',$value = '') {
641     if(empty($name)){
642         return $_SESSION;
643     }
644     $sessionId = request('request.sessionid');
645     if(!empty($sessionId)){
646         session_id($sessionId);
647     }
648     if(!isset($_SESSION)){
649         session_starts();
650     }
651     if($value === ''){
652         $session = $_SESSION[$name];
653     }else if($value==null){
654         unset($_SESSION[$name]);
655     }else{
656         $session = $_SESSION[$name] = $value;
657     }
658     return $session;
659 }

644行可以看到,如果session_id存在,则使用session_id方法将其设置为当前会话的id。 并且session_id可以通过requests方法得到。这就有问题了。

跟进request方法:

660 function request($str, $default = null, $function = null) {
661     $str = trim($str);
662     list($method,$name) = explode('.',$str,2);
663     $method = strtoupper($method);
664     switch ($method) {
665         case 'POST':
666             $type = $_POST;
667             break;
668         case 'SESSION':
669             $type = $_SESSION;
670             break;
671         case 'REQUEST':
672             $type = $_REQUEST;
673             break;
674         case 'COOKIE':
675             $type = $_COOKIE;
676             break;
677         case 'GET':
678         default:
679             $type = $_GET;
680             break;
681     }
682     if(empty($name)){
683         $request = filter_string($type);
684     }else{
685         if($method == 'GET'){
686             $request = urldecode($type[$name]);
687         }else{
688             $request = $type[$name];
689         }
690         $request = filter_string($request);
691         //设置默认值
692         if($default){
693             if(empty($request)){
694                 $request = $default;
695             }
696         }
697         //设置处理函数
698         if($function){
699             $request = call_user_func($function,$request);
700         }
701     }
702     return $request;
703 }

了解更多

https://xz.aliyun.com/t/2025
http://www.freebuf.com/column/162886.html

posted @ 2018-10-15 12:08  0x4D75  阅读(2587)  评论(1编辑  收藏  举报