开发安全之:SQL Injection

这篇具有很好参考价值的文章主要介绍了开发安全之:SQL Injection。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Overview

调用通过不可信赖的数据源输入构建的 SQL 查询 mysql_query()。通过这种调用,攻击者能够修改语句的含义或执行任意 SQL 命令。

Details

SQL injection 错误在以下情况下发生:

1. 数据从一个不可信赖的数据源进入程序。

2. 数据用于动态地构造一个 SQL 查询。 这种情况下,数据被传递给代码中的 mysql_query()。

例 1:以下代码动态地构造并执行了一个 SQL 查询,该查询可以搜索与指定名称相匹配的项。该查询仅会显示条目所有者与被授予权限的当前用户一致的条目。

$userName = $_SESSION['userName']; $itemName = $_POST['itemName'];

$query = "SELECT * FROM items WHERE owner = '$userName' AND itemname = '$itemName';";

$result = mysql_query($query);

查询计划执行以下代码:

SELECT * FROM items WHERE owner = <userName> AND itemname = <itemName>;

但是,由于这个查询是动态构造的,由一个不变的查询字符串和一个用户输入字符串连接而成,因此只有在 itemName 不包含单引号字符时,才会正确执行这一查询。如果一个用户名为 wiley 的攻击者为 itemName 输入字符串“name' OR 'a'='a”,那么查询就会变成:

SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name' OR 'a'='a';

附加条件 OR 'a'='a' 会使 where 从句永远评估为 true,因此该查询在逻辑上将等同于一个更为简化的查询: SELECT * FROM items;

通常,查询必须仅返回已通过身份验证的用户所拥有的条目,而通过以这种方式简化查询,攻击者就可以规避这一要求。现在,查询会返回存储在 items 表中的所有条目,而不论其指定所有者是谁。

示例 2:此示例说明了将不同的恶意值传递给Example 1.中构造和执行的查询所带来的影响。如果一个用户名为 wiley 的攻击者为 itemName 输入字符串“name'; DELETE FROM items; --”,则该查询就会变为以下两个查询:

SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name';

DELETE FROM items; --'

众多数据库服务器,其中包括 Microsoft(R) SQL Server 2000,都可以一次性执行多条用分号分隔的 SQL 指令。对于那些不允许运行用分号分隔的批量指令的数据库服务器,比如 Oracle 和其他数据库服务器,攻击者输入的这个字符串只会导致错误;但是在那些支持这种操作的数据库服务器上,攻击者可能会通过执行多条指令而在数据库上执行任意命令。 注意末尾的一对连字符 (--);这在大多数数据库服务器上都表示该语句剩余部分将视为注释,不会加以执行 [4]。在这种情况下,可通过注释字符删除修改后的查询遗留的末尾单引号。而在不允许通过这种方式使用注释的数据库上,攻击者通常仍可使用类似于Example 1.中所用的技巧进行攻击。

如果攻击者输入字符串“name'); DELETE FROM items; SELECT * FROM items WHERE 'a'='a”,将创建以下三个有效语句:

SELECT * FROM items WHERE owner = 'wiley' AND itemname = 'name';

DELETE FROM items;

SELECT * FROM items WHERE 'a'='a';

避免 SQL injection 攻击的传统方法之一是,作为一个输入验证问题来处理,只接受列在安全值允许列表中的字符,或者识别并避免列在潜在恶意值列表(拒绝列表)中的字符。检验允许列表是一种非常有效的方法,它可以强制执行严格的输入验证规则,但是参数化的 SQL 语句所需的维护工作更少,而且能提供更好的安全保障。而对于通常采用的执行拒绝列表方式,由于总是存在一些小漏洞,所以并不能有效地防止 SQL Injection 攻击。

例如,攻击者可以: — 把没有被黑名单引用的值作为目标 - 寻找方法以绕过某些需要转义的元字符 - 使用存储过程隐藏注入的元字符 手动去除 SQL 查询中的元字符有一定的帮助,但是并不能完全保护您的应用程序免受 SQL injection 攻击。 防范 SQL injection 攻击的另外一种常用方式是使用存储过程。虽然存储过程可以阻止某些类型的 SQL injection 攻击,但是对于绝大多数攻击仍无能为力。存储过程有助于避免 SQL injection 的常用方式是限制可作为参数传入的指令类型。但是,有许多方法都可以绕过这一限制,许多危险的表达式仍可以传入存储过程。所以再次强调,存储过程在某些情况下可以避免这种攻击,但是并不能完全保护您的应用系统抵御 SQL injection 的攻击。

Recommendations

造成 SQL injection 攻击的根本原因在于攻击者可以改变 SQL 查询的上下文,使程序员原本要作为数据解析的数值,被篡改为命令了。当构造一个 SQL 查询时,程序员应当清楚,哪些输入的数据将会成为命令的一部分,而哪些仅仅是作为数据。参数化 SQL 指令可以防止直接窜改上下文,避免几乎所有的 SQL injection 攻击。参数化 SQL 指令是用常规的 SQL 字符串构造的,但是当需要加入用户输入的数据时,它们就需要使用捆绑参数,这些捆绑参数是一些占位符,用来存放随后插入的数据。换言之,捆绑参数可以使程序员清楚地分辨数据库中的数据,即其中有哪些输入可以看作命令的一部分,哪些输入可以看作数据。这样,当程序准备执行某个指令时,它可以详细地告知数据库,每一个捆绑参数所使用的运行时的值,而不会被解析成对该命令的修改。 当连接到 MySQL 时,可以将前面的例子改写为使用参数化 SQL 指令(而不是联结用户输入的字符串),如下所示:

