写在前面:
目前WebGoat通关攻略与详细解析处于持续更新中,若大家在阅读的过程中发现什么问题或者有什么建议,都可以在发布在评论区或私信我,我们一起共同探讨!
由于所有通关攻略写在一起导致篇幅太长,所以,我按照一个小结发布一篇,方便大家阅读。
最后我会为大家发布完整版和只有答案的完整版,有需要的小伙伴可以关注一下。
3.1 SQL Injection(intro)
此模块主要对SQL注入进行简介和简单的练习。
3.1.2 What is SQL?
什么是SQL语句呢,没有接触过的小伙伴们,可以先去网上查找一下资料,对其做一个初步的了解。
首先我们来看此模块的第一个测试题:
题目给了我们一张员工表,包含一些字段和几条数据如下所示:
可以看出,employees表中包含了6个字段,5条数据。我们来看题目的要求是什么
题目要求:
查看示例表,尝试检索出员工Bob Franco所在的部门。题目告诉我们已被授予所有管理权限,无需身份认证便可以访问所有数据。
那么问题简单了,我们只需要使用简单的SELECT语句便可以完成此题。本题使用的SELECT语句语法如下:
SELECT [列名] FROM [表名] where [列名] = {?}
其中:
- [列名] 为数据库表中列的名称。
a. 第一个列名为你想要检索出的列的名称,允许同时检索多列,列与列之间用英文状态下的“,”隔开,如果想要检索所有列,可以输入“*”代替所有列的名称;
b. 第二个列名表示条件的列名,允许同时有多个限定条件,每个条件之间使用AND或OR连接。 - [表名] 为数据库中表的名称,你想要从哪张表中检索出数据,就在此处填写该表的名称,允许同时检索多张表,表与表之间使用英文状态下的“,”隔开。
- {?} 为限定条件的数值,例如本题中的限定条件为员工Bob Franco,所以这里结合数据库表情况,填写Bob Franco。
从题目中可知,我们需要检索的列名为department,需要在employees这张表中查询数据,条件是first_name = ‘Bob’ and last_name = ‘Franco’。找出SQL中需要填写的数据后,我们开始编写SQL语句。
我们看到first_name字段只有一个Bob,所以我们可以使用下述SQL完成题目需求。
通关答案:
SELECT ep.department from employees ep where ep.first_name = 'Bob'
当然,你也可以严谨一些。
SELECT ep.department from employees ep where ep.first_name = 'Bob' and ep.last_name = 'Franco'
3.1.3 Data Manipulation Language(DML)
DML:数据库操作语言,用户存储、检索、修改和删除数据库中的数据,包含:
- SELECT——从数据库中检索信息
- INSERT——将数据插入到表中
- UPDATE——修改更新表中的现有数据
- DELETE——从数据库表中删除记录
题目要求:
解题思路:
题目让我们尝试去将员工Tobi Barnett所在的部门修改为Sales。题目告诉我们已被授予所有管理权限,无需身份认证便可以访问所有数据。
既然是修改数据,那么就要使用SQL中的UPDATE语句,本题要使用的UPDATE语法如下:
UPDATE [表名] SET [列名] = [新值] WHERE [列名] = {?}
其中:
- [表名] 为数据库中表的名称,想要修改哪张表中的数据,就在此处填写这张表的表名。
- [列名] 为数据表中列的名称。第一个列名表示想要修改的列的名称,第二个列名为限定条件的列的名称。
- [新值] 为修改的数据是什么,想要把这个列的数值修改成什么,就在此处填写什么。
- {?} 为限定条件。
从题目中的得知,我们要修改的表名为上一题的示例表employees,需要修改的列名为department,将department修改为Sales,修改谁的呢?修改first_name = 'Tobi ’ and last_name = 'Barnett’的。找出数据后,我们开始编写SQL。
通关答案:
查看源数据库表发现first_name = 'Tobi’的只有一条数据,所以,我们可以使用下条SQL完成本题:
UPDATE employees ep SET ep.department = 'Sales' WHERE ep.first_name = 'Tobi '
当然,还是建议大家严谨一点:
UPDATE employees ep SET ep.department = 'Sales' WHERE ep.first_name = 'Tobi ' AND ep.last_name = 'Barnett'
3.1.4 Data Definition Language(DDL)
DDL:数据库定义语言
包括:
- CREAT——创建数据库
- ALTER——更改现有数据库的结构
- DROP——从数据库中删除对象
题目要求:
解题思路:
题目要求我们去尝试将列“phone”增加到表employees中,列“phone”的数据类型为varchar(20)。本题考察的是对数据库定义语言的使用,修改现有数据库表结构的SQL要用到ALTER语句。
本题所用的ALTER语句如下:
ALTER TABLE [表名] ADD [新字段名] [数据类型];
其中:
- 表名:需要修改其结构的表名。
- 新字段名称:需要新增的字段名。
- 数据类型:新增字段的数据类型。
我们从题目中获取到须填写的数据,其中表名为employees,新字段名为phone,数据类型为varchar(20),通过上述的SQL语法编写SQL语句:
通关答案:
ALTER TABLE employees ADD phone varchar(20);
3.1.5 Data Control Language(DCL)
DCL:数据控制语言,用于创建用户和管理用户
包括:
- GRANT——赋予权限
- REVOKE——撤销权限
题目要求:
解题思路:
题目要求我们尝试授予“UnauthorizedUser”更改表的权限。授予用户权限就要用到DCL中的GRANT语句,本题所用的GRANT语法如下:
此处语法与详细内容参考CSDN博主「__Samual」的原创文章
原文链接:https://blog.csdn.net/m0_61491995/article/details/125755818
GRANT [权限] on [数据库名称.表名称] to [用户名@用户地址]
其中:
- 权限:需要赋予的权限,该字段的填下如下表所示,允许同时赋予多个权限,权限之间用英文状态下的“,”隔开。
- 数据库名称.表名称:需要赋予权限的相关数据库的名称.表名称,其中“.”为英文状态下,该字段可以用“*”代替,表示赋予用户服务器上所有数据库所有表的相关权限。
- 用户名@用户地址:用户地址可以是localhost,也可以是ip地址、机器名字、域名。也可以用’%'表示从任何地址连接。
可填写权限 | 说明 |
---|---|
ALL | 所有可用的权限 |
CREATE | 创建数据库、表、索引 |
LOCK_TABLES | 锁定表 |
ALTER | 修改表 |
DELETE | 删除表 |
INSERT | 插入表或列 |
SELECT | 检索表或列的数据 |
CREATE_VIEW | 创建视图 |
SHOW_DATABASES | 列出数据库 |
DROP | 删除库、表和视图 |
按照题目要求,编写SQL如下所示:
通关答案:
GRANT ALTER TABLE TO UnauthorizedUser
3.1.6 What is SQL injection?
本节主要简述什么是SQL注入。
SQL注入是一种常见的网络黑客技术,SQL注入攻击通过从客户端到应用程序的SQL查询语句中注入查询或插入的恶意代码。如果处理不当,让恶意代码注入应用程序可能会对数据完整性和安全性等产生严重影响。
后续为大家举了一个栗子,大家可以在下图所示的输入框中输入下方红色的代码,查看输入框下方的SELECT语句的变化,理解SQL注入的过程。
举个栗子:
查看页面上描述,可以看到,原代码如下所示。
"SELECT * FROM users WHERE name = '" + userName + "'"
通过这句代码,我们不难看出,这是一条通过用户名去查询该用户名在users表中数据的查询语句,其中" + userName + “为变量,用户在下方的输入框中输入的信息就会取代” + userName + "。
例如:
我们要查询Smith的用户信息,那么我们只需要在输入框中输入“Smith”,查询语句如下:
不难看出当前的查询语句的效果为从表users中查询名为Smith用户的信息。
但时,当我们在输入框中输入Smith’ OR ‘1’ ='1 可以看到:
SQL语句变成了:
"SELECT * FROM users WHERE name = 'Smith' OR '1' = '1' "
我们来一起解读下注入后的SQL语句:
“从表users中查询名为Smith或者1=1的用户信息”
众所周知 1 = 1 在正常情况下永远成立,两个查询条件之间使用OR连接,表示只要一个为真,整个表达式则为真。
所以这条SQL语句变成了查询所有用户的所有信息,这就会造成用户信息的泄露,这就是SQL注入。
3.1.9 Try It! String SQL injection
此题为SQL注入的实践题,大家可以在这里尝试一下各种选项查询出来的不同结果。
题目要求:
解题思路:
题目要求我们通过下面的下拉框选择相关的数据,检索出users表中的所有用户信息,我们无需知道任何特定的用户名就可以得到完整的列表。
首先,我们查看原代码是让我们输入lastName
其次,我们查看该字段的格式为’ “+ lastName +” ’
之后,我们进行分析如何注入:
- 明确输入后替换的部分是什么:
输入的内容将会代替 “+ lastName +”,例如我们输入Smith,则last_name = ’ Smith '; - 明确如何使得查询条件为永真:
我们要通过注入查询所有用户的信息,那么就要保证无论什么情况WHERE后的语句都为真,1 = 1 就可以解决这个问题; - 寻找突破方向:
现在的问题是如何将1 = 1注入进去?直接输入?那么last_name = ’ 1 =1 ',明显不行,要想进行SQL注入攻击,就要从外面的单引号 ‘’ 下手; - 寻找注入方式:
我们在输入的数据中插入‘’会发生什么呢?例如我们输入“ 1’ = '1 ”,那么last_name = ‘1’ = ‘1’,很明显,存在问题,查看全部的SQL语句,发现 SELECT * FROM users WHERE first_name = ‘John’ AND last_name = ‘1’ = ‘1’,出现了语法错误; - 明确连接条件:
如何才能让1=1成为一个单独的条件呢?我们考虑将OR注入进行,输入“ ’ OR ‘1’ = '1 ”,SQL语句变成了:SELECT * FROM users WHERE first_name = ‘John’ AND last_name = ’ ’ OR ‘1’ = ‘1’。很好,我们成功将OR ‘1’ = '1’注入了进去; - 明确注入内容与格式:
新的问题来了,前面的’‘号中没有输入,那么我们就随意注入一个名字进去。例如题目中的Smith,输入“Smith’ OR ‘1’ =’ 1 ”。SQL语句为:SELECT * FROM users WHERE first_name = ‘John’ AND last_name = 'Smith ’ OR ‘1’ = ‘1’,注入成功!
最后:我们选择注入的内容,尝试结果是否正确:
通关答案:
结果:
我们成功的获取了所有用户的信息,注入攻击成功!
3.1.10 Try It! Number SQL injection
数字SQL注入
题目要求:
解题思路:
题目要求我们使用两个输入字段,尝试从用户表中检索所有数据。并且这两个字段中,只有一个容易受到SQL注入的影响,需要找出是哪一个,才能成功检索出所有数据。
首先,查看原代码:
SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = '' + User_ID;
其次:确认需要输入的字段为:
- Login_Count:输入数据将替换" + Login_Count + "
- User_ID:输入后将将替换’’
之后:分析如何注入:
- 确认存在SQL注入漏洞的字段:
确认哪个字段可能存在SQL注入的漏洞,我们首先对两个输入位置的代码进行分析,存在单引号’'是SQL注入的关键,很明显,User_ID字段更有可能存在SQL注入漏洞; - 确认条件永真:
注入OR 1 = 1即可使得条件永真。 - 确认注入内容和格式
因为是数字类型的注入,所以我们不需要去加入单引号,所以注入内容为userid = 1 OR 1 = 1,Login_Count 我们随便输入数字即可。
最后:输入分析出的结果进行测试
通关答案:
结果
注入成功!
3.1.11 Compromising confidentiality with String SQL injection
使用字符串类型的SQL注入破坏应用程序的机密性测试题。
题目要求:
题目告诉我们:
我是个在大厂打工的叫John Smith的打工仔,这个公司有一个内部系统,用来让所有员工查看自己的内部数据(工作的部门和薪水)。该系统要求员工用唯一的身份验证TAN来查看数据,我的TAN为3SL99A。
现在,我觉得我老厉害了,我要确认自己是不是这个公司收入最高的打工仔,那么我就要查看所有打工仔工资。
现在,我已经扒出来了请求的查询语句为:
SELECT * FROM employees WHERE last_name = ' " + nane +" ' AND auth_tan = ' " + auth_tan " '
那么,怎样才能让我清醒清醒呢?
解题思路:
看完题目后,我们将目光放在SQL语句上:
首先:找到可能存在SQL注入漏洞的位置:我们发现,这两个位置都包含单引号’',都有可能受到SQL注入的攻击,由于两个条件之间用AND连接,所以那么我们需要将恶意代码注入到其中第二个即可;
其次:注入内容和方式:很明显,这是字符串注入,根据我们之前的注入经验,编写注入数据。只需要将OR 1 = 1注入则就会成功。
最后:输入数据并测验:(其实只要我们成功注入了OR 1 = 1,那么其他数据可以随意填写,并不需要填写数据里表中已存在的数据)
通关答案:
结果:
3.1.12 Compromising Integrity with Query chaining
题目要求:
上集概要:我为了知道我的工资是不是最高的,对公司内部系统进行了SQL注入攻击,获取到了所有的员工信息,如下图所示。
本集看点:我非法获取到所有员工的工资信息后,没想到真的有两个打工仔比我的工资高,他们就是Tobi和Bob。这我怎么能忍,既然犯法的事情都做了,那不如更进一步,我的脑海中冒出了修改自己的工资的念头,那么问题来了,我该怎么通过SQL注入修改自己的工资呢?(非法行为,请勿模仿!!这行为多多少少有点把别人当傻子了)
解题思路:
好了,我们来看我们上一题获取到的非法数据,我的工资为64350,而比我高的Tobi和Bob的工资分别是77000和83700。
现在我们只能通过系统提供的查询接口完成修改工资的违法行为,那么就意味着我们需要注入UPDATE语句。
首先:确认输入的字段:
- Employee Name:用户名
- Authentication Tan:唯一身份验证的TAN
其次:明确需要注入的语句为:
UPDATE employees SET SALARY = 999999 WHERE LAST_NAME = 'Smith'
之后:确认注入内容:
由上题的分析可知,我们需要将UPDATE语句注入到Authentication Tan中,编写需要注入的任意代码即可。
最后,执行代码,查看结果。
通关答案:
- Employee Name:Smith
- Authentication Tan:
1'; UPDATE employees SET SALARY = 999999 WHERE LAST_NAME = 'Smith'; --
结果
后记:
别问为什么他们的工资都变成10000了,问就是他们不配,哼~
3.1.13 Compromising Acailability
SQL注入影响可用性。
题目要求:
上集概要:我在犯法的道路上越走越远,在非法获取到他们的工资后,我嫉妒两个打工仔的工资比我高,所以,我通过非法的手段,将我的工资修改到最高。
本集看点:我成功将我的工资修改到最高,但是,access_log表将我的操作全部记录在其中,事到如今,我只能一不做二不休,今晚恰巧是一个月黑风高夜……
解题思路:
首先:确认要做的事情:删除表access_log
其次:确认要注入的语句:轻车熟路,需要注入:
DROP TABLE access_log
之后:确认注入恶意代码格式和内容:
1';DROP TABLE access_log;--
最后,执行代码。查看结果
通关答案:
1';DROP TABLE access_log;--
结果: