head-img Force's Blog

记录一次 phpAPI的Mysql注入尝试

Mysql / MariaDB,PHP,Database

准备物料

  • VuePoem项目
  • API调试工具
  • 可暴库SQL语句

开始

  1. 启动VuePoem项目,使API服务运行起来, 关闭代码层面防SQL注入相关代码
  2. 以登录为目标准备注入用户表poem_sys_admin

系统正常查询用户存在于数据表为:
SELECT * FROM poem_sys_admin WHERE (name='admin' AND status='1') LIMIT 0,1

希望在未知用户情况下希望把所有表暴露出来做到使name=注入语句,并使#后失效
SELECT * FROM poem_sys_admin WHERE (name= 1) or 1=1# AND status=1) LIMIT 0,1

直接在数据库客户端执行可以暴露全用户

通过API调试工具请求登录并注入

返回响应失败,并没有暴露出全表用户

{
"code": 0,
"info": "The account does not exist or has been frozen"
}

查看Mysql执行log,发现输入项被引号自动包围导致通过API注入失败

2022-09-21T08:40:49.056777Z     1652 Connect    root@localhost on vuePoem using TCP/IP
2022-09-21T08:40:49.056975Z     1652 Query    SET NAMES 'utf8mb4'
2022-09-21T08:40:49.057155Z     1652 Query    SELECT * FROM `poem_sys_admin` WHERE (`name`='1) or 1=1#' AND `status`='1') LIMIT 0,1
2022-09-21T08:40:49.063336Z     1652 Quit

查阅资料发现,由于vuePoem项目使用php pdo方式使用PDO::prepare()后,发送sql到DB前会自动处理用户输入数据。
此部分参考:https://www.yisu.com/zixun/351740.html

结论

由于使用了PDO::prepare()防止通过PHP发生sql注入情况,同时客户端请求也要过滤用户输入增加多层保障

点我评论
打赏本文
二维码


99

文章

24

标签

 推广