目录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