Joomla!是一套全球知名的内容管理系统。去年,在500000行代码中发现一个LDAP注入漏洞。攻击者利用LDAP注入漏洞可以完全控制依赖LADP进行认证的版本号小于 v3.7.5的Joomla! 版本。
研究人员最近又发现一个Joomla!核心的漏洞,影响3.8.4之前的所有版本。RIPS发现一个二阶SQL注入,攻击者可以利用二阶SQL注入来进行权限提升,攻击者可以获取完全的管理权限。
注:RIPS是一款对PHP源码进行风险扫描的工具。
受影响版本
受影响的Joomla! 版本为3.7.0到3.8.3版本。
攻击者需要用Joomla!后台中manager帐号进行认证。该用户组在Joomla!中默认的权限是低于Administrator 和Super Users用户组的。
影响
攻击者利用该漏洞可以从数据库中读取任意的数据,这些数据随后可以用来扩展攻击者低权限。通过执行PHP代码,攻击者可以获取Joomla!的完全管理权限。
自动检测
RIPS经过深度代码分析,发现两个高危的SLQ注入漏洞。
在漏洞中,用户控制的输入用来构造没有任何处理的SQL查询。
RIPS引擎中的静态代码分析算法成功地检测到了用户输入中的危险部分。还发现Joomla!数据库抽象层的一个方法是安全相关的,该方法吧执行数据库查询的SQL代码联系在一起。攻击者可以注入SQL代码来修改数据库查询来窃取隐私数据。
技术分析:二阶逻辑SQL盲注入
SQL注入定位在文件administrator/templates/hathor/postinstall/hathormessage.php中。下面的代码总结了该漏洞:
每当dashboard加载时,组件会调用函数hathormessage_postinstall_condition() 来post安装消息。该函数中,变量$adminstyle的内容会与第10行中构造的SQL查询中的WHERE部分相联系。如果攻击者可以通知参数admin_style的内容,就可以注入任意SQL代码到14行中的查询中。
第4行接收到的参数admin_style含有用户用来配置后台模板的ID,用户可以在profile设定中改变该参数。通过拦截保存的请求中的用户参数并改变admin_style的值来进行快速验证,表明数据会直接保存到数据库中而不需要进行额外的检查或处理。攻击者就可以注入任意内容到该参数,并用于之后的SQL查询中。因为payload首先会保存到数据库,然后用于查询,所以这种SQL注入就叫做二阶漏洞。查询的结果是不会直接展示在web页上,这样攻击者需要用基于错误或者时间的注入技术来进行利用。
下图说明了SQL查询中XPath错误消息如何用于读取当前登录管理员的session ID。
总结
安全漏洞是无处不在的,研究人员发现一个影响Joomla! 3.8.4以前版本的SQL注入漏洞。该漏洞可以用RIPS静态代码分析器进行识别,本文证明了二阶SQL盲注的根源和RIPS如何在复杂的PHP项目中找出隐藏的安全问题。