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
19function 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_input
和verify_str
的过滤,跟进查看一下。verify_str
的值我们上一篇审计的时候查看过了,过滤几个sql语句
虽然过滤了单引号'
,但是并没有过滤\
,看看是否能通过转义符\
将$cookieuseradmin
后面的单引号闭合,从而绕过检测。
继续查看test_input
1
2
3
4
5
6
7
8function 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()
函数中增加对反斜线\
的过滤