SpringBoot集成Mybatis实现简单的SQL注入(攻击)案例
程序员文章站
2022-05-15 09:17:52
...
一、项目演示
(1)主演示就是一张t_user表,利用常见的用户登录来模拟sql注入对后台数据的侵入
(2)数据库脚本 -- postgresql
DROP TABLE IF EXISTS "public"."t_user";
CREATE TABLE "public"."t_user" (
"id" int8 NOT NULL,
"name" varchar(255) COLLATE "pg_catalog"."default",
"password" varchar(255) COLLATE "pg_catalog"."default"
)
;
DROP TABLE IF EXISTS "public"."t_user_info";
CREATE TABLE "public"."t_user_info" (
"id" int8 NOT NULL,
"uid" int8,
"name" varchar(255) COLLATE "pg_catalog"."default",
"gender" int2,
"age" int2,
"address" varchar(255) COLLATE "pg_catalog"."default"
)
;
ALTER TABLE "public"."t_user" ADD CONSTRAINT "t_user_pkey" PRIMARY KEY ("id");
ALTER TABLE "public"."t_user_info" ADD CONSTRAINT "t_user_info_pkey" PRIMARY KEY ("id");
(3)数据库表结构
(4)代码中,体现防sql注入和sql注入的地方如下:
(5)先来注册个用户
(6) 先来个带有侵入性的正常登录
传入参数:
{
"name":"appelyk",
"password":"'';drop table if exists t_user_info;"
}
由于这个演示掉的后台接口些的sql是防注入的,所以,我们调用接口的时候,可以看到myabtis输出的sql语句如下:
SELECT ID
,
NAME,
PASSWORD
FROM
t_user
WHERE
NAME = 'appleyk'
AND PASSWORD = ''';drop table if exists t_user_info;'
数据库执行效果,那还用说嘛,肯定找不到啦!
(7) 再来个带有侵入性的"非"正常登录
我们看下后台输入的sql日志:
我们去数据库查看一下,发下,t_user_info表已经不存在了!!!!
二、总结
(1)检查sql语句,慎用$,请选择用#
(2)如果非要用$,请在自己的业务层,实现对可能会发生SQL注入的参数进行手动过滤处理,不要希望mybaits会对你的$参数进行拦截处理!
三、项目地址
GitHub地址:https://github.com/kobeyk/springboot-myabtis-injection-sample