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

会话固定攻击

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

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

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/indexsession

  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 中:url

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方法获得。这就有问题了。firefox

跟进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

相关文章
相关标签/搜索