會話固定攻擊 - 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

相關文章
相關標籤/搜索