SQL注入:如何找到要攻击的url

信息安全 sql注入 网址
2021-08-13 17:38:17

我一直在阅读的最后几天,我看到的SQL injection大多数url示例如下:

get_int_filtered.php?id=1
get_int_groupby.php?id=1
get_int_having.php?id=1
get_int_img.php?id=1
get_int_inline.php?id=SELECT+name+FROM+users

(以上是一个小例子,包含在:sqlmapproject/testenv 中

我错过了有人如何发现这些要攻击的网址的部分。是手动任务吗?例如,通过检查浏览器开发人员工具来查看对网站后端/REST api 的调用?是否有一种工具可以扫描网站并提供列表urlsHTTP methods尝试使用(作为第二步)?

1个回答

SQL 注入:如何找到对 SQL 注入攻击较弱的 url。

首先,您必须了解不同类型的 SQLi,这里

我将在这里谈论经典的带内注入。分为2种:

  • 基于错误的 SQLi
  • 基于 UNION 的 SQLi

基于错误的 SQLI

目标:通过在目标网站上显示 SQL 错误来收集数据库结构信息。在某些情况下,您可以使用这些枚举整个数据库。

查找弱 URL:使用 Google Dorks。是的,谷歌正在帮助您查找弱网址。

  • 例子: inurl:"product.php?id=" site:.ru

在这里,您要求 Googleproduct.php?id=在 URL 中列出俄罗斯网站。

为什么?

因为我们想找到一个直接与数据库对话的页面。在大多数情况下,您想要搜索这些模式:*.php?parameter=n

好的,但是我怎么知道这个 URL 对 SQLi 来说是弱的?

您必须在参数编号之后放置一个'或,然后按回车键:%27

  • http[:]//w34ksite.com/product.php?id=1'

如果出现 SQL 错误,则该网站可能是可注入的。


基于 UNION 的 SQLI

目标:利用 UNION SQL 运算符将两个或多个 SELECT 语句的结果组合成一个结果。

以下块是我为我的信息安全学生写的材料。(进攻性安全课)

弱点:

http://w34ksite.com

第一步

查找可能发送 SQL 查询的 URL,如下所示:

http://w34ksite.com/products.php?category=1 此 URL 列出产品,在名为 1 的类别中重新分组

请记住* ? * = *,在大多数情况下,以结尾的 URL 将与 SQL 数据库通信,我们想利用这一点。

第二步

将 URL的一部分翻译products.php?category=1成 SQL 查询。是的,在这种情况下(以及许多生产中的网站),这段 URL 是一个伪装的 SQL 查询:

products.php?category=1 --> SELECT * FROM products WHERE category=1

第三步

我们可以注入类别参数吗?让我们尝试通过添加来对产品列表进行排序ORDER BY n,例如:

http://w34ksite.com/products.php?category=1 ORDER BY 1 没变化。

http://w34ksite.com/products.php?category=1 ORDER BY 2哇 !产品订单已更改!我们可能可以注入东西!

中的n数字ORDER BY n表示您从哪个表的列号对输出进行排序(在本例中为产品的表列 2)。所以等一下,如果我输入的数字超过了表格的最大数量会发生什么?让我们试试看。

http://w34ksite.com/products.php?category=1 ORDER BY 3 订单又变了。

http://w34ksite.com/products.php?category=1 ORDER BY 4哇!空白页!我们可以推断出产品的表格有3 列此信息对于使用 SQL UNION ALL运算符至关重要。

第四步

策划进攻。因此,例如,我们想要转储写入此数据库中的电子邮件地址。当然,电子邮件条目不在产品表中。他们应该在别处...当SQL错误直接出现在网页上时,您可以猜测表的名称等等,但是这次没有运气,w34ksite.com上没有出现SQL错误。所以让我们假设电子邮件的表名为email,因为我们知道这是这个 CMS 默认电子邮件的表名。

SELECT * FROM email--> http://w34ksite.com/email.php? 当然不是。谁会疯狂到创建一个列出数据库电子邮件的 PHP 页面?为什么不用password.php?

不要忘记这products.php?category=1是我们与数据库通信和注入东西的关键。这个键打开数据库的门,一般的想法是使用这个来显示电子邮件表的内容。那么为什么不显示产品表格内容(products.php?category=1)电子邮件表格内容呢?是的,这就是我们要做的。通过使用UNION ALL运算符。

UNION ALL 非常有用,您可以使用它加入另一个 SQL 请求。例如,让我们再次将此 URL 部分翻译成 SQL:

products.php?category=1 -->SELECT * FROM products WHERE category=1对吗?

我们现在将使用 UNION ALL 运算符添加新查询并尝试获取电子邮件表:

SELECT * FROM products WHERE category=1UNION ALL SELECT *, NULL, NULL FROM email

我们应该有这样的东西:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

等等,什么是 *, NULL, NULL ?

还记得http://w34ksite.com/products.php?category=1 ORDER BY 4我们是否可以注入东西的测试吗?我们得到一个非常有价值的信息:产品表的列数。使用UNION ALL运算符时,表的列号必须相同。

  • NULL: 伪造一个空列。
  • , : 将一列与另一列分开
  • * :显示该列的条目

如果没有任何反应,请尝试*像这样移动:

http://w34ksite.com/products.php?category=1 UNION ALL SELECT *, NULL, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, *, NULL FROM email

http://w34ksite.com/products.php?category=1 UNION ALL SELECT NULL, NULL, * FROM email