【WebGoat通关思路】Injection / SQL Injection (intro)

网友投稿 344 2022-10-02


【WebGoat通关思路】Injection / SQL Injection (intro)

康创护网研习社是广州康创信息科技有限公司旗下的社群,专注于护网行动的安全服务公司,不定期发布人员需求,与主流网络安全厂商建立了合作关系。旨在为每年的大型网络安全保护行动(护网、重保等业务)提供高质量可靠的安全人员。为社群优秀的小伙伴提供学习实践机会和丰厚报酬以及大厂实践经历。

SQL Injection (intro) / Lesson 1

概念

本课介绍了什么是结构化查询语言(SQL),以及如何操纵它来执行并非开发者原意的任务。

目标

用户将对SQL的工作原理和用途有基本的了解。 用户将基本了解什么是SQL注入以及它是如何工作的。 用户将展示以下方面的知识。 DML, DDL 和 DCL 字符串SQL注入 数值型SQL注入 SQL注入是如何违反CIA三原则的

SQL Injection (intro) / Lesson 2

什么是SQL?

SQL是一种标准化的(1986年为ANSI,1987年为ISO)编程语言,用于管理关系型数据库和对其中的数据进行各种操作。

一个数据库是一个数据的集合。数据被组织成行、列和表,并被编入索引,以使寻找相关信息更加有效。

例如,包含雇员数据的SQL表;该表的名称是 "employees":

Employees Table

userid first_name last_name department salary auth_tan
32147 Paulina Travers Accounting $46.000 P45JSI
89762 Tobi Barnett Development $77.000 TA9LL1
96134 Bob Franco Marketing $83.700 LO9S2V
34477 Abraham Holman Development $50.000 UU2ALK
37648 John Smith Marketing $64.350 3SL99A

一家公司在其数据库中保存了以下员工信息:唯一的员工编号('userid'),姓氏,名字,部门,工资和交易认证号码('auth_tan')。这些信息中的每一条都存储在一个单独的列中,每一行都代表该公司的一个员工。

SQL查询可以用来修改数据库表及其索引结构,并添加、更新和删除数据行。

有三个主要类别的SQL命令。

数据操作语言(DML) 数据定义语言(DDL) 数据控制语言(DCL)

这些命令类型中的每一个都可以被攻击者用来破坏系统的保密性、完整性和/或可用性。继续学习本课,了解更多关于SQL命令类型以及它们与保护目标的关系。

如果你还在纠结于SQL,需要更多的信息或练习,你可以访问 Bob Franco 的部门。请注意,在这项任务中,你已经被授予了完全的管理员权限,可以不经认证而访问所有的数据。

解题思路

这题比较简单,考察SQL查询,检索雇员Bob Franco的部门,输入以下SQL语句即可通关:

SELECT department FROM employees WHERE first_name='Bob' AND last_name='Franco';

SQL Injection (intro) / Lesson 3

数据操纵语言(DML)

正如其名称所暗示的,数据操作语言处理的是数据的操作。许多最常见的SQL语句,包括SELECT、INSERT、UPDATE和DELETE,都可以归类为DML语句。DML语句可用于请求记录(SELECT),添加记录(INSERT),删除记录(DELETE),以及修改现有记录(UPDATE)。

如果攻击者成功地将DML语句注入SQL数据库,他可以侵犯系统的保密性(使用SELECT语句)、完整性(使用UPDATE语句)和可用性(使用DELETE或UPDATE语句)。

DML命令用于存储、检索、修改和删除数据。 SELECT - 从数据库中检索数据 INSERT - 在数据库中插入数据 UPDATE - 更新数据库中的现有数据 DELETE - 从数据库中删除记录 例子: 检索数据: SELECT phone FROM employees WHERE userid = 96134; 这条语句检索了用户ID为96134的雇员的电话号码

现在轮到你了!

尝试将 Tobi Barnett 的 department 改为"Sales"。请注意,在这项任务中,你已经被授予了完全的管理员权限,可以不经认证而访问所有数据。

