网站安全之php防止注入攻击代码如何检测SQL注入的存在?(图)防止sql注入 php
2022-12-24
我们如何保护我们的代码免受黑客和不良行为者的侵害?
SQL 注入是一种网络安全漏洞,攻击者可以利用它来更改对数据库的 SQL 查询。 这可用于检索一些敏感信息,例如数据库结构、表、列及其基础数据。
例如,假设应用程序使用以下查询来获取某人的登录详细信息:
SELECT USERNAME,PASSWORD from USERS where USERNAME='' AND PASSWORD=' ';
这里, 和 是用户提供的输入。 假设攻击者' OR '1'='1 在两个字段中都给出了输入。 所以 SQL 查询类似于:
SELECT USERNAME,PASSWORD from USERS where USERNAME='' OR '1'='1' AND PASSWORD='' OR '1'='1';
查询生成正确的语句,因此用户已登录。此示例描述了最基本的 SQL 注入类型。
SQL 注入可以在任何地方使用小程序开发,从数据库中获取任何敏感信息。
注意:这是最基本的示例,仅供理解之用。 在现实世界中你几乎找不到这样的案例。
您可以使用此备忘单了解如何查询不同的 SQL 数据库提供程序。
如何检测SQL注入的存在?
在大多数情况下,可以通过提供无效参数(例如',' 'a' 或 1=1--, "a"" 或 1=1--" 或 a = a, a' '0)轻松检测到 SQL 注入:0:10'--, 1 '0:0:10'--, %26,' or like '%, etc. 然后你可以观察应用程序行为的变化。
您可以尝试分析服务器响应的长度以及发送响应所需的时间。 ',a' 或 1=1-- 等有效载荷可能会显示数据库服务器响应的变化。 但如果没有变化网站安全之php防止注入攻击代码,那么我们会尝试触发一个时间延迟 a' '0:0:10'-- 使用这样的有效负载。 这可能会在发送响应之前延迟服务器一定时间。
在确定网站是否存在SQL漏洞后,我们可以尝试从数据库中提取一些敏感信息。
在此之前网站优化,我们需要确定 of 查询返回的是什么。 这很重要,因为如果我们尝试获取的列数不等于查询实际返回的列数,那么它将返回错误。
我们可以使用 by 命令确定列数。 例如:
[www.onlineshopping.com/products.php?pid=8](http://www.onlineshopping.com/products.php?pid=8) order by 1 -- // www.onlineshopping.com/products.php?pid=8 order by 2 -- //// If the parameter is a string then you need to add ' after it.www.onlineshopping.com/products.php?usr=b' order by 3 -- // www.onlineshopping.com/products.php?usr=a' order by 4 -- //
-- 的意义在于它是 SQL 中的注释指示符,它使查询的其余部分成为注释。 现在为了保留 --,我们在它后面附加任何字符,以便它出现在 HTTP 中。 根据 SQL 数据库提供程序,我们还可以使用 # 或 /* */ 进行注释。
继续此过程,直到遇到错误。 如果按 5 使用负载时出现错误,但按 4 使用负载时没有出现错误,这意味着查询返回 4 列。
如何利用 SQL 注入
一旦您知道应用程序易受 SQL 注入攻击并且您确定了列数网站安全之php防止注入攻击代码,我们将尝试查找有关数据库的必要信息,例如数据库名称、数据库用户名、数据库、所需表等。检查 SQL注入备忘单以找到相应的查询。
基于错误的 SQL 注入类型:这种类型的 SQL 注入依赖于数据库服务器抛出的错误,这可能会为我们提供一些有关数据库结构的有用信息。 基于联合:此技术使用 SQL 运算符组合两个查询的结果并返回单个表。 通过将结果附加到对数据库进行的原始查询,攻击者可以从其他表中提取信息。 盲注:当应用程序易受 SQL 攻击但 SQL 的结果未在 HTTP 中返回时,就会发生这种情况。 在这种情况下,我们查询数据库中的任何 true/ 并查看 true 和条件的变化。 它有两种类型: 基于内容:在这种技术中,当发送真实条件和条件时,将使用任何条件语句查询数据库服务器,并分析服务器中的条件差异。 基于时间:此技术依赖于注入 SQL 查询,使数据库根据指定条件等待特定时间。 服务器发回响应所花费的时间决定了查询是真还是假。 带外注入(不常见):这不是一种非常常见的 SQL 类型,因为它取决于数据库服务器上启用的功能。 它依赖于数据库服务器发出类似 HTTP、DNS 和 ftp 的 Web 请求的能力来向攻击者发送数据。 如何保护您的代码免受 SQL 注入攻击? 切勿直接根据用户输入构建查询。 相反,使用参数化语句。 它们确保安全地处理传递给 SQL 查询的输入。 净化用户输入总是一件好事。 此外,应进行适当的输入验证,例如姓名不能是数字或电话号码不能是字母。 但是,它有时可以被绕过。 使用安全驱动程序与 SQL 数据库交互。 它们会自动阻止所有 SQL 注入攻击。 例如,适用于 . SQL Map 是一种用于处理和注入 SQL 漏洞的开源工具。 这个存储库上有一些很酷的 SQL 资源。 它包括一些备忘单和许多有用的有效载荷,可以根据用例使用。
译自: