文章目录
  1. 后台SQL注入
  2. 绕过验证邮箱查重机制
  3. 后台任意文件删除
  4. 储存型XSS

审计入门之路(四):GenixCMS

审计入门之路(四):GenixCMS
柠檬师傅和皓宝宝都拿CVE了,我也跟风审这cms。要是能申请到一个CVE-ID这个学期的目标就提前完成了。

一周之后就收到了第一个CVE,开心。顺带着把审到的几个全都交了,CNA也都分配了CVE-ID

后台SQL注入

输入类没有看出什么问题,根据我的水平,也只能找找过滤不完善的地方了。
/inc/lib/control/backend/menus/control.php 245行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
case 'remove':
if (isset($_GET['menuid'])) {
$token = Typo::cleanX($_GET['token']);
if (!isset($_GET['token']) || !Token::validate($token)) {
// VALIDATE ALL
$alertDanger[] = TOKEN_NOT_EXIST;
}
if (isset($alertDanger)) {
$data['alertDanger'] = $alertDanger;
} else {
$menus = json_decode(Options::v('menus'), true);
unset($menus[$_GET['menuid']]);
$sql = sprintf("DELETE FROM `menus` WHERE `menuid` = '%s' ", $_GET['menuid']);
Db::query($sql);
$menu = json_encode($menus);
Options::update('menus', $menu);
new Options();
$data['alertSuccess'][] = 'Menu Deleted';
}
if (isset($_GET['token'])) {
Token::remove($token);
}
} else {
$data['alertDanger'][] = 'No ID Selected.';
}
$data['menus'] = Options::get('menus');
Theme::admin('header', $data);
System::inc('menus', $data);
Theme::admin('footer');
break;

http://localhost/CMS/GeniXCMS-master/gxadmin/index.php?page=menus&act=remove 因为有csrftoken,只能改包。抓一个删除menus的包,修改token和menuid的位置,然后修改menuid的内容:hebic’//or//extractvalue(1,concat(0x7e,database()))/**/or’

37ca5818-29ad-11e7-8f2f-d1adf3648435.png

绕过验证邮箱查重机制

在/register.php的验证邮箱部分用了

1
2
3
if (!User::isEmail($_POST['email'])) {
$alertDanger[] = MSG_USER_EMAIL_EXIST;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static function isEmail($vars)
{
if (isset($_GET['act']) && $_GET['act'] == 'edit') {
$id = Typo::int($_GET['id']);
$where = "AND `id` != '{$id}' ";
} else {
$where = '';
}
$vars = sprintf('%s', Typo::cleanX($vars));
$sql = sprintf("SELECT * FROM `user` WHERE `email` = '%s' %s", $vars, $where);
$e = Db::result($sql);
if (Db::$num_rows > 0) {
return false;
} else {
return true;
}
}

如果注册时在URL后加上?act=edit&id=1 就可以用1的邮箱注册了。

不过这个CMS的邮箱不能用来登陆,只能用来找回密码。所以也是一个挺鸡肋的漏洞。

他在验证用户名是否存在时用的

1
2
3
if (User::isExist($_POST['userid'])) {
$alertDanger[] = MSG_USER_EXIST;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static function isExist($user, $except='')
{
if ($except != '') {
$id = Typo::cleanX(Typo::strip($except));
$where = "AND `userid` != '{$id}' ";
} else {
$where = '';
}
$user = sprintf('%s', Typo::cleanX($user));
$sql = sprintf("SELECT `userid` FROM `user` WHERE `userid` = '%s' %s ", $user, $where);
$usr = Db::result($sql);
$n = Db::$num_rows;
if ($n > 0) {
return true;
} else {
return false;
}
}

这里就不会绕过验证是否有相同用户名的部分了。有点遗憾。

后台任意文件删除

inc/lib/Files.class.php 中的函数delTree

1
2
3
4
5
6
7
8
9
10
11
12
public static function delTree($dir)
{
try {
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? self::delTree("$dir/$file") : @unlink("$dir/$file");
}
rmdir($dir);
} catch (Exception $e) {
return false;
}
}

指定一个参数,就可以删除。找一个使用delTree函数的地方。

inc/lib/Control/Backend/themes.control.php 84行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if (isset($_GET['act'])) {
if ($_GET['act'] == 'activate') {
$token = Typo::cleanX($_GET['token']);
if (!Token::validate($token)) {
$alertDanger[] = TOKEN_NOT_EXIST;
}

if (!isset($alertDanger)) {
Theme::activate(Typo::cleanX($_GET['themes']));
$data['alertSuccess'][] = THEME_ACTIVATED;
} else {
$data['alertDanger'] = $alertDanger;
}
} elseif ($_GET['act'] == 'remove') {
$token = Typo::cleanX($_GET['token']);
if (!Token::validate($_GET['token'])) {
$alertDanger[] = TOKEN_NOT_EXIST;
}
if (Theme::isActive(Typo::cleanX($_GET['themes']))) {
$alertDanger[] = MSG_THEME_IS_ACTIVE;
}
if (!isset($alertDanger)) {
if (Files::delTree(GX_THEME.'/'.$_GET['themes'])) {
$data['alertSuccess'][] = THEME_REMOVED;
} else {
$data['alertDanger'][] = MSG_THEME_NOT_REMOVED;
}
} else {
$data['alertDanger'] = $alertDanger;
}
}
}

删除主题,抓个包,在themes参数改成删掉的内容就可以。虽然会报错,但还是删掉了。

储存型XSS

这个发现是挺偶然的。本来是在前台回复了一个带控制符标签的内容。后台看到的的确是被编码了的html标签。不过把鼠标移动上去他会执行这个标签内容。

2.png

前台回复一个<script>alert(1)</script>

QQ截图20170426211616.png

支持一下
扫一扫,支持forsigner