会话认证漏洞

会话认证漏洞算是比较好学好理解的漏洞啦,端午节什么都没学,只是玩啦,所以今赶紧把缺的东西学学补上,然后分享一下。

会话认证漏洞
会话认证是个非常大的话题,涉及各种协议和框架,如cookie、session、sso、oauth、openid等。cookie是Web服务器返回给客户端的一段常用来标识用户身份或者认证情况的字符串,保存在客户端,浏览器请求时会自动带上这个标识;session是保存在服务器端的信息。

挖掘经验
认证漏洞在代码审计的时候遇到比较多的是出现在cookie验证上面,通常是没有使用session来认证,而是直接将用户信息保存到cookie中。在挖掘登录认证漏洞的时候,可以先看一下程序的登录代码功能,看看整个登录过程的业务逻辑有没有可以控制session值或者直接绕过密码验证的漏洞;另外需要关注程序验证是否为登陆的代码,通俗的说是验证cookie的代码。

cookie认证安全
cookie可以保存任何字符串,各个浏览器保存cookie字节数大小不一样,通常cookie用来保存登录账号的标识信息。cookie出现问题较多的是cookie的SQL注入等常见漏洞,以及Web应用程序在服务器端直接读取cookie的用户名或者ID值来操作当前这个用户的数据。
通常一个cookie验证的代码大概如下:
<?php
session_start();
function login()
{
if(账号密码正确)
{
setcookie(‘username’,’admin’);
$_SESSION[‘username’]=’admin’;
}
}
if($_COOKIE[‘username’]===$_SESSION[‘username’])
{
//操作$_SESSION[‘username’]用户的数据
}
else
{
login();
}
?>
这样的写法一般不会出现验证上面的安全问题。

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()函数,代码如下:
function eccode($string, $operation=’DECODE’, $key=‘@LFK24s224%@safS3s%1f%’) {
$result = ‘’;
if ($operation == ‘ENCODE’) {
for ($i = 0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key)) - 1, 1);
$char = chr(ord($char) + ord($keychar));
$result.=$char;
}
$result = base64_encode($result);
$result = str_replace(array(‘+’, ‘/‘, ‘=’), array(‘-‘, ‘_’, ‘’), $result);
} elseif ($operation == ‘DECODE’) {
$data = str_replace(array(‘-‘, ‘_’), array(‘+’, ‘/‘), $string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr(‘====’, $mod4);
}
$string = base64_decode($data);
for ($i = 0; $i < strlen($string); $i++) {
$char = substr($string, $i, 1);
$keychar = substr($key, ($i % strlen($key)) - 1, 1);
$char = chr(ord($char) - ord($keychar));
$result.=$char;
}
}
return $result;
}
这是一个很明显的可逆算法。

漏洞防范
1.严格限制输入的异常字符以及避免使用客户端提交上来的内容去直接进行操作;
2.应该把cookie和session结合起来使用,不能从cookie中获取参数值然后进行操作;
3.设置session时,客户端不能操作敏感session参数;
4.敏感数据不要放到cookie中;
5.限制一个用户只能同时在一个IP上面登录。

猜你喜欢

转载自blog.csdn.net/qq_36197704/article/details/81623864