解题思路

这题比较简单,考察 SQL UPDATE 操作,将 Tobi Barnett 的 department 改为"Sales",输入以下SQL语句即可通关:

UPDATE employees SET department='Sales' WHERE first_name='Tobi' AND last_name='Barnett';

SQL Injection (intro) / Lesson 4

数据定义语言(DDL)

数据定义语言包括用于定义数据结构的命令。DDL命令通常用于定义数据库的模式。模式是指数据库的整体结构或组织,在SQL数据库中,包括诸如表、索引、视图、关系、触发器等对象。

如果一个攻击者成功地将DDL类型的SQL命令注入数据库,他可以侵犯系统的完整性(使用ALTER和DROP语句)和可用性(使用DROP语句)。

DDL命令用于创建、修改和删除数据库对象的结构。 CREATE - 创建数据库对象,如表和视图 ALTER - 改变现有数据库的结构 DROP--从数据库中删除对象 例子: CREATE TABLE employees( userid varchar(6) not null primary key, first_name varchar(20), last_name varchar(20), department varchar(20), salary varchar(10), auth_tan varchar(6) ); 这条语句创建了第2页上给出的雇员示例表。

现在尝试修改模式,在表"employees"中添加列"phone"(varchar(20))。

解题思路

这题比较简单,考察 SQL ALTER 操作,在表"employees"中添加列"phone"(varchar(20)),输入以下SQL语句即可通关:

ALTER TABLE employees ADD phone varchar(20);

SQL Injection (intro) / Lesson 5

数据控制语言(DCL)

数据控制语言用于在数据库中实现访问控制逻辑。DCL可以用来撤销和授予用户对数据库对象的权限,如表、视图和函数。

如果攻击者成功地将DCL类型的SQL命令注入到数据库中,他可以侵犯系统的机密性(使用GRANT命令)和可用性(使用REVOKE命令)。例如,攻击者可以授予自己在数据库中的管理权限,或者撤销真正的管理员的权限。

DCL 命令被用来实现对数据库对象的访问控制。 GRANT - 给予一个用户在数据库对象上的访问权限 REVOKE - 撤销之前使用GRANT授予的用户权限

尝试将表grant_rights的权限授予用户unauthorized_user:

解题思路

这题比较简单,考察 SQL GRANT 操作,将表grant_rights的权限授予用户unauthorized_user,输入以下SQL语句即可通关:

GRANT ALL PRIVILEGES ON grant_rights TO unauthorized_user;

SQL Injection (intro) / Lesson 6

什么是SQL注入?

SQL注入(也称为SQLi)是最常见的网络黑客技术之一。SQL注入攻击包括通过从客户端到应用程序的SQL查询输入插入或注入恶意代码。如果不正确处理,SQL注入会严重影响数据的完整性和安全性。

当来自客户端的未经过滤的数据,如来自搜索字段的输入,进入应用程序本身的SQL解释器,就会发生SQL注入。如果一个应用程序不能正确地净化用户输入(使用准备好的语句或类似的),或针对特殊字符过滤输入,黑客就可以操纵底层的SQL语句,使之对他们有利。

例如,如果输入没有过滤SQL元字符,如--(注释行的其余部分)或;(结束一个SQL查询),就可能导致SQL注入。

SQL注入的例子

例如,考虑一个网络应用程序,该程序允许用户仅仅通过在一个表格字段中输入用户名来检索用户信息。用户的输入被发送到服务器,并被插入到一个SQL查询中,然后由一个SQL解释器处理。

从数据库中检索用户信息的SQL查询如下。

"SELECT * FROM users WHERE name = '" + userName + "'";

变量userName持有来自客户端的输入,并将其注入到查询中。

如果输入的是Smith,那么查询将变成

"SELECT * FROM users WHERE name = 'Smith'";

并会检索出名字为Smith的用户的所有数据。

