前言
记一次失败的代码审计,还有好多洞审出来没有记录,因为审出来打开GitHub issue界面发现大家都提交过了,只是项目年久失修没有人维护没人修,遂直接放弃,展示一下前十分钟的xss成果…后面的sql注入,rce什么的不想写了
仓库链接:https://github.com/jflyfox/jfinal_cms
审计版本:5.1.0最新版,一堆洞
软件包分析
这个包结构,遵循MVC三层架构
项目中只有使用了MySql的驱动,好像是它使用的web框架封装了jdbc操作,查看文档后验证了这是一个WEB+ORM框架
后台XSS
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| com/jflyfox/modules/admin/person/PersonController.java public void save() { JSONObject json = new JSONObject(); json.put("status", 2);
SysUser user = (SysUser) getSessionUser(); int userid = user.getInt("userid"); SysUser model = getModel(SysUser.class);
if (userid != model.getInt("userid")) { json.put("msg", "提交数据错误!"); renderJson(json.toJSONString()); return; }
if (user.getInt("usertype") != 4) { String oldPassword = getPara("old_password"); String newPassword = getPara("new_password"); String newPassword2 = getPara("new_password2"); if (!user.getStr("password").equals(JFlyFoxUtils.passwordEncrypt(oldPassword))) { json.put("msg", "密码错误!"); renderJson(json.toJSONString()); return; } if (StrUtils.isNotEmpty(newPassword) && !newPassword.equals(newPassword2)) { json.put("msg", "两次新密码不一致!"); renderJson(json.toJSONString()); return; } else if (StrUtils.isNotEmpty(newPassword)) { model.set("password", JFlyFoxUtils.passwordEncrypt(newPassword)); } }
if (StrUtils.isNotEmpty(model.getStr("email")) && model.getStr("email").indexOf("@") < 0) { json.put("msg", "email格式错误!"); renderJson(json.toJSONString()); return; } model.put("update_id", getSessionUser().getUserid()); model.put("update_time", getNow());
model.update(); UserCache.init(); SysUser newUser = SysUser.dao.findById(userid); setSessionUser(newUser); json.put("status", 1);
renderJson(json.toJSONString()); }
|
可以看到没有对输入的数据做任何内容校验,仅仅做了越权校验以及对邮箱号格式校验,且仅检测内容中是否包含@,然后把所有数据写入到数据库,
验证
保存后
可以看到数据流侵入到了控制流,成功写入数据库,造成了XSS漏洞