准备物料
- VuePoem项目
- API调试工具
- 可暴库SQL语句
开始
- 启动VuePoem项目,使API服务运行起来, 关闭代码层面防SQL注入相关代码
- 以登录为目标准备注入用户表
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
直接在数据库客户端执行可以暴露全用户
返回响应失败,并没有暴露出全表用户
{
"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注入情况,同时客户端请求也要过滤用户输入增加多层保障