精华内容
下载资源
问答
  • 注入攻击OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险。实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功。虽然这是最明显的组合关系,但是注入攻击带来的不仅仅是 XSS。注入...

    注入攻击

    OWASP将注入攻击和跨站脚本攻击(XSS)列入网络应用程序十大常见安全风险。实际上,它们会一起出现,因为 XSS 攻击依赖于注入攻击的成功。虽然这是最明显的组合关系,但是注入攻击带来的不仅仅是 XSS。

    注入攻击代指一类攻击,它们通过注入数据到一个网络应用程序以期获得执行,亦或是通过非预期的一个方式来执行恶意数据。这种类别的攻击包括跨站脚本攻击(XSS)、SQL 注入攻击、头部注入攻击、日志注入攻击和全路径暴露。当然限于篇幅,这里只是一个简单的介绍。

    这类攻击是每个程序员的梦魇。它们数量庞大、攻击范围广,并且有时候防御措施很复杂,因此是最常见、成功率最高的网络攻击。所有的应用程序都需要从某个地方获取数据来运行。跨站脚本攻击和界面伪装漏洞最为常见,并且它们本身就已经非常重要,通常与注入攻击分开归类。接下来的一章我将单独介绍它们。

    OWASP 对注入攻击的定义如下:

    类似SQL、OS、LDAP注入攻击等注入攻击会在不可信数据作为命令或请求的一部分被发送到解释程序时发生。攻击者的恶意数据会迷惑解释程序去执行非计划的命令,或访问非授权的数据。

    SQL 注入攻击

    目前最常见的注入攻击形式是臭名昭著的 SQL 注入攻击。SQL 注入攻击不仅常见,而且致命。我要特别强调,了解这种攻击、实现攻击的条件以及防御攻击需要采取的措施极为重要。

    SQL 注入攻击通过将数据注入网络应用程序,然后被用于 SQL 请求来操作。数据通常来自类似网页表单的不可信来源。不过,数据也可能来自包括数据库本身在内的其他来源。程序员通常会信任来自自己数据库的数据,以为它们是非常安全的,却没有意识到,在一种用法中安全,不代表它在所有其他用法中都是安全的。来自数据库在经过证明(比如说,通过验证流程)之前,应该被视为不可信。

    如果攻击成功,SQL 注入攻击能够操纵受攻击的 SQL 请求,从而进行非程序员意愿的数据库操作。

    看一下这条请求:

    git·$db = new mysqli('localhost', 'username', 'password', 'storedb'); $result = $db->query( 'SELECT * FROM transactions WHERE user_id = ' . $_POST['user_id'] ); ·git

    上面的请求中存在多处问题。首先,我们还没有验证 POST 数据来确保这是个有效的 user_id。其次,我们允许一个不可信来源告诉我们要使用哪个 user_id——攻击者可以任意设置一个有效 user_id。也许 user_id 包含在一个隐藏的表单字段,因为网络表单不允许编辑,我们就以为安全了(却不知道攻击者可以提交任何信息)。第三,我们并没有 escape 该 user_id,或将其作为一个绑定参数传给请求,由于我们一开始没有验证 SQL 请求,这就让攻击者有机会注入任意字符串来操纵该请求。

    上述三点问题在网络应用程序中极其常见。

    至于信任来自数据库的数据,想象一下我们使用 user_name 字段来搜索交易。用户名的范围相当广阔,可能还包含引用。可以想见,攻击者可以在一个用户名内储存一个 SQL 注入字符串。如果我们将数据库视为可信的数据来源,没能合理地 escape 或约束它,当我们在后续请求中再次使用该字符串时,它就可以操纵请求字符串。

    另一个需要注意的 SQL 注入攻击因素是永久存储不需要总是在服务器上进行。HTML5 支持使用客户端数据库,可以借助 Javascript 使用 SQL 来查询。有两个支持这项操作的接口:WebSQL 和 IndexedDB。WebSQL 于2010年被 W3C 弃用,受到后台使用 SQLite 的 WebKit 浏览器支持。虽然这个接口不被推荐使用,但是 WebKit 处于后台兼容考虑,很有可能会继续支持它。正如它的名字所示,它接收 SQL 请求,因此容易遭受 SQL 注入攻击。IndexedDB 是一个新的备选,不过它是一种 NOSQL 数据库(不需要使用 SQL 查询)。

    SQL 注入攻击范例

    尝试操纵 SQL 命令的目标包含以下几种:

    信息泄露

    披露存储数据

    操纵存储数据

    避开权限管理

    客户端 SQL 注入攻击

    信息泄露

    披露存储数据

    操纵存储数据

    避开权限管理

    防御 SQL 注入攻击

    防御 SQL 注入攻击可采用深度防御原则。在将数据用于 SQL 命令之前,应该进行验证,以确保它是我们期望的正确格式,并且在将数据包含在请求或绑定参数前,应该将其 escape。

    验证

    第二章讲述输入验证,而且正如我在其中提到的,我们应该假设不是由当前请求的 PHP 源代码直接生成的所有数据都不可信。对其严格验证,并且拒绝所有未通过验证的数据。不要尝试“修复”数据,除非只是简单修正数据格式。

    常见的验证错误包括只验证数据当下用途(例如,展示或计算),却不考虑数据最终存储位置的数据库表字段的验证需求。

    Escaping

    通过使用mysqli 扩展,你可以利用 mysqli_real_escape_string() 函数来 escape包含在 SQL 查询中的所有数据。PostgresSQL 的 pgsql 扩展提供 pg_escape_bytea()、 pg_escape_identifier()、 pg_escape_literal() 和 pg_escape_string() 函数。Mssql(微软 SQL 服务器)不提供 escaping 功能,而经常被推荐的 addslashes() 方法并不够用——你实际上需要一个定制功能http://stackoverflow.com/questions/574805/how-to-escape-strings-in-mssql-using-php。

    再告诉你一件头疼的事,你绝对绝对不能在 escape 进入 SQL 查询数据上出错。一旦失手,可能就会引发 SQL 注入攻击。

    基于以上原因,并不推荐使用 escaping。它可以用来救急,如果你用来抽象的数据库程序库不强制参数绑定就能进行 SQL 查询,可能就需要使用它。否则你应该避免使用 escape。它很混乱,容易出错,而且因数据库扩展不同而存在差异。

    参数化查询(预处理语句)

    参数化或参数绑定是构建 SQL 查询的推荐方法,而且所有优秀的数据库程序库都默认使用这种方法。以下是使用 PHP 的 PDO 扩展的一个实例。

    if(ctype_digit($_POST['id']) && is_int($_POST['id']))

    {

    $validatedId = $_POST['id'];

    $pdo = new PDO('mysql:store.db');

    $stmt = $pdo->prepare('SELECT * FROM transactions WHERE user_id = :id');

    $stmt->bindParam(':id', $validatedId, PDO::PARAM_INT);

    $stmt->execute();

    } else {

    // reject id value and report error to user

    }

    PDO 语句可用的bindParam() 方法让你可以给预处理语句中出现的占位符绑定参数,并且接受基本的数据类型参数,例如 PDO::PARAM_INT、 PDO::PARAM_BOOL、 PDO::PARAM_LOB 和 PDO::PARAM_STR。这种方法默认使用 PDO::PARAM_STR,因此记得对其他数值做相应调整!

    不同于手动 escape,这种方式下的参数绑定(或者你的数据库使用的方法)会自动正确地 escape 绑定的数据,因此你不需要回忆之前用了哪种 escape 函数。持续使用参数绑定要比记着手动 escape 所有东西要可靠得多。

    强制实施最小特权原则

    制止已经发生的 SQL 注入攻击跟从一开始就防御同样重要。一旦攻击者获得执行 SQL 查询的能力,他们就会以一个数据库用户的身份进行查询。可以通过确保所有数据库用户只得到完成各自任务必需的权限,来执行最小特权原则。

    如果一个数据库用户拥有很大的权限,攻击者就可能删除数据表,操纵其他用户的权限,从而发起其他 SQL 注入攻击。你绝对不能以超级用户、其他权限较高或管理员层级的用户身份访问网络应用程序的数据库,从而杜绝这种情况发生。

    最小特权原则的另外一个变体是区别数据库的读数据和写数据权限。你可以设置一个拥有写数据权限的用户,和另一个只有读数据权限的用户。这种角色区分可以确保在 SQL 注入攻击目标为只读用户时,攻击者无法写数据或操纵表数据。这种生物隔离区划可以延伸到进一步限制访问权限,这样就可以将 SQL 注入攻击的影响最小化。

    很多网络应用程序,尤其是开源应用程序,特别被设计成只有一个数据库用户,而且几乎从来不会有人检查该用户是不是高度特免的。记住以上观点,忍住诱惑,不要在一个管理员用户下运行这样的网络应用程序。

    代码注入攻击(也叫Remote File Inclusion)

    代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。这并不适用于对应用程序客户端的代码注入攻击,例如 Javascript,那属于跨站脚本攻击(XSS)。

    源代码可以通过不可信的输入直接注入,或者网络应用程序在通过本地文件系统或类似 URL 这样的外部来源加载代码时被操纵。包含远程文件导致代码注入攻击的情况通常被称为远程文件包含漏洞,虽然远程文件包含攻击本身的目的就是为了注入代码。

    造成代码注入攻击的初始原因包括输入验证失败,包含可能被当做 PHP 代码、任何语境下的不可信输入,未能保障源代码库的安全,在下载第三方程序库时不够谨慎,服务器配置不当导致非 PHP 文件通过网络服务器被传送到 PHP 解释程序。最后一点尤其要加以注意,因为它意味着不可信用户上传到服务器的所有文件都可能带来极大的风险。

    代码注入攻击范例

    众所周知,PHP 涉及无数代码注入攻击目标,因此任何一位程序员都要高度关注代码注入攻击问题。

    文件包含攻击

    代码注入攻击最明显的目标就是 include()、 include_once()、 require() 和 require_once() 函数。如果不可信输入被允许来决定传输给这些函数的路径参数,它就可能影响被包含的本地文件。应该注意的是,被包含的文件不一定是一个真正的 PHP 文件,任何能够携带文字数据(例如,几乎所有的)的被包含文件都有可能。

    路径参数也可能遭受目录遍历攻击或远程文件包含攻击。在路径中使用 ../ 或 ..(dot-dot-slash) 字符串会让攻击者能够触及 PHP 流程能够访问的所有文件。除非 XXX 被禁用,否则以上函数还能接受 PHP 默认设置中的 URL。

    评估

    PHP 的 eval() 函数接收 PHP 代码字符串并执行。

    正则表示式注入攻击

    PHP 中 PCRE 的 preg_replace() 函数允许“e”(PREG_REPLACE_EVAL)修饰符,这就意味着替换字符串在替换后将被当成 PHP。用于替换字符串的不可信输入可能会注入即将执行的 PHP 代码。

    缺陷文件包含逻辑攻击

    按照定义,网络应用程序会包含满足各种需求所需的各类文件。通过操纵请求路径或请求参数,它可以利用服务器路由的缺陷逻辑、依赖管理、自动加载或其他流程,导致服务器包含非预期的本地文件。

    这些超出网络应用程序设计初衷的操纵可能带来无法预料的影响。比如说,一个应用程序可能无意中暴露了只用于命令行用法的路径。该应用程序可能还暴露了构造函数用来执行任务的其他类(虽然并不推荐这种设计类的方法,不过还是有人这么做)。两种场景都有可能干扰应用程序的后台运行,导致本来不应该被直接访问的资源密集型运行活动遭受数据操纵或拒绝服务攻击(DOS)。

    服务器配置不当

    代码注入攻击的目标

    由于代码注入攻击允许攻击者选择任意 PHP 代码来执行代码注入攻击的目标极其广泛。

    防御代码注入攻击

    命令注入攻击

    命令注入攻击范例

    防御命令注入攻击

    本文系 OneAPM 工程师编译整理。OneAPM 是应用性能管理领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和 SQL 语句的实时抓取。想阅读更多技术文章,请访问 OneAPM 官方博客。

    展开全文
  • SQL 注入(SQLi)是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。...

    SQL 注入(SQLi)是一种可执行恶意 SQL 语句的注入攻击。这些 SQL 语句可控制网站背后的数据库服务。攻击者可利用 SQL 漏洞绕过网站已有的安全措施。他们可绕过网站的身份认证和授权并访问整个 SQL 数据库的数据。他们也可利用 SQL 注入对数据进行增加、修改和删除操作。

    SQL 注入可影响任何使用了 SQL 数据库的网站或应用程序,例如常用的数据库有 MySQL、Oracle、SQL Server 等等。攻击者利用它,便能无需授权地访问你的敏感数据,比如:用户资料、个人数据、商业机密、知识产权等等。SQL 注入是一种最古老、最流行、也最危险的网站漏洞。OWASP 组织(Open Web Application Security Project)在 2017 年的 OWASP Top 10 文档中将注入漏洞列为对网站安全最具威胁的漏洞。

    SQL Injection

    发起 SQL 注入攻击的过程及原因

    为了发起 SQL 注入攻击,攻击者首先需要在网站或应用程序中找到那些易受攻击的用户输入。这些用户输入被有漏洞的网站或应用程序直接用于 SQL 查询语句中。攻击者可创建这些输入内容。这些内容往往被称为恶意载体,它们是攻击过程中的关键部分。随后攻击者将内容发送出去,恶意的 SQL 语句便会在数据库中被执行。

    SQL 是一种用于管理关系型数据库中数据的查询语言。你能使用它进行查询、修改和删除数据。很多网站或应用程序将所有数据都存储在 SQL 数据库。有时候,你也可以使用 SQL 指令运行操作系统指令。因此,一次成功的 SQL 注入攻击可能会引起非常严重的后果。

    • 攻击者可利用 SQL 注入,从数据库中得到其他用户的用户凭证。之后他们便能伪装成这些用户。这些用户中甚至有可能包括有所有数据库权限的数据库管理员。
    • SQL 可用于从数据库中选择并输出数据。SQL 注入漏洞允许攻击者访问数据库服务中的所有数据。
    • SQL 也可用于修改数据库中数据,或者添加新数据。例如,在金融产品中,攻击者能利用 SQL 注入修改余额,取消交易记录或给他们的账户转账。
    • SQL 可用于从数据库中删除记录,甚至删除数据表。即使管理员做了数据库备份,在数据库中数据恢复之前,被删除的数据仍然会影响应用的可用性。而且,备份很可能没有覆盖最近的数据。
    • 在某些数据库服务中,可通过数据库服务访问操作系统。这种设计可能是有意的,也可能是无意的。在这种情况下,攻击者将 SQL 注入作为初始手段,进而攻击防火墙背后的内网。

    SQL 注入攻击的类型有:带内 SQL 注入(使用数据库错误或 UNION 指令)、盲目 SQL 注入和带外 SQL 注入。你可在 SQL 注入的类型 和盲目 SQL 注入是什么中了解更多信息。

    为了一步步了解如何发起 SQL 注入攻击和它可能引起的严重后果,可参考运用 SQL 注入:动手实践的例子。

    简单的 SQL 注入例子

    第一个例子非常简单。它展示了攻击者如何利用 SQL 注入漏洞绕过应用安全防护和管理员认证。

    以下脚本是执行在网站服务器上的伪代码。它是通过用户名和密码进行身份认证的简单例子。该例子中数据库有一张名为users的表,该表中有两列数据:username和password。

    # 定义 POST 变量
    uname = request.POST['username']
    passwd = request.POST['password']
    
    # 存在 SQL 注入漏洞的 SQL 查询语句
    sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
    
    # 执行 SQL 语句
    database.execute(sql)

    这些输入字段是容易遭受 SQL 注入攻击的。攻击者能够在输入字段中利用 SQL 指令,修改数据库服务执行的 SQL 语句。比如,他们可使用含有单引号的把戏,将password字段设置为:

    password' OR 1=1

    因此,数据库服务将执行以下 SQL 查询:

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

    由于OR 1=1语句,无论username和password是什么,WHERE分句都将返回users表中第一个id。数据库中第一个用户的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 注入例子

    使用 UNION 操作符是最常见的 SQL 注入类型之一。它允许攻击者将两个或更多个 SELECT 语句的查询结果合并为一个结果。这种技术被称为基于合并查询的 SQL 注入。

    以下是这种注入攻击的一个例子。该例子在testphp.vulnweb.com网页上进行,该网页是 Acunetix 维护的故意存在漏洞的网站。(译者注:可以跟着该例子在 testphp.vulnweb.com 站点体验 SQL 注入攻击的过程。)

    以下 HTTP 请求是一位用户发送的合法正常请求:

    GET http://testphp.vulnweb.com/artists.php?artist=1 HTTP/1.1
    Host: testphp.vulnweb.com

    HTTP request a legitimate user would send

    artist参数容易受到 SQL 注入攻击。以下的载体修改了该参数,希望找到某个不存在的记录。它设置该参数的值为-1。当然,它可以是数据库中不存在的任意值。然而,负数往往是个好主意,因为数据库中的 id 很少会是负数。

    在 SQL 注入攻击中,UNION操作符通常被用于在原始查询语句中,附加恶意的 SQL 查询语句,网站服务将执行所有查询语句。注入的查询语句的结果将和原始查询语句的结果合并。这样攻击者便可以得到其他数据表中的数据。(译者注:这步是为了演示当 UNION 之后的语句为SELECT 1, 2, 3时,页面将输出 2 和 3。)

    GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1, 2, 3 HTTP/1.1
    Host: testphp.vulnweb.com

    SQL injection using the UNION operator

    接下来的例子展示了在这个存在漏洞的网站中,如何修改 SQL 注入的载体并得到有意义的数据:

    GET http://testphp.vulnweb.com/artists.php?artist=-1 UNION SELECT 1,pass,cc FROM users WHERE uname='test' HTTP/1.1
    Host: testphp.vulnweb.com

    使用 UNION 运算符和 FROM 进行 SQL 注入

    如何防止 SQL 注入

    防止 SQL 注入唯一可靠的方式是验证输入和参数化查询,参数查询包括预准备的查询语句(译者注:指存储过程)。网站应用不应该在代码中直接使用用户输入。开发者必须检查所有用户输入,而不是仅检查网页表单中的输入,比如登录表单。他们必须移除潜在的恶意代码因素,比如单引号。在你的线上环境中屏蔽数据库错误也是个好主意。因为结合数据库错误,SQL 注入攻击将获得更多数据库相关信息。

    如果你使用 Acunetix 扫描器发现了 SQL 注入漏洞,你可能不能立即修复它。比如,这个漏洞可能存在开源代码中。在这种情况下,你可以临时使用网站防火墙对输入进行校验。

    参考在 PHP 应用中防止 SQL 注入漏洞并修复它们,了解在 PHP 语言中如何防止 SQL 注入攻击。参考 Bobby Tables 教你阻止 SQL 注入攻击,查找如何在其他编程语言中预防 SQL 注入攻击。

    如何预防 SQL 注入——通用技巧

    预防 SQL 注入攻击并不容易。特定的预防技术与 SQL 注入漏洞的子类型、SQL 数据库引擎和编程语言有关。尽管如此,你仍然可以遵循一些通用策略来确保网站安全。

    第一步:培养并保持安全意识

    为了保证你的网站安全,所有参与搭建该网站的人员都必须意识到 SQL 注入漏洞相关的风险。你应该为所有开发者、测试员工、运维员工和系统管理员提供适量的安全培训。你可以让他们参考这篇文章作为安全培训的开始。

    第二步:不要信任任何用户输入

    将所有用户输入都看作不可信的。任何被用作 SQL 查询的用户输入都有 SQL 注入攻击的风险。对待授权用户或内部员工的输入,也应该像对待外部用户输入一样,将其视为不可信。

    第三步:使用白名单,而不是黑名单

    不要基于黑名单过滤用户输入。因为聪明的攻击者总是能找到绕过黑名单的方法,所以应尽可能只使用严格的白名单,对用户输入进行验证和过滤。

    第四步:采用最新的技术

    更老的网站开发技术没有防止 SQL 注入攻击的保护机制。尽量使用最新版本的开发环境和开发语言,并使用与它们相关的新技术。例如,在 PHP 中应使用 PDO 而不是 MySQLi。

    第五步:采用经过验证的机制

    不要尝试从零开始建立应对 SQL 注入攻击的防护机制。大多数现代开发技术已经为你提供了预防 SQL 注入攻击的机制。你应该使用这些已有的技术,而不是尝试重新造轮子。比如,使用参数化查询和存储过程(stored procedure)。

    第六步:周期性扫描

    SQL 注入漏洞可能被开发者引入,也可能被外部库、模块或软件引入。你应该使用网站漏洞扫描器(比如 Acunetix)周期性扫描你的网站。如果你使用 Jenkins,你可以安装 Acunetix 插件,实现每次构建时进行自动扫描。

    请各位大牛以不参与,不破坏,不违法为第一原则

    展开全文
  • 防止sql注入攻击的方法总结,sql注入攻击总结SQL注入是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码。通过把SQL命令插入到Web表单递交或输入域名或...

    防止sql注入攻击的方法总结,sql注入攻击总结

    SQL注入是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码。通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,就会造成一些出人意料的结果,最终达到欺骗服务器执行恶意的SQL命令。

    SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

    二、SQL注入攻击的总体思路

    1.寻找到SQL注入的位置

    2.判断服务器类型和后台数据库类型

    3.针对不通的服务器和数据库特点进行SQL注入攻击

    三、防止SQL注入攻击的方法总结

    一、参数化SQL

    是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,用@来表示参数。

    在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有恶意的指令,由于已经编译完成,就不会被数据库所运行,因此,可从一定程度上避免SQL注入。(注意:只是一定程度上避免,仍有例外)

    在不用的数据库上基本语法都是一样的,但在不同的运行平台上客户端的书写有不同之处,举例使用SQL server在.net上执行。

    SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2)", sqlconn);

    sqlcmd.Parameters.AddWithValue("@c1", 1); ' 设定参数 @c1 的值。

    sqlcmd.Parameters.AddWithValue("@c2", 2); ' 设定参数 @c2 的值。

    sqlconn.Open();

    sqlcmd.ExecuteNonQuery();

    sqlconn.Close();

    注意:

    1、如果存储过程中使用字符串拼接sql的话,上面的参数化将不会起作用,单引号必须经过判断并替换,在数据库中,用2个单引号代表1个实际的单引号。所以,如果是拼接sql字符串的方式,需要用Replace(@para,'''', '''''')来替换一下,将1个单引号替换为2个就没有问题了。

    2、使用这种参数化查询的办法,防止SQL注入的任务就交给ADO.NET了, 如果在项目中统一规定必须使用参数化查询,就不用担心因个别程序员的疏忽导致的SQL注入漏洞了。 但是,问题还没有完,SQL注入的漏洞是堵住了,但是查询结果的正确性,参数化查询并不能帮上什么忙。

    二、字符串过滤(在上面方法不能阻止的情况下,可以使用该方法,不推荐使用)

    //字符串过滤,防止sql注入。

    public bool IsHasSQLInject(string str){

    bool isHasSQLInject = false;

    //字符串中的关键字更具需要添加

    string inj_str = "'|and|exec|union|create|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|xp_|or|--|+";

    str = str.ToLower().Trim();

    string[] inj_str_array = inj_str.Split('|');

    foreach (string sql in inj_str_array)

    {

    if (str.IndexOf(sql) > -1)

    {

    isHasSQLInject = true;

    break;

    }

    }

    return isHasSQLInject;

    }

    三、使用正则表达式过滤传入的参数(这个方法没有亲自验证,从网上找来的)

    下面是具体的正则表达式:

    检测SQL meta-characters的正则表达式 :/(%27)|(’)|(--)|(%23)|(#)/ix

    修正检测SQL meta-characters的正则表达式 :/((%3D)|(=))1*((%27)|(’)|(--)|(%3B)|(:))/i

    典型的SQL 注入攻击的正则表达式 :/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix

    检测SQL注入,UNION查询关键字的正则表达式 :/((%27)|(’))union/ix(%27)|(’)

    检测MS SQL Server SQL注入攻击的正则表达式:/exec(s|+)+(s|x)pw+/ix

    结合Regular Expression使用,简称RE是一种非常强大的文字验证技术。If Re.Mathc(str,pattern).Success Then 继续执行,这里使用Match方法来对用户输入的内容与定义好的模板进行验证。

    四、前端js防范SQL注入(前端验证只能起到一定作用,还需要后台参数化阻止SQL注入)

    var url = location.search;

    var re=/^\?(.*)(select%20|insert%20|delete%20from%20|count\(|drop%20table|update%20truncate%20|asc\(|mid\(|char\(|xp_cmdshell|exec%20master|net%20localgroup%20administrators|\"|:|net%20user|\|%20or%20)(.*)$/gi;

    var e = re.test(url);

    if(e) {

    alert("地址中含有非法字符~");

    location.href="error.asp";

    }

    来源链接:https://www.wosign.com/news/news_2018121301.htm

    n ↩

    展开全文
  • sql注入攻击如何实现

    2021-03-04 04:33:51
    至于如何预防SQL注入,按理说应该是开发该了解的事情~但是作为一个棒棒的测试,搞清楚原理是不是能让我们更加透彻地理解bug的产生原因呢~好啦,话不多说,进入正题~如何理解SQL注入(攻击)?SQL注入是一种将SQL代码...

    本文主要针对SQL注入的含义、以及如何进行SQL注入。适用的人群主要是测试人员,了解如何进行SQL注入,可以帮助我们测试登录、发布等模块的SQL攻击漏洞,至于如何预防SQL注入,按理说应该是开发该了解的事情~但是作为一个棒棒的测试,搞清楚原理是不是能让我们更加透彻地理解bug的产生原因呢~好啦,话不多说,进入正题~

    686a019f95af73d364cffa6649d03b4c.png

    如何理解SQL注入(攻击)?

    SQL注入是一种将SQL代码添加到输入参数中,传递到服务器解析并执行的一种攻击手法。

    SQL注入攻击是输入参数未经过滤,然后直接拼接到SQL语句当中解析,执行达到预想之外的一种行为,称之为SQL注入攻击。

    SQL注入攻击原理:

    当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字 符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。

    如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程 的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序 存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

    SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况,需要构造巧妙的SQL语句,从而成功获取想要的数据。

    SQL注入是怎么产生的?

    1. 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。

    2. 注入可以借助数据库的存储过程进行提权等操作

    3. 攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)

    如何进行SQL注入攻击?

    以php编程语言、mysql数据库为例,介绍一下SQL注入攻击的构造技巧、构造方法

    1.数字注入

    在浏览器地址栏输入:learn.me/sql/article.php?id=1,这是一个get型接口,发送这个请求相当于调用一个查询语句:$sql = "SELECT * FROM article WHERE id =",$id

    正常情况下,应该返回一个id=1的文章信息。那么,如果在浏览器地址栏输入:learn.me/sql/article.php?id=-1 OR 1 =1,这就是一个SQL注入攻击了,可能会返回所有文章的相关信息。为什么会这样呢?

    这是因为,id = -1永远是false,1=1永远是true,所有整个where语句永远是ture,所以where条件相当于没有加where条件,那么查询的结果相当于整张表的内容

    2.字符串注入

    有这样一个用户登录场景:登录界面包括用户名和密码输入框,以及提交按钮。输入用户名和密码,提交。

    这是一个post请求,登录时调用接口learn.me/sql/login.html,首先连接数据库,然后后台对post请求参数中携带的用户名、密码进行参数校验,即sql的查询过程。假设正确的用户名和密码为user和pwd123,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句:SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'

    由于用户名和密码都是字符串,SQL注入方法即把参数携带的数据变成mysql中注释的字符串。mysql中有2种注释的方法:

    1)'#':'#'后所有的字符串都会被当成注释来处理

    用户名输入:user'#(单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。等价于SQL语句:SELECT * FROM user WHERE username = 'user'#'ADN password = '111'

    '#'后面都被注释掉了,相当于:SELECT * FROM user WHERE username = 'user'

    2)'-- ' (--后面有个空格):'-- '后面的字符串都会被当成注释来处理

    用户名输入:user'-- (注意--后面有个空格,单引号闭合user左边的单引号),密码随意输入,如:111,然后点击提交按钮。等价于SQL语句:SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'

    SELECT * FROM user WHERE username = 'user'-- 'AND password = '1111'

    '-- '后面都被注释掉了,相当于:SELECT * FROM user WHERE username = 'user'

    因此,以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为'user'的账号,这是十分危险的事情。

    展开全文
  • SQL 注入攻击案例

    2021-01-19 16:43:36
    一、检测注入点二、判断是否存在 SQL 注入可能三、数据库爆破四、字段爆破五、数据库表爆破六、用户名、密码爆破七、总结一、检测注入点首先,在http://120.203.13.75:6815/?id=1...二、判断是否存在 SQL 注入可能...
  • 一、sequlize.query防止sql注入在nodejs中使用sequlize库来查询mysql数据库,提供了常用的方法有两种://1、直接查询sql语句sequelize.query();//需要做sql防注入//2、通过接口Project.findAll(); //在实现上就做了...
  • SQL注入攻击总结篇

    2021-10-13 19:15:42
    本文是关于SQL各种类型数据库的注入攻击自我复习总结,如果文中有不足的地方,麻烦大佬在评论中指出或者私聊我,谢谢~ 本文讲述: SQL注入的原理 SQL注入的防御 SQL攻击的流程 其他数据库的注入方法 ——————...
  • 许多年以前,SQL注入攻击即将消失的消息不绝于耳,但无数个事实告诉我们,SQL注入攻击还没有离我们远去。 近几年SQL注入事件少了很多,不是开发人员意识提高,也不是预编译的推广见成效,而是各种框架的流行和推广...
  • 展开全部SQL注入就是攻击者通过正常的WEB页面,把自己SQL代码传入...当应用程序使用输入内容来构造动态SQL语句以访问数据库时,会发生SQL注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户...
  • SQL注入攻击详解

    千次阅读 2020-12-21 18:03:18
    SQL 注入(SQLi)是一种注入攻击,,可以执行恶意 SQL 语句。它通过将任意 SQL 代码插入数据库查询,使攻击者能够完全控制 Web 应用程序后面的数据库服务器。攻击者可以使用 SQL 注入漏洞绕过应用程序安全措施;可以...
  • 正确的防御SQL注入sql注入的防御不是简单只做一些用户输入的escape处理,这样是不够的,只是提高了攻击者的门槛而已,还是不够安全。例如 mysql_real_escape_string()函数会对输入的参数进行转义。$sql="SELECT id,...
  • 点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!SQL注入攻击是黑客对数据库进行攻击常用的手段之一,随着B/S模式应用开发的发展,使用这种模式编写应用程序的程...
  • 本节内容:php防范SQL注入攻击与XSS攻击1,SQL注入攻击XSS攻击任意执行代码文件包含以及CSRF.}例子:复制代码 代码示例:mysql_connect("localhost","root","123456")or die("数据库连接失败!");mysql_select_db(...
  • 至于如何预防SQL注入,按理说应该是开发该了解的事情~但是作为一个棒棒的测试,搞清楚原理是不是能让我们更加透彻地理解bug的产生原因呢~好啦,话不多说,进入正题~如何理解SQL注入(攻击)?SQL注入是一种将S...
  • 8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?从安全的角度来看,Http协议...在此小结一下比较常见的代码注入类Web攻击,以及对应的防范方法。所谓代码注入众所周知,程序是由代码...
  • 咱来说说SQL注入问题吧SQL注入到底是什么SQL注入是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过...
  • 一问了解SQL注入攻击以及防御手段。
  • MySQL注入攻击与防御

    2021-01-21 14:50:32
    一、注入常用函数与字符下面几点是注入中经常会用到的语句控制语句操作(select, case, if(), ...)比较操作(=, like, mod(), ...)字符串的猜解操作(mid(), left(), rpad(), …)字符串生成操作(0x61, hex(), conv()...
  • 数据库 -- SQL注入攻击

    2021-12-07 11:23:28
    SQL注入攻击_百度百科 概念 SQL注入攻击是黑客对数据库进行攻击的常用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分...
  • SQL注入攻击大全

    千次阅读 2021-05-28 13:07:42
    本文是我个人的第一篇文章,简单介绍了我所了解到的关于sql注入的基础知识,相信涵盖面还是比较广的,欢迎各位大佬批评指正,评论讨论,让我们一起学习一起进步。
  • 至于如何预防SQL注入,按理说应该是开发该了解的事情~但是作为一个棒棒的测试,搞清楚原理是不是能让我们更加透彻地理解bug的产生原因呢~好啦,话不多说,进入正题~如何理解SQL注入(攻击)?SQL注入是一种将S...
  • 通过SQL注入攻击,掌握网站的工作机制,认识到SQL注入攻击的防范措施, 加强对Web攻击的防范。 二、实验原理 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义...
  • SQL注入攻击实战演练

    2021-04-20 19:40:48
    SQL注入攻击的学习,我们更多的目的是为了学习攻击技术和防范策略,而不是刻意去攻击数据库。 首先我们先进入实验地址《SQL 注入》。 SQL注入是一种代码注入技术,过去常常用于攻击数据驱动性的应用,实质就是将恶意...
  • 前言找到SQL注入漏洞后,我们可以用它来干什么呢?那么本篇文章给大家带来的就是SQL注入漏洞利用技术,现在是时候让我们去体验一下漏洞利用的乐趣了。 目录 第三节 利用SQL注入 3.1、识别数据库 3.2、UNION语句...
  • SQL注入是一种注入攻击,可以执行恶意SQL语句。下面本篇文章就来带大家了解一下SQL注入,简单介绍一下防止SQL注入攻击的方法,希望对大家有所帮助。什么是SQL注入?SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL...
  • 上一篇我们写了jdbc工具类:JDBCUtils ,在这里我们使用该工具类来连接数据库,在之前我们使用 Statement接口下的executeQuery(sql)方法来执行搜索语句,但是这个接口并不安全,容易被注入攻击注入攻击示例:首先...
  • SQL注入攻击之报错注入 1.floor(rand(0)*2) 注入语句:select and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a); 报错注入原理: 报错...
  • 其实sql注入漏洞就是一个。作为一个菜鸟小程序员,我对sql注入的东西了解的也不深入,所以抽出时间专门学习了一下。现在把学习成果分享给大家,希望可以帮助大家学习。下面我们就来看一下。 一、什么是sql注入呢? ...
  • 内容介绍热点排行相关文章下载地址↓目录第1章 什么是SQL注入 11.1 概述 21.2 理解Web应用的工作原理 21.2.1 一种简单的应用架构 31.2.2 一种较复杂的架构 41.3 理解SQL注入 51.4 理解SQL注入的产生过程 101.4.1 ...
  • 代码注入是指攻击者通过网站类型注入相应的代码,这个代码以当前网站用户的权限执行系统命令,在高级事件中,攻击者可能溢出来提权导致整个web服务器的沦丧。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,204
精华内容 44,081
关键字:

注入攻击