會話固定攻擊
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固定攻擊
-
用chrome新注冊用戶作為攻擊用戶,取得 PHPSESSID = qhi5f1rj7tu07dfkq53ngfqim2
-
模擬受害者使用firefox登陸管理后台,此時正常管理員 PHPSESSID= ib9pf18oh90ngm13q9m3utjp26, 后台地址為 http://192.168.27.136/yxcms/index.php?r=admin/index/index
-
攻擊者誘使受害者訪問惡意鏈接: http://192.168.27.136/yxcms/index.php?r=admin/index/index&sessionid=qhi5f1rj7tu07dfkq53ngfqim2
-
攻擊者使用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