如果攻击者输入的数据含有对SQL解释器有"特殊"意义的字符或字符串(如;、--或'),而这些数据没有经过正确的消毒或验证,攻击者可以修改SQL查询的预期行为,以便在数据库中执行其他(恶意的)行动。

这里是一个输入字段。尝试在这里输入一些SQL,以更好地理解查询的变化。

"SELECT * FROM users WHERE name = ''";

实例

SQL注入的用途远不止是读取一个用户的数据。以下是黑客在表单字段(或接受用户输入的任何地方)输入数据,试图利用SQL注入漏洞的几个例子。

Smith' OR '1' = '1 结果是 SELECT * FROM users WHERE name = 'Smith' OR TRUE; 这将返回用户表中的所有条目 Smith' OR 1 = 1; -- 结果是 SELECT * FROM users WHERE name = 'Smith' OR TRUE;--'; 这和第一个例子一样,也将返回用户表中的所有条目 Smith'; DROP TABLE users; TRUNCATE audit_log; -- 使用多条SQL命令,以便既DROP用户表,又删除审计日志表中的所有条目

SQL Injection (intro) / Lesson 7

SQL注入的后果

一个成功的SQL注入的利用可以:

读取和修改数据库中的敏感数据 在数据库上执行管理操作 关闭审计或数据库管理系统 截断表和日志 添加用户 恢复DBMS文件系统上的特定文件的内容 向操作系统发布命令

SQL注入攻击允许攻击者

伪造身份 篡改现有数据 导致拒付问题,如废止交易或改变余额 允许完全披露系统中的所有数据 销毁数据或使其无法使用 成为数据库服务器的管理员

SQL Injection (intro) / Lesson 8

SQL注入的严重性

SQL注入攻击的严重性受限于

攻击者的技能和想象力 深度防御的对策 输入验证 最低权限 数据库技术

不是所有的数据库都支持命令链

微软Access MySQL Connector/J和C 甲骨文

SQL注入在PHP、经典ASP、Cold Fusion和旧语言中比较常见

不提供参数化查询支持的语言 参数化查询已被添加到较新的版本中 网络技术的早期采用者(即旧代码)

不是所有的数据库都是一样的(SQL Server)

命令外壳:master.dbo.xp_cmdshell 'cmd.exe dir c:' 注册表命令:xp_regread, xp_regdeletekey, ...

SQL Injection (intro) / Lesson 9

试试吧! 字符串SQL注入

代码中的查询建立了一个动态查询,正如在前面的例子中看到的那样。该查询是通过串联字符串建立的,这使得它容易受到字符串SQL注入的影响。

"SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'";

试着使用下面的表格来检索用户表中的所有用户。你应该不需要知道任何具体的用户名来获得完整的列表。

解题思路

这题比较简单,选择如下图所示即可通关:

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 = 'Smith' OR TRUE;

SQL Injection (intro) / Lesson 10

试试吧! 数值型SQL注入

代码中的查询建立了一个动态查询,正如在前面的例子中看到的。代码中的查询通过连接一个数字建立了一个动态查询,使其容易受到Numeric SQL注入的影响。

"SELECT * FROM user_data WHERE login_count = " + Login_Count + " AND userid = " + User_ID;

使用下面的两个输入字段,尝试从用户表中检索所有的数据。

警告:这些字段中只有一个字段容易受到SQL注入的影响。你需要找出其中一个字段,以成功检索所有数据。

解题思路

这题比较简单,选择如下图所示即可通关:

SELECT * From user_data WHERE Login_Count = 1 and userid= 1 or 1=1;

SQL Injection (intro) / Lesson 11

用字符串SQL注入破坏机密性

如果一个系统容易受到SQL注入的攻击,那么该系统的CIA三要素就很容易被破坏(如果你对CIA三要素不熟悉,请查看一般类别中的CIA三要素课程)。在下面的三节课中,你将学习如何使用SQL字符串注入或查询链等技术破坏CIA三元组的每个方面。

在这一课中,我们将看一下保密性。保密性很容易被使用SQL注入的攻击者破坏;例如,成功的SQL注入可以让攻击者从数据库中读取信用卡号码等敏感数据。

什么是字符串SQL注入?

如果一个应用程序只是通过连接用户提供的字符串来建立SQL查询,该应用程序很可能非常容易受到字符串SQL注入的影响。更具体地说,如果一个用户提供的字符串只是简单地串联到一个SQL查询,而没有任何消毒或准备,那么你可能会通过简单地在一个输入字段中插入引号来修改查询的行为。例如,你可以用引号来结束字符串参数,然后再输入你自己的SQL。

现在轮到你了!

你是一个名叫 John Smith 的雇员,在一家大公司工作。公司有一个内部系统,允许所有员工看到他们自己的内部数据,如他们工作的department 和他们的salary。

该系统要求员工使用一个独特的认证TAN来查看他们的数据。

你目前的TAN是3SL99A

由于你总是有成为高薪员工的冲动,你想利用这个系统,不查看自己的内部数据,而是看看你所有同事的数据,查看他们目前的工资。

使用下面的表格,尝试从employees表中检索所有的雇员数据。你应该不需要知道任何特定的名字或TAN来获得你需要的信息。

你已经发现,执行你的请求的查询看起来是这样的:

"SELECT * FROM employees WHERE last_name = '" + name + "' AND auth_tan = '" + auth_tan + "'";

解题思路

本题通过字符型SQL注入,注意区分数值型SQL注入。

SQL Injection (intro) / Lesson 12

用查询链破坏完整性

在上一课中破坏了数据的机密性之后,这次我们要通过使用SQL查询链来破坏数据的完整性。

如果存在足够严重的漏洞,SQL注入可能被用来破坏数据库中任何数据的完整性。成功的SQL注入可能允许攻击者改变他甚至不应该访问的信息。

什么是SQL查询链?

查询链正是它听起来的样子。通过查询链,你试图将一个或多个查询附加到实际查询的末端。你可以通过使用;元字符来做到这一点。;标志着一个SQL语句的结束;它允许人们在初始查询之后立即开始另一个查询,甚至不需要开始一个新的行。

现在轮到你了!

你刚刚发现,Tobi和Bob似乎都比你挣得多!这时,你就会发现,Tobi和Bob都比你挣得多。当然,你不能就这么算了。

最好去改变你自己的工资,这样你就能赚到最多的钱了!

记住:你的名字是John Smith,你目前的TAN是3SL99A。

解题思路

本题只有两个输入框,所以想要修改工资就需要额外执行更多语句,应该想到用‘;’分割继续执行语句或者使用union连接多个语句等等。

Employee Name: Smith Authentication TAN: 3SL99A';UPDATE employees SET salary=100000 WHERE last_name='Smith

SQL Injection (intro) / Lesson 13

破坏可用性

在前面的课程中成功地破坏了保密性和完整性之后,我们现在要破坏CIA三要素中的第三个要素:可用性。

有许多不同的方法可以破坏可用性。如果一个账户被删除或其密码被更改,实际拥有者就不能再访问这个账户。攻击者也可以尝试删除数据库的部分内容,甚至删除整个数据库,以使数据无法访问。撤销管理员或其他用户的访问权限是破坏可用性的另一种方式;这将阻止这些用户访问数据库的特定部分,甚至整个数据库。轮到你了!

现在你是你公司的头号收入者。但是你看到了吗?似乎有一个access_log表,你的所有行为都被记录在里面了!你最好去把它完全删除,免得别人知道。

最好在别人注意到之前把它彻底删除。

解题思路

本题通过字符型注入来破坏可用性,也就是让原本被授权的人无法读取或操作某些文件。

要求把access_log整个删除,因此用DROP TABLE,而不是TRUNCATE。

Action contains: 1';DROP TABLE access_log;-- ss

加入社群


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Spring的注解@Qualifier小结
下一篇:【WebGoat通关思路】General / Crypto Basics(webgoat使用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~