$mysqli = new mysqli($host,$dbuser, $dbpass, $db);

$userName = $_SESSION['userName'];

$itemName = $_POST['itemName'];

$query = "SELECT * FROM items WHERE owner = ? AND itemname = ?";

$stmt = $mysqli->prepare($query);

$stmt->bind_param('ss',$username,$itemName);

$stmt->execute();

MySQL Improved 扩展 (mysqli) 适用于 MySQL 中的 PHP5 用户。依赖于不同数据库的代码应该检查相似的扩展名。 更加复杂的情况常常出现在报表生成代码中,因为这时需要通过用户输入来改变 SQL 指令的命令结构,比如在 WHERE 条件子句中加入动态的约束条件。不要因为这一需求,就无条件地接受连续的用户输入,从而创建查询语句字符串。当必须要根据用户输入来改变命令结构时,可以使用间接的方法来防止 SQL injection 攻击:创建一个合法的字符串集合,使其对应于可能要加入到 SQL 指令中的不同元素。在构造一个 SQL 指令时,可使用来自用户的输入,以便从应用程序控制的值集合中进行选择。

个人认为最简单的方法是直接过滤掉SQL关键字,以及=,单引号等。文章来源地址https://www.toymoban.com/news/detail-816631.html

到了这里,关于开发安全之:SQL Injection的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DVWA------SQL Injection (Blind)(SQL盲注)

    一、SQL 盲注 1.简介 2.分类 3.盲注测试思路 二、SQL Injection (Blind) 1.LOW 1.1代码审计 1.2漏洞利用 2.medium 3.high 4.Impossible         SQL Injection(Blind),即SQL盲注,与一般注入的区别在于,一般的注入攻击者可以直接从页面上看到注入语句的执行结果,而盲注时攻击者通常是无法

    2024年02月16日
    浏览(39)
  • SQL Injection (Blind)之盲注(原理、分类、利用)

    在SQL注入过程中,SQL语句执行后,选择的数据不能回显到前端页面,此时需要利用一些方法进行判断或者尝试,这个过程称之为盲注。 在盲注中,攻击者根据其返回页面的不同来判断信息(可能是页面内容的不同,也可以是响 应时间不同)。一般情况下,盲注可分为两类:

    2024年02月04日
    浏览(75)
  • Hack The Box -SQL Injection Fundamentals Module详细讲解中文教程

    数据库介绍............................................................................................................... 3 数据库管理系统(DBMS)介绍........................................................................... 3 数据库的类型..................................................................................................

    2024年02月04日
    浏览(31)
  • Burp Suite配置过滤忽略Ruby code injection和XML injection类型的安全问题

    可以使用扫描配置中的\\\"Active Scan\\\"选项。请按照以下步骤进行配置: 打开Burp Suite并启动您的目标应用程序。 载入您的目标应用程序并确保它已配置为代理Burp Suite。 转到Burp Suite的\\\"Proxy\\\"选项卡,并确保Proxy Server正在运行。确保浏览器或应用程序已配置为使用Burp Suite的代理。

    2024年02月08日
    浏览(44)
  • SQL运行报错:java.sql.SQLException: sql injection violation, syntax error: syntax error, expect ‘)‘, pos

    批量插入的sql,运行时报错 检查sql,检查了几遍,没什么问题 后来发现,当插入的数据为空时,也会报    expect \\\')\\\',   错误

    2024年02月15日
    浏览(52)
  • 解决Cause: java.sql.SQLException: sql injection violation, dbType mysql ... token IDENTIFIER deleted错误

    本文不仅帮你解决错误,还帮你分析错误的原因👇👇 今天写好 创建数据源 的接口,并启动项目后,通过 Knife4j 调用单接口,但保出如下图错误: 于是,查看后端输出详细的错误信息,如下所示: 由于篇幅有限,没有粘贴出全部的错误信息。 由于错误信息很多,我们只需

    2024年02月04日
    浏览(42)
  • SourceCodester Online Tours & Travels Management System payment.php sql injection

    path : admin/operations/payment.php Abstract: Line 43 of payment.php invokes a SQL query built with input that comes from an untrusted source. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands. Explanation: SQL injection errors occur when: Data enters a program from an untrusted source. The data is use

    2024年02月19日
    浏览(33)
  • SourceCodester Online Tours & Travels Management System pay.php sql injection

    SourceCodester Online Tours Travels Management System pay.php sql injection Url: admin/pay.php Abstract: Line 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands. Explanation: SQL injection errors occur when: Data enters a program from an u

    2024年02月20日
    浏览(28)
  • [安全开发] SQL注入扫描(一股子GPT味~)

    实际上大部分都是它写的,它真我哭 SQL注入扫描就是一种用于检测和预防SQL注入攻击的工具。它通过模拟SQL注入攻击的方式,向目标网站发送特定的SQL查询语句,以验证目标网站是否存在SQL注入漏洞。SQL注入扫描的过程通常分为以下几个步骤: 收集信息:扫描器会首先向目

    2024年02月05日
    浏览(27)
  • [网络安全]一文带你了解SSTI漏洞(结合Web_python_template_injection解题详析)

    SSTI是Server-Side Template Injection的缩写,是一种Web应用程序安全漏洞,主要存在于使用基于模板引擎的Web应用程序中。 SSTI漏洞的主要原因是 在Web应用程序中使用了基于模板引擎的渲染功能,并且没有正确地验证和过滤用户输入的数据。当攻击者能够构造特定的输入并成功地注入

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包