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

MSSQL
SQLServer中求两个字符串的交集
SQL Server 触发器 表的特定字段更新时,触发Update触发器
SQL 查询分析中使用net命令问题
SQLServer 批量导入目录文件
sql语言中delete删除命令语句详解
Linq to SQL 插入数据时的一个问题
一个简单的SQL 行列转换语句
SQLServer 常用语句(按功能分)
SQLServer 管理常用SQL语句
SQL Server 2000中的触发器使用
SQL小技巧 又快又简单的得到你的数据库每个表的记录数
Sql Server 2000删除数据库备份文件
批量更新数据库所有表中字段的内容,中木马后的急救处理
sqlserver 通用分页存储过程
远程连接局域网内的sql server 无法连接 错误与解决方法
目前用到的两个分页存储过程代码
sqlserver 多表关联时在where语句中慎用trim()方法
Sql2005注射辅助脚本[粗糙版]
sql 2005不允许进行远程连接可能会导致此失败的解决方法
MSSQL2005数据库备份导入MSSQL2000

MSSQL 中的 浅谈数据库的攻击


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 110 ::
收藏到网摘: 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,这是一个扩展存储过程,它只有一个参数,把参数做为系统命令来装给系统执行。  <