内容提要
本文对JfinalCMS进行了代码审计,发现三个安全漏洞:管理员后台任意文件上传漏洞(后端未校验文件类型)、存储型XSS漏洞(数据更新无过滤)以及SSTI模板注入漏洞(可构造payload执行命令)。文章详细分析了漏洞成因及利用方法。
延伸解读
漏洞根源:默认配置与后端校验缺失
任意文件上传漏洞的根源在于后端未校验文件类型,且默认配置未限制上传大小和类型。开发者可能为了方便开发而放宽限制,但未在发布前收紧。这提醒我们,安全配置应默认安全,而非依赖使用者手动开启。
XSS漏洞:数据更新无过滤
存储型XSS漏洞源于数据更新时未对输入进行过滤或转义,导致恶意脚本可被存储并在页面执行。这凸显了在服务端对所有用户输入进行严格校验和输出编码的重要性,前端验证无法替代后端安全措施。
SSTI注入:模板引擎的反射利用
SSTI漏洞利用beetl模板引擎直接调用Java方法的能力,通过反射绕过对Runtime和Process的禁用。这展示了即使模板引擎有安全限制,攻击者仍可借助反射等技巧实现命令执行。开发者应限制模板中的危险方法调用,并加强输入过滤。
Q&A
JfinalCMS存在哪些安全漏洞?
JfinalCMS存在三个安全漏洞:管理员后台任意文件上传漏洞、存储型XSS漏洞和SSTI模板注入漏洞。
JfinalCMS的任意文件上传漏洞是如何产生的?
该漏洞位于管理员后台的模板管理功能中,由于后端未对上传文件的类型进行校验,仅在前端做了限制,攻击者可以绕过前端验证上传任意恶意文件。
JfinalCMS的存储型XSS漏洞出现在哪里?
该漏洞出现在个人资料保存功能中,具体位于PersonController的save方法,数据更新时没有进行任何过滤,导致恶意脚本被存储并执行。
JfinalCMS的SSTI模板注入漏洞是如何被利用的?
该漏洞位于管理员后台的模板修改功能,由于beetl模板引擎禁止直接调用Runtime和Process,攻击者利用Java反射机制构造payload,通过Class.forName获取Runtime类,再调用getRuntime和exec方法执行系统命令。
JfinalCMS的任意文件上传漏洞中,默认配置有什么问题?
默认配置中上传文件大小限制为0(无限制),且未开启仅允许上传图片的选项,导致攻击者可以上传任意文件。
JfinalCMS的SSTI漏洞中,为什么不能直接调用Runtime类?
因为beetl模板引擎禁止了java.lang.Runtime和java.lang.Process,所以不能直接调用,需要利用Java反射机制绕过限制。
JfinalCMS的存储型XSS漏洞中,数据更新过程是否有防护措施?
没有,整个数据更新过程没有任何防护措施或过滤字符手段,导致恶意脚本可以被存储。