当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 浅谈数据库的攻击

MSSQL
Microsoft SQLServer的版本区别及选择
在SQL Server数据库中为标识(IDENTITY)列插入显式值
访问和更改关系数据,使用MSSQL外联接
一个查看MSSQLServer数据库空间使用情况的存储过程 SpaceUsed
SQL语句去掉重复记录,获取重复记录
复习一下sql server的差异备份
SQL中object_id函数的用法
SQL Server日期计算
找回SQL企业管理器里的SQL连接的密码的方法
mssql数据库系统崩溃后的一般处理步骤与方法
海量数据库的查询优化及分页算法方案
SQL Server连接中三个常见的错误分析
在程序中压缩sql server2000的数据库备份文件的代码
MS SQL SERVER 数据库日志压缩方法与代码
如何远程连接SQL Server数据库的图文教程
复制SqlServer数据库的方法
搜索sql语句
sql中返回参数的值
sql中生成查询的模糊匹配字符串
将Session值储存于SQL Server中

MSSQL 中的 浅谈数据库的攻击


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 36 ::
收藏到网摘: n/a

  浅谈数据库的攻击(荐)

1。突破script的限制。  

例如,某网页上有一文本框,允许你输入用户名称,但是它限制你只能输入4个字符。许多程序都是在客户端限制,然后用msgbox弹出错误提示。如果你攻击时需要突破此限制,只需要在本地做一个一样的主页,只是取消了限制,通常是去掉VBscript或IavaScript的限制程序,就可以成功突破。  

如果是javascript做的,干脆临时把浏览器的脚本支持关掉。如果是  
有经验的程序员常常在程序后台再做一遍检验,如果有错误就用response.write或类似的语句输出错误。  

2。对SQL的突破  

例如某网页需要你输入用户名称和口令,这样就有两个文本框等待你的输入,现在我们假设有一用户adam,我们不知道他的口令,却想以他的身份登陆。  

正常情况下,我们在第一个文本框输入adam,第二个文本框输入1234之类的密码,如果密码正确就可以进入,否则报错。  

程序中的查询语句可能是:  

sql="select * from user where username='"&text1.value&"' and passwd= '"&text2.value&"'"  

执行时候就是  

select * from user where username='adam' and passwd='1234'  

好了,  

如果我们在text2里输入的不是1234,而是1234'"&"'or 1=1  

我们的sql语句就成了,  

select * from user where username='adam' and passwd='1234' or 1=1  

我们就可以进入了。。。  

有经验的用户就在程序中增加对单引号等特殊字符的过滤。  

但是,一般人习惯上有两种登录认证方式我就用ASP的VBScript做例子了:  

一是用select * from ... where username = ' & Request.Form("username") & "password = " & Request.Form("password"),然后判断结果是否为空来验证。其实还有一种方式:  

用select * from ... where username = ' & Request.Form("username"), 然后判断结果集中的密码是否和输入相同来验证,这种方式就安全一些了。  

3。利用多语句执行漏洞。  

根据上面的思路,如果用户根据书名(例如linux入门)查询所有的书,SQL语句为  

select book.name,book.content from book where bookname='linux入门'  

如果我们输入的不是linux入门而是 linux入门' delete from user where '1' = '1  

从而构成对表的删除。  

成功的前提条件是对方允许多条语句的执行。  

由于程序没有处理边界符“'”产生的漏洞的危害程度和结果集的类型及数据库的配置有很大的关系。首先说结果集,如果结果集只支持单条的SQL语句,那么你所能做的只是上面提到的那种在密码框内输入' or '1' = '1来登录,其他的做不了。  

我们还可以用这种方法在数据库里增加用户。  

4。SQL Server装完后自动创建一个管理用户sa,密码为空。而好多人装完后并不去改密码,这样就留下了一个极大的安全问题,我稍后再细说。  

程序中的连接一般用两种,不是用global.asa就是用SSL文件。SSL文件一般人习惯放到到Web的/include或/inc目录下。而且文件名常会是conn.inc、db_conn.inc、dbconninc,等等,反正有时能猜到。  

如果这个目录没有禁读,一旦猜到文件名就可以了,因为.inc一般不会去做关联的,直接请求不是下载就是显示源文件。  

还有当主要程序放到一个后缀为.inc的文件而没有处理“'”,当运行出错时返回的出错信息中常会暴露.inc文件,我遇到过几次这样的情况。其实可以在IIS里设置来不回应脚本出错信息的。  

5。数据库的利用。  

如果程序中的连接用户权限极小,甚至多数表只能读,你就很难有所作为了。这时所能做的是能猜出表名和字段名来进行删除数据或表的操作。  

INSERT语句利用起来讨厌一些,主要是里面有好多列,而且还要处理掉最后的“)”。  

我就以我最熟悉的MS SQL Server来说一些吧。它的默认端口号是1433,你用telnet连一下服务器的这个端口,如果能连上去一般是装了MS SQL Server,当然这是可以改掉的。  

好了,说一说数据库的利用。  

如果对方的数据直接在Web服务器上而且你知道端口号,有帐号就干脆用SQL Analyzer来直接连接数据库。在它里面可以执行SQL语句。常用的是存储过程master.dbo.xp_cmdshell,这是一个扩展存储过程,它只有一个参数,把参数做为系统命令来装给系统执行。  <