head-img Sihan's Blog

记录一次 phpAPI的Mysql注入尝试

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

直接在数据库客户端执行可以暴露全用户 202211162031.png 返回响应失败,并没有暴露出全表用户

{
"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注入情况,同时客户端请求也要过滤用户输入增加多层保障

PHPMysql
打赏本文
二维码