会话固定漏洞

Posted wd404

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话固定漏洞相关的知识,希望对你有一定的参考价值。

1、定义

会话固定漏洞,如果在目标网站登录时,用户携带攻击者控制生成的登录凭证cookie,服务端接收后验证登录信息成功,选择使用请求中的已知凭证cookie,而非重新发放。

2、发生场景

(1)攻击者控制生成登录凭证cookie

  • 一些场景中,会出现在请求url直接参数或者请求体部中设置,然后响应将请求参数设置为cookie。但是一般cookie名很难被设置为登录凭证cookie名,除非接收是按顺序进行的,将第n各参数的参数名设置为cookie名,其值为cookie值
  • 业务设计缺陷,服务端希望前端基于脚本读取本地存储的cookie信息,并发送给服务端。
  • xss漏洞可以在前端设置本地cookie,基于meta元素,或者js脚本document.cookie

(2)登录未重新发放覆盖cookie

3、利用过程

4、测试步骤

(1)是否存在token机制

(2)两次登录,检查登录凭证cookie是否变化

(3)挖掘xss或其它,使得控制生成登录凭证cookie

5、防护

(1)token机制

(2)登录覆盖cookie

6、补充

对于会话固定漏洞,严格来说,只要登录未覆盖等凭证cookie,就存在漏洞风险。

利用并不一定来自线上的,还可能是线下的。

比如多用户先后使用同一台主机的同一个浏览器登录操作,那么相互之间的登录凭证是相同的,其中一个作为攻击者,则可以基于burp进行直接的请求伪造。

尤其是,凭证是持久型cookie时,可以长期操作。

php代码审计10审计会话认证漏洞

挖掘经验:遇到的比较多的就是出现在cookie验证上面,通常是没有使用session来认证,直接将用户信息保存在cookie中  
    
Session固定攻击:
黑客固定住目标用户的session id,所以目标用户使用的session可以由攻击者指定


Session劫持攻击:
黑客劫持目标用户的session id俩获取网站服务器上未经许可的存取信息,特别是窃取目标用户的cookie数据,来取得网站的认可


代码:
espcms任意用户登录分析
在文件espcms/upload/memebermain.php的in_center()函数可以看到如下代码:
function in_center() {
if ($this->CON[‘mem_isucenter’]) {
include_once admin_ROOT . ‘public/uc_client/client.php’;
}
parent::start_pagetemplate();
parent::member_purview();
$lng = (admin_LNG == ‘big5’) ? $this->CON[‘is_lancode’] : admin_LNG;
$db_where = “userid=$this->ec_member_username_id AND username=’$this->ec_member_username’ “;
$db_table1 = db_prefix . ‘member AS a’;
$db_table2 = db_prefix . ‘member_value AS b’;
$db_sql = “SELECT a.*,b.mvid,b.value FROM $db_table1 LEFT JOIN $db_table2 ON a.userid = b.userid WHERE a.userid = $this->ec_member_username_id “;
$rsMember = $this->db->fetch_first($db_sql);
$rsMember[‘rankname’] = $this->get_member_purview($rsMember[‘mcid’], ‘rankname’);
$userid = $rsMember[‘userid’];
if (empty($userid)) {
exit(‘user err!’);
}
$db_table = db_prefix . “order”;

    $db_where = " WHERE userid=$userid";
     
    $db_where2 = " WHERE userid=$userid and ordertype=1";
     
    $db_where3 = " WHERE userid=$userid and ordertype=3";
    $this->pagetemplate->assign(\'ordernum\', $this->db_numrows($db_table, $db_where));
    $this->pagetemplate->assign(\'ordernum2\', $this->db_numrows($db_table, $db_where2));
    $this->pagetemplate->assign(\'ordernum3\', $this->db_numrows($db_table, $db_where3));
     
    $db_table = db_prefix . "bbs";
    $db_where = " WHERE userid=$userid";

在代码中$_userid=$this->ec_member_username_id;这行代码这只当前用户id,随后根据这个$userid变量去直接操作这个id的用户数据。

接下来,根据parent::member_purview()函数跟到espcms/upload/public/class_connector.php文件的member_purview()函数,代码如下:
function member_purview($userrank=false, $url=null, $upurl=false) {

    $this->ec_member_username = $this->fun->eccode($this->fun->accept(\'ecisp_member_username\', \'C\'), \'DECODE\', db_pscode);
    $user_info = explode(\'|\', $this->fun->eccode($this->fun->accept(\'ecisp_member_info\', \'C\'), \'DECODE\', db_pscode));
     
    list($this->ec_member_username_id, $this->ec_member_alias, $this->ec_member_integral, $this->ec_member_mcid, $this->ec_member_email, $this->ec_member_lastip, $this->ec_member_ipadd, $this->ec_member_useragent, $this->ec_member_adminclassurl) = $user_info;

list()函数中使用$user_info数组为$this->ec_member_username_id变量进行赋值,而$user_info数组是从cookie中解密出来的,关于这个算法的加密代码在espcms/upload/public/class_function.php文件的eccode()函数

修复方案:
使用随机而且长度够大的数字或字符串来当做session id
将网页之间传递的数据使用某种形式封装,特别是session id
更改session名称
注销后销毁session的所有数据

 

友情链接 http://www.cnblogs.com/klionsec

               http://www.feiyusafe.cn

以上是关于会话固定漏洞的主要内容,如果未能解决你的问题,请参考以下文章

一文了解会话固定漏洞

会话固定漏洞

php代码审计10审计会话认证漏洞

业务安全漏洞总结

Rails 登录重置会话

锐捷路由器漏洞分析