本文介绍了如何使用 SQLMAP 渗透测试工具来测试网站是否可以避免 SQL 注入。
什么是 SQL 注入?
SQL 注入是一种代码注入技术,攻击者可以在其中执行控制 Web 应用程序数据库的恶意 SQL 查询。通过正确的查询集,用户可以访问存储在数据库中的信息。 SQLMAP 测试“GET”参数是否易受 SQL 注入攻击。
例如,考虑以下PHP代码段:
$variable = $_POST['input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$variable')");
如果用户输入“值”); DROP TABLE table;–”作为输入,查询变成
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
这对我们来说是不可取的,因为这里用户输入与预先编写的 sql 查询一起直接编译。因此,用户将能够输入操作数据库所需的 sql 查询。
在哪里可以使用 SQLMAP?
如果您观察到形式为 http://testphp.vulnweb.com/listproducts 的网址。 PHP? cat=1 ,其中 ‘GET’ 参数为粗体,则该网站可能容易受到这种 SQL 注入模式的攻击,攻击者可能能够访问数据库中的信息。此外,SQLMAP 在基于PHP时也能工作。
检查您的网站是否易受攻击的简单测试是将 get 请求参数中的值替换为星号 (*)。例如,
http://testphp.vulnweb.com/listproducts.php?cat=*
如果这导致错误,例如上面给出的错误,那么我们可以断定该网站是易受攻击的。
安装 sqlmap
SQLMAP 预装在 kali linux 中,这是大多数渗透测试人员的首选。但是,您可以使用以下命令在其他基于 debian 的 linux 系统上安装 sqlmap
sudo apt-get install sqlmap
用法
在本文中,我们将使用一个设计有漏洞的网站进行演示:
http://testphp.vulnweb.com/listproducts.php?cat=1
可以看到,有一个GET请求参数(cat = 1),用户可以通过修改cat的值来改变。所以这个网站可能容易受到这种 SQL 注入的攻击。
为了对此进行测试,我们使用 SQLMAP。要查看可以传递的参数集,请在终端中键入,
sqlmap -h
我们将用于基本 SQL 注入的参数如上图所示。除了这些,我们还将使用 -dbs 和 -u 参数,其用法已在步骤 1 中说明。
使用 SQLMAP 测试网站是否存在 SQL 注入漏洞:
- 步骤 1:列出有关现有数据库的信息
因此,首先,我们必须输入要检查的网址以及 -u 参数。如果我们希望使用代理测试网站,我们也可以使用 –tor 参数。现在通常,我们想要测试是否可以访问数据库。所以我们使用 –dbs 选项来做到这一点。 –dbs 列出所有可用的数据库。
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1 --dbs
- 我们得到以下输出,显示有两个可用的数据库。有时,应用程序会告诉您它已识别数据库并询问您是否要测试其他数据库类型。您可以继续输入“Y”。此外,它可能会询问您是否要测试其他参数的漏洞,在此处键入“Y”,因为我们要彻底测试 Web 应用程序。
- 我们观察到它们是两个数据库,acuart 和 information_schema
- 步骤 2:列出有关特定数据库中存在的表的信息
要尝试访问任何数据库,我们必须稍微修改我们的命令。我们现在使用 -D 来指定我们希望访问的数据库的名称,一旦我们可以访问该数据库,我们就会想看看我们是否可以访问这些表。为此,我们使用 –tables 查询。让我们访问 acuart 数据库。
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1
-D acuart --tables
-
在上图中,我们看到已检索到 8 个表。所以现在我们肯定知道该网站是易受攻击的。
- 第 3 步:列出有关特定表的列的信息
如果要查看特定表的列,可以使用如下命令,其中-T指定表名,-columns查询列名。我们将尝试访问表“艺术家”。
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1
-D acuart -T artists --columns
- 第 4 步:转储列中的数据
同理,我们可以通过如下命令访问特定列的信息,其中-C可以指定多个以逗号分隔的列名,-dump查询检索数据
sqlmap -u http://testphp.vulnweb.com/listproducts.php?cat=1
-D acuart -T artists -C aname --dump
- 从上图可以看出,我们已经访问了数据库中的数据。同样,在这种易受攻击的网站中,我们可以从字面上通过数据库进行探索以提取信息
防止 SQL 注入
通常可以通过使用Prepared Statements来防止 SQL 注入。当我们使用准备好的语句时,我们基本上是在使用代码模板,并分别分析代码和用户输入。它不会混合用户输入的查询和代码。在本文开头给出的例子中,用户输入的输入直接插入到代码中并一起编译,因此我们可以执行恶意代码。对于准备好的语句,我们基本上发送带有用户输入占位符的 sql 查询,然后将实际用户输入作为单独的命令发送。
考虑以下PHP代码段。
$db = new PDO('connection details');
$stmt = db->prepare("Select name from users where id = :id");
$stmt->execute(array(':id', $data));
在此代码中,用户输入未与准备好的语句组合。它们是分开编译的。因此,即使恶意代码作为用户输入输入,程序也会简单地将代码的恶意部分视为字符串而不是命令。
注意:此应用程序仅用于测试目的
相关文章
基本的 SQL 注入和缓解
参考: stackoverflow.com