Linux|某大型CMS后台注入从分析到利用( 二 )




注释已经写明此处根据分页查询角色数据 , 暂时不知道污点为何会传入selectRoleList()方法 , 继续跟传播链
RuoYi/ruoyi-system/src/main/resources/mapper/system/SysRoleMappper.xml


可以看到这里是SQL查询语句 , 具体为什么这么写可以去自行百度一下 , 可以看到这里直接将${params.dataScope拼接入了SQL语句中 , 因此构造SQL注入语句就能够查询我们想要获取的数据 , 到这里也就不难理解为什么污点源会变成dataScope现在根据公开的poc来捋一捋整个链
role为初始污点源->调用RuoYi/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java#selectRoleList方法->selectRoleList方法调用RuoYi/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java中的SysRole类 , 该类会对dataScope参数进行处理->dataScope传入了RuoYi/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java#selectRoleList方法->调用SQL查询时拼接dataScope参数值进行了注入
可能并不是很准确 , 但是自己是这么理解的 , 有师傅理解更到位的话请多多指教
第二部分poc
roleName=&roleKey=&status=&params\\[beginTime\\
=&params\\[endTime\\
=&params\\[dataScope\\
=and extractvalue(1concat(0x7esubstring((select database())132)0x7e))

将两部分poc结合也就得到了公开的poc , 其实从poc入手 , 再直接看到最后的漏洞注入点能够更好理解poc为什么是这么构造的 , 其他参数的值皆为空默认就会为null , 只传入dataScope这个参数值也是可以的
url/system/role/listPOST:pageSize=&pageNum=&orderByColumn=&isAsc=&roleName=&roleKey=&status=&params\\[beginTime\\
=&params\\[endTime\\
=&params\\[dataScope\\
=and extractvalue(1concat(0x7e(select database())0x7e))

本地复现


可以看到通过报错注入获取到了数据库的名字 , 后面更改SQL语句就能够获取到详细的数据库信息了
项目测试打开给定的地址 , 看到这个界面就觉得很熟悉 , 之前审报告的就是就看到很多回 , 若依没跑了 , 站点应该只是更改了一些静态资源 。



登录还是常规手段尝试弱口令 , admin/admin123 , 直接进去了后台


burp抓个包 , poc打过去 , 获取到了数据库名


得到如下部分数据库中的信息 , 详细的就不公开了
exam\\_bannerexam\\_collectexam\\_p 表名idtitlebanner\\_imgis\\_putcont  #exam\\_banner表中的列名 , 不完整 , 长度限制 , 可以分长度读出

总结整个到这里就差不多结束了 , 漏洞分析的可能不是特别到位 , 师傅们轻喷 , 只是想知道poc的参数是怎么构造的才去扒拉源码分析的 , 跟着poc去分析会更好理解 , 也就有了这篇文章 。