天天看点

如何防止SQL注入攻击

作者:喜欢编码的社畜
如何防止SQL注入攻击

什么是 SQL 注入?

SQLi 是一种基于 Web 的应用程序攻击,攻击者可以在网站的数据库中运行恶意查询。SQL是一种用于执行恶意SQL语句的代码注入技术。

例如,如果你想登录网站,但忘记了用户名和密码,通过使用SQLi注入,我们可以在不知道密码的情况下登录或访问网页。

SQL 注入是如何工作的?

SQL 注入包含通过应用程序中来自客户端的输入数据插入或注入 SQL 查询。这些被注入到影响预定义 SQL 命令的数据平面中。

SQL 注入攻击针对动态 SQL 语句中的漏洞。将动态 SQL 语句想象成一个多元数学函数,其参数是固定的,而结果由放置在自变量中的值决定。

同样,动态 SQL 语句也由一组预定义的参数(例如 Web 表单)组成,并且只有在用户提供输入时才会生成完整的语句。

请参阅以下登录表单的 SQL 语句示例:

SELECT  *  FROM users WHERE username =  '$username'  AND password = bcrypt ('$password' )           

当用户输入用户名和密码时,语句完成。然后向服务器发送查询以从数据库中检索用户信息。

如果动态 SQL 语句中存在漏洞,攻击者可以以某种形式输入复杂的脚本来破坏现有参数并更改整个语句的含义。

如何防止SQL注入攻击

带内 SQLi:带内 SQL 注入是一种 SQL 注入,攻击者通过相同的通信通道接收结果作为直接响应。例如,如果攻击者通过她的网络浏览器手动发起攻击,则攻击结果将显示在她的同一个网络浏览器中。带内 SQL 注入也称为传统 SQL 注入。

基于错误的 SQL 注入—— 攻击者在此执行某些操作,导致数据库生成错误消息。您可以使用错误消息来确定正在使用的数据库、处理程序正在使用的服务器版本等。

基于联合的 SQL 注入 —数据库生成的用于获取单个 HTTP 响应的语句。您可以在 URL 中构造查询或在输入字段中组合多个语句来尝试生成答案

Blind SQLi : Blind SQL injection是一种SQL注入,攻击者不会从被攻击的数据库中得到明确的响应,而是观察数据库服务器和应用程序的行为,以增量方式重建数据库结构。SQL 盲注也称为推理 SQL 注入。

基于布尔值—— 在这里,攻击者向数据库发送 SQL 查询,并要求应用程序根据查询返回 True 还是 False 返回不同的结果。

基于时间——在这种攻击中,攻击者向数据库提交 SQL 查询,并导致数据库在共享结果之前等待指定的时间量。响应时间帮助攻击者确定查询是真还是假。

Out-of-Band SQLi:带外 SQL 注入 (OOB SQLi) 是一种 SQL 注入,在这种注入中,攻击者不会通过同一通信通道收到来自被攻击应用程序的响应,但可能会被诱骗发送数据传输到由攻击者控制的远程端点。只有当您使用的服务器具有触发 DNS 或 HTTP 请求的命令时,带外 SQL 注入才有可能。但是,这适用于所有流行的 SQL 服务器。

SQLi 示例

如何防止SQL注入攻击

第一个例子非常简单。它展示了攻击者如何使用 SQL 注入漏洞绕过应用程序安全并以管理员身份进行身份验证。

以下脚本是在 Web 服务器上执行的伪代码。这是一个使用用户名和密码进行身份验证的简单示例。示例数据库有一个以users下列命名的表:username和password。

# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']

# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”

# Execute the SQL statement
database.execute(sql)           

这些输入字段容易受到 SQL 注入攻击。攻击者可以在输入中使用 SQL 命令,从而改变数据库服务器执行的 SQL 语句。例如,他们可以使用涉及单引号的技巧并将passwd字段设置为:

password' OR 1=1           

结果,数据库服务器运行以下 SQL 查询:

SELECT id FROM users WHERE username = 'username'  AND password = 'password'  OR  1 = 1 '           

由于该OR 1=1语句,无论和是什么,该WHERE子句都返回表中的第id一个。数据库中的第一个用户通常是管理员。这样,攻击者不仅可以绕过身份验证,还可以获得管理员权限。他们还可以注释掉 SQL 语句的其余部分,以进一步控制 SQL 查询的执行

-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16           

如何防止 SQL 注入?

可以应用以下策略来防止 SQL 注入攻击。

  1. 永远不要相信用户输入。在动态 SQL 语句中使用它们之前,应始终对它们进行清理。

    存储过程——允许您封装 SQL 语句并将所有输入视为参数。

  2. Prepared Statements——准备好的语句,首先构建 SQL 语句,然后将提交的用户数据作为参数处理。这不会影响 SQL 语句的语法。

    正则表达式 — 可用于检测潜在的恶意代码并在执行 SQL 语句之前将其删除。

  3. 数据库连接用户权限——用于连接数据库的帐户应该只被授予必要的权限。这有助于降低服务器上 SQL 语句的性能。
  4. 错误消息——这些消息不会泄露敏感信息或错误的确切位置。“抱歉,出现技术错误。我已经联系了技术团队。稍后再试”,而不是显示导致错误的 SQL 语句。

防止 SQL 注入攻击的唯一方法是设置输入验证。这意味着应该监视和清理用户输入,以过滤掉潜在的恶意代码。

这正是 Web 应用程序防火墙 (WAF) 所做的。分析对Web 应用程序的所有用户输入,以查找与可疑代码的匹配项。

如果你发现我的任何文章对你有帮助或者有用,麻烦点赞或者转发。 谢谢!SQL:注入攻击

继续阅读