`

SQL Server加密与SQL注入

 
阅读更多

SQLServer上的加密

SQLServer上内置了加密用来保护各种类型的敏感数据。在很多时候,这个加密对于你来说是完全透明的;当数据被存储时候被加密,它们被使用的时候就会自动加密。在其他的情况下,你可以选择数据是否要被加密。SQLServer可以加密下列这些组件:
·密码
·存储过程,视图,触发器,用户自定义函数,默认值,和规则。
·在服务器和用户之间传输的数据
密码加密
SQLServer自动将你分配给登陆和应用角色的密码加密。尽管当你可以从主数据库中直接察看系统表格而不需要密码。你不能给对这种情况作出任何修改,事实上,你根本不能破坏它。
定义加密
在有些时候,如果对对象进行加密是防止将一些信息分享给他人。例如,一个存储进程可能包含所有者的商业信息,但是这个信息不能和让其他的人看到,即使他们公开的系统表格并可以看到对象的定义。这就是为什么SQLServer允许你在创建一个对象的时候进行加密。为了加密一个存储进程,使用下面形式的CREATPROCEDURE语句:
CREATEPROCEDUREprocedurename[;number]
[@parameterdatatype
[VARYING][=defaultvalue][OUTPUT]]
[,…]
[WITHRECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]

我们关心的仅仅是可选的WITH参数。你可以详细说明ARECOMPILE或者ENCRYPTION,或者你可以同时说明它们。ENCRYPTION关键字保护SQLServer它不被公开在进程中。结果,如果ENCRYPTION在激活的时候系统存储进程sp_helptext就会被忽视,这个存储进程将被存储在用户创建进程的文本中。如果你不想要加密,你可以使用ALTERPROCEDURE,忽略WITHENCRYPTION子句来重新创建一个进程。
为了能够使用加密。用户和服务器都应该使用TCP/IPNetworkLibraries用来连接。运行适当的NetworkUtility和检查Forceprotocolencryption,看下表,用户和服务器之间的连接将不会被加密。

加密也不能完全自由。当连接确定后,要继续其他的构造,并且用户和服务器必须运行代码来解释加密和解释的包裹。这里将需要一些开销并且当在编译码的时候会使进程慢下来。如果网络包裹在你控制范围之外,使用这种做法是非常好的。

加密中缺少什么?
你可以注意到在这个列表中缺少一些被加密的东西:你表格中的数据。在你存储数据之前,SQL Server不会提供任何内置的工具来加密你的数据。如果你需要保护存储在SQL Server上的数据,我们给你两条建议:第一,你可以利用GRANT 和DENY关键字来控制你想哪个用户可以在SQL Server中读取的数据。

第二.如果你真的想对数据加密,不要设法加密码。你可以利用被测试过的商业产品的算法。

SQL 注入攻击
SQL 注入攻击是一个常规性的攻击,它可以允许一些不法用户检索你的数据,改变服务器的设置,或者在你不小心的时候黑掉你的服务器。SQL 注入攻击不是SQL Server问题,而是不适当的程序。如果你想要运行这些程序的话,你必须明白这冒着一定的风险。

测点定位弱点
SQL 注入的脆弱点发生在程序开发员构造一个WHERE 子句伴随着用户的输入的时候。比如,一个简单的ASP程序允许用户输入一个顾客的ID然后检索公司的全部人员的名字,如果顾客ID如果作为ASP页面的请求串的一部分返回,那么开发员可以编写下面的代码获得数据:

strConn = "Provider=SQLOLEDB;Data Source=(local);" & _
"Database=Northwind;Integrated Security=SSPI"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConn
strQuery = "SELECT ContactName FROM Customers " & _
“WHERE CustomerID = '" & Request.Form("CustID") & "'"
Set rstResults = cnn.Execute(strQuery)
Response.Write(rstResults.Fields("ContactName").Value)

现在你知道什么地方有问题了吧?如果用户知道一个用户的ID,他可以通过检索来获得全部的相应的名字。现在明白了?

获得额外的数据
当然,对于一个攻击程序,尽管它不知道任何顾客的ID,甚至不用去猜,它也可以获得数据。为了完成这个工作,它将下面的文本输入到应用程序调用顾客ID的textbox中:

customer ID:
'UNION ALL SELECT ContactName FROM Customers
WHERE CustomerID <>'

如果你输入了这个代码,你将会看到返回一个询问语句:

SELECT ContactName FROM Customers
WHERE CustomerID = ''
UNION ALL SELECT ContactName FROM Customers
WHERE CustomerID <>''

通过获得空和非空顾客的ID并集,这个查询语句会返回数据库中所有的相关姓名。事实上,这个UNION技术可以被用来获得你数据库中大多数信息,看看这个CustomerID的值:

'UNION ALL SELECT FirstName + ' ' + LastName FROM
Employees WHERE LastName <>'

它将SQL语句变成:

SELECT ContactName FROM Customers
WHERE CustomerID = ''
UNION ALL SELECT FirstName + ' ' + LastName FROM
Employees WHERE LastName <>''

看,那就是攻击程序从你的数据库获得的第一个雇员的名字。

更多的攻击程序
如果SQL注入仅仅只有数据暴光这个弱点就已经够糟糕的了,但是,实际上一个良好的攻击程序可以通过这个弱点获取你数据库中所有的资料。看下面这个例子:

';DROP TABLE Customers;--

SQL语句变成:

SELECT ContactName FROM Customers
WHERE CustomerID = ''
; DROP TABLE Customers;-- '

这个分号使语句和SQL Server隔离,所以,这里实际上是两个语句。第一个语句不存在的名字,第二个则撤消的整个Customers表。两个—SQL Server注释符,它可以使子句不发生语法错误。

使用这个技术的变异,一个攻击程序可以在任何SQL语句或者存储过程上运行。通过使用xp_cmdshell扩展存储过程,一个攻击程序同样可以在操作系统命令下运行,显然,这是一个严重的漏洞。

保护自己的数据库
现在,你知道如何防范SQL注入攻击了吗?首先,你不能在用户输入中构造WHERE子句,你应该利用参数来使用存储进程。在最初的ASP页面下,重新写的部分将和刚才我们在表中所看到的东西相似。即使你认为在你的应用程序中没有脆弱点,你应该遵守最小特权原则。使用我们建议的其他安全技术允许你的用户仅仅访问他们能够访问的。在你没有发现你数据库脆弱点的时候,只有这样,不会使你的数据库崩溃。

最后的建议
这就是全部的SQL Server安全系列。也许你现在不是一个全面的专家,但是你已经了解了很多反面。下一步就是你要保护你SQL Server数据,记住你在这里所学到的知识,并利用到你的数据库中保证你的数据不被那些黑客攻击。

分享到:
评论

相关推荐

    sql server 的数据加密与注入

    关于sql server 的数据加密方法的简单介绍,和sql server 注入法的简单介绍。

    SQL手工注入大全:包含各种类型的SQL注入,实现手工注入的乐趣,此资源你值得拥有。

    宽字节注入、SQL手工注入漏洞测试(Oracle数据库)、SQL手工注入漏洞测试(Sql Server数据库)、SQL手工注入漏洞测试(Access数据库)、SQL手工注入漏洞测试(PostgreSQL数据库)、SQL手工注入漏洞测试(MongoDB数据库)、SQL...

    SQL SERVER 2000开发与管理应用实例

    13.5.1 防止SQL注入式攻击 417 13.5.2 限制应用程序访问 418 13.5.3 不安全的扩展存储过程 419 第 14 章 系统表应用实例 423 14.1 系统对象概述 423 14.1.1 每个数据库中都存在的系统表 424 ...

    如何在SQL Server数据库中加密数据

    该文件介绍了关于安全测试注意的问题,如:进行sql注入的攻击网站导致机密信息被盗,对安全进行破坏。

    SQL Server数据库安全策略指南

    在本次的技术手册中,我们将讨论SQL Server数据库安全的话题,其中包括数据加密、SQL注入攻击、角色控制以及安全通信方面的内容,希望对SQL Server安全有个更全面了解的读者,赶紧下载阅读吧。 来自TT

    SQL Server口令 sql server安全性第1/2页

    如果你细心跟踪一下SQL Server数据库服务器的登录过程,你会发现口令计算其实是非常脆弱的,SQL Server数据库的口令脆弱体现两方面:1、网络登陆时候的口令加密算法 2、数据库存储的口令加密算法。 下面就分别...

    sqlserver2000基础(高手也有用)

    13.5.1 防止SQL注入式攻击 417 13.5.2 限制应用程序访问 418 13.5.3 不安全的扩展存储过程 419 第 14 章 系统表应用实例 423 14.1 系统对象概述 423 14.1.1 每个数据库中都存在的系统表 424 14.1.2 仅...

    MSSQLServer支持DES加密

    让MSSQLServer支持DES加密 压缩包内有2套方案,一个是基于dll方式注入,另一个是以二进制方式注入,第二个方式更推荐

    SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文

    其实,用了这十多年的SQL server,我已经成了存储过程的忠实拥趸。在直接使用SQL语句还是存储过程来处理业务逻辑时,我基本会毫不犹豫地选择后者。 理由如下: 1、使用存储过程,至少在防非法注入(inject)方面提供更...

    web.net connstring加密程序

    三、防止sql注入攻击: 这个注入好像是打开Min Pool Size=999999一个很大的值,来破坏数据库。 这个链接保护的方法最好是: Date Source=(local);Initial Catalog=Works;User ID=sa;Password="password01!;...

    Mycat-server-1.6-RELEASE源码

    支持SQL黑名单、sql注入攻击拦截 支持prepare预编译指令(1.6) 支持非堆内存(Direct Memory)聚合计算(1.6) 支持PostgreSQL的native协议(1.6) 支持mysql和oracle存储过程,out参数、多结果集返回(1.6) 支持...

    acra:数据库安全套件。 具有字段级加密的数据库代理,搜索加密数据,防止SQL注入,入侵检测,蜜罐。 支持客户端和代理(“透明”)加密。 SQL,NoSQL

    具有字段级加密和入侵检测功能的数据库保护套件。 | | | | | | ---- | ---- | ---- | --- | --- |什么是阿克拉Acra —用于敏感和个人数据保护的数据库安全套件。 Acra在方便开发人员友好的程序包中提供了字段级加密...

    乘风广告联盟系统 v4.0 (Sql).rar

    10.完全防止Sql注入,密码都是用Md5不可逆加密。 11.自带会员注册系统.系统也提供接口设置,简单方便地支持使用Access或SqlServer数据库的网站的注册系统和本系统集成。 12.Mssql版本,采用组件,存储过程,事务编写,...

    DotBBS V2.1源码

    18 SqlServer版数据库,表增加了描述,方便二次开发 19 更换后台界面 20 论坛默认主目录,放到根目录,方便搜索引擎优化 -----------基本功能------------------------------------------------------- 1 DotBBS...

    计算机专业毕设精选-ASP网络求职招聘系统的设计与实现(源代码+论文).rar

    4. **安全性措施**:通过验证码、密码加密等手段确保用户数据安全,同时采用防止SQL注入等安全策略。 本资源适用于计算机专业的学生、教师或从事相关工作的开发者。通过学习和实践,可以掌握ASP网络求职招聘系统的...

Global site tag (gtag.js) - Google Analytics