Joomla注入漏洞(CVE-2018-6605)复现分析
https://mp.weixin.qq.com/s?__biz=MzAxODg1MDMwOQ==&mid=2247489109&idx=1&sn=0c9a3388e4ac1389897b4449fb3af110&chksm=9bcea13facb928293ac06fede04f15d564b60a5e8ad26208f28ebe175017aa3d2144617f2b60&mpshare=1&scene=23&srcid=0418r0yqNrZ1hyGCdDHl8EK1#rd
0x00 漏洞概述
漏洞简介
Joomla是一套全球知名的网站内容管理系统,使用PHP语言和MySQL数据库开发。在Joomla的百度地图组件中存在SQL注入。由于在以下函数
getPlacemarkDetails,getPlacemarkHoverText, getPathHoverText,getPathDetails中请求的参数:id,在拼接SQL语句中缺少安全措施,导致了此次攻击。
受影响版本
根据官方描述,此漏洞存在于3.0.0.*。
漏洞触发条件
1. 站点接入了zhBaidumap插件,且该插件版本为3.0.0.*
2. 攻击者知道存在注入点的url和post参数。
CVE-ID
CVE-2018-6605
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6605
EXPLOIT-DB
EXPLOIT-DB:43974
https://www.exploit-db.com/exploits/43974/
0x01 漏洞详情
复现环境
PHP 7.0.10
Joomla 3.8.6
此插件需要填入百度地图的AK。
漏洞复现
由于出现的注入点都相同,着重分析此URL:http://localhost/joomla/index.php?option=com_zhbaidumap&no_html=1&format=raw&task=getPlacemarkDetails 在对问题URL进行POST请求的参数id处存在漏洞。
先观察一下此问题URL对应的功能。
未能找到功能点。根据CVE复现,抓包分析。如下图所示:
上面复现时抓包,可以试着根据请求的URL找到拼接的SQL语句。定位到URL对应的代码文件在
joomla\components\com_zhbaidumap\assets\js\objectmanager-min.js文件中出现。
未发现相关漏洞代码,转去跟踪getPlacemarkDetails函数。出现在joomla\components\com_zhbaidumap\controller.php中。
定位到漏洞代码:
从上面的代码我们可以看到$addWhereClause .= ' and h.id = '. $id; $id未做强制类型,之后变量$addWhereClause直接与SQL语句进行拼接,导致了SQL注入。
找到了出现漏洞的代码,想分析一下此处对问题URL进行POST请求参数的作用。从返回包入手,如下图所示:
通过定位actionbylick字段找到了此处代码。
此处的loadObject函数会将从数据库中取到的第一行作为php对象。
由此可知,此处URL会携带参数对数据库中的内容进行查询,如果从数据库查询到值,则返回一个php对象,查询到的数据被插入到actionbyclick字段的参数处。
利用验证
0x02 漏洞修复
升级到最新版本。
建议在代码中对数字类型的参数先进行数字类型变换,然后再代入到SQL查询语句中,这样任何注入行为都不能成功。
对于PHP语言编写的网站,大都是和mysql数据库结合的,可以通过如下几种方法结合起来防范SQL注入漏洞:
1. 在GET提交的数据中进行过滤select 、update、delete、insert等其他语句。
2. 在POST提交的数据中,使用函数addslashes()
3. 对于MySQL用户,可以使用函数mysql_real_escape_string( )
4. 使用支持参数化查询语句和占位符的数据库操作类(如PEAR::DB, PDO等)