Jeecgboot<=3.9.3 SQL注入漏洞分析
漏洞分析
JeecgBoot 近期被披露存在“权限绕过 + SQL注入”组合漏洞(QVD-2026-56312 / LDYVUL-2026-00170236),CVSS 3.1 评分为 8.6(高危)。该漏洞允许未授权的远程攻击者绕过系统鉴权,通过 SQL 盲注窃取数据库敏感信息,甚至接管系统。
这里先给dictCode随便赋一个值,debug找到具体方法调用  这里SymbolConstant.COMMA的值为",",判断如果dictCode这个字符串包含","的话,就会以","做分割,判断分割后的字符串数组的长度,3和4进入不同方法中,长度小于3则返回null,后面分析我们会从分割长度为3进行分析;如果字符串中不存在",",则直接进入queryDictItemsByCode方法中  这里也可以看到queryDictItemsByCode方法使用了预编译,不存在sql注入  当分割后的字符串数组长度为3进入queryTableDictItemsByCode方法中,之后进入dictTableWhiteListCheckByDict方法中进行表名验证,这里filelds不为null,String... fields表示接收任意个string参数。   在isPassByDict中首先会对传进来的参数进行sql语句拼接,然后进行sql解析,这里仅是使用JSqlParser 库对 SELECT 语句进行语法解析,并没有执行sql语句   后续在isPassBysql方法中则会对传入的参数所代表的表名和字段名进行白名单检测,例如sys\_user这张表就只能查询其中的id、realname等字段   后续会判断tableFilterSql字符串中是否存在where关键字,如果存在则会以“where”分割字符串,将where后的字符串赋值给filterSql,而tableFilterSql字符串则对应我们传入的dictCode的第一个","之前的字符串部分  分割完成后table, text, code这三个参数会传入SqlInjectionUtil.filterContentMulti方法中进行一系列的sql注入关键字的检测,不允许出现"--"和"/\*\*/"这两个sql注释符  不允许出现以下关键字,以及不能匹配上XSS\_REGULAR\_STR\_ARRAY的正则表达式   那这里就可以判断,因为进行字符串检测时使用的是"select ",那么我们就可以使用"select("这样子去绕过。但是之后table、text、code参数还需要各自再过一遍检测  getSqlInjectTableName方法是使用正则规定了字符串第一个必须是字母,后面也只能出现字母\_$等字符,因此这里就没有注入机会  getSqlInjectField也是用正则做了类似的处理  因此最终的注入点只能从filterSql参数入手,specialFilterContentForDictSql方法使用的是黑名单过滤,这就有了绕过的空间,过滤的字符就是之前提到过的   最终的sql语句执行的地方就在queryTableDictWithFilter方法中,这里也可以很明显的看到filterSql是拼接进sql语句中的    这里直接给出payload `GET /jeecgboot/sys/api/getDictItems?dictCode=sys\_user+where+'2'=(select%0dSUBSTRING%0d(version()+FROM+1+FOR+1)),realname,id HTTP/1.1`   那至于权限绕过就可以看ShiroConfig里面的配置了,老方法了 
发表于 2026-09-14 17:45:33
阅读 ( 250 )
分类:
漏洞分析
0 推荐
收藏
0 条评论
will
0 篇文章
×
温馨提示
您当前没有「奇安信攻防社区」的账号,注册后可获取更多的使用权限。
×
温馨提示
您当前没有「奇安信攻防社区」的账号,注册后可获取更多的使用权限。
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!