会话固定攻击 - yxcms session固定漏洞
会话固定攻击
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