目錄php
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的身份。能夠隨心所欲了。後端
用chrome新註冊用戶做爲攻擊用戶,取得 PHPSESSID = qhi5f1rj7tu07dfkq53ngfqim2服務器
模擬受害者使用firefox登錄管理後臺,此時正常管理員 PHPSESSID= ib9pf18oh90ngm13q9m3utjp26, 後臺地址爲 http://192.168.27.136/yxcms/index.php?r=admin/index/indexsession
攻擊者誘使受害者訪問惡意連接: 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 中: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