目录
习题通关
第2页
第3页
第4页
第5页
第9页
第10页
第11页
第12页
第13页
课程脑图
SQL基础
SQL注入基础
提醒,本课输入的所有sql语句会真实地执行,所以误删误改了数据可能造成没有办法继续正确答题,需要reset lesson。
比如我在第2页的时候看错题目了,把Bob那行数据删除了,导致后来反应过来是要查看数据的时候,明明输入了正确的查询语句,却一直报invalid cursor state: identifier cursor not
positioned on row in UPDATE, DELETE, SET, or GET statement……后来reset lesson才好(。ì _ í。)
这关要求查询Bob Franco的department。查询要用SELECT,正确的查询语句是:
SELECT department FROM employees WHERE first_name='Bob' and last_name='Franco';
或者由于这题的表里面只有一个人叫Bob,因此也可以用下面这个查询语句
SELECT department FROM employees WHERE first_name='Bob'
这关要求把Tobi Barnett的department改成Sales。修改数据内容用UPDATE,正确的SQL语句是:
UPDATE employees SET department='Sales' WHERE first_name='Tobi' and last_name='Barnett'
这关要求employees表加一列。修改表用ALTER TABLE,正确的SQL语句是:
ALTER TABLE employees ADD phone varchar(20)
这关要求给UnauthorizedUser修改表的权限。赋予权限需要用GRANT,正确的SQL语句是:
GRANT ALTER TABLE TO UnauthorizedUser
这关尝试字符型SQL注入,最后组成下面两种SQL语句都可以:
SELECT * FROM user_data WHERE first_name = 'John' and last_name = 'Smith' or '1' = '1'
SELECT * FROM user_data WHERE first_name = 'John' and last_name = '' or '1' = '1'
这关尝试数字型SQL注入,如下图这样填写(注入点在User_Id),组成如下的SQL语句:
SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or 1=1
关于注入点为什么在User_Id:
一开始我以为注入点在Login_Count,想要用-- 来注释掉后面的内容,但是没有成功。
我去github查看这节课的源代码,发现这课用到了SQL预编译语句,但是只对Login_Count做了防护,User_Id还是直接带入参数值。
这关是通过字符型SQL注入破坏数据机密性,也就是查看非授权数据。利用OR,如下图所示:
Name框填 1
TAN框填 1' or '1'='1
这关利用查询链(分号;)破坏数据完整性,也就是修改非授权数据。两个框都可以是注入点,因此有两种解法:
Name框:Smith
TAN框:3SL99A';UPDATE employees SET salary=200000 WHERE last_name='Smith
或者
Name框:Smith';UPDATE employees SET salary=200000 WHERE last_name='Smith';-- ss
TAN框不填
注意:经尝试,查询链第一个语句没有输入正确的参数也并不影响第二个语句的执行。也就是说Name框可以不填Smith,而是其他字符,TAN框中TAN的部分也可以不输入正确的TAN。
这关要利用字符型注入来破坏可用性,也就是让原本被授权的人无法读取或操作某些文件。这关要求把access_log整个删除,因此用DROP TABLE,而不是TRUNCATE:
1';DROP TABLE access_log;-- ss
本课1-5页是SQL基础,6-13页是SQL注入基础。下面按照这个分类画了两张脑图。