WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 2229查看
  • 0回复

[经验分享] SQL Injection如何攻击

主题

好友

2712

积分

禁止访问

发表于 2010-2-2 20:33:13 |显示全部楼层
SQL Injection 攻击
http://www.sqlsecurity.com
SQL Injection是一个描述将SQL代码传递到一个并不被开发人员所想要的应用程序中去的专业术语。因为我们要讨论的这个问题并不是特定限制于SQL Server,所以可以不将它作为SQL Server的常见问题。而且在数据库服务遇到的大部分实际问题中,也可以允许不将SQL injection当作错误看待。这相当多的问题是因为输入检验不严格和在错误的代码层中编码引起的。但是这个问题又是如此的常见,所以我们认为这应该放在SQL Server的安全问题中来共同讨论。
几乎所有的SQL Servers (Sybase, Oracle, DB2)都存在SQL Injection这样的问题。
到底是什么原因引起SQL Injection的呢?
通常是由于程序开发人员使用\\\"string-building\\\"技术去运行SQL代码引起的。比如,在一个搜索的页面中,开发人员可以使用以下代码去执行请求(显示的是VBScript/ASP的例子):
Set myRecordset = myConnection.execute(\\\"SELECT * FROM myTable WHERE someText =\\\<|>\\\" & request.form(\\\"inputdata\\\") & \\\"\\\<|>\\\")
以上可能SQL injection问题的原因是开发人员犯了一个很常见的错误:输入检验不严格 。完全信任用户输入的任何恶意字符和代码,下面让我们来看一看在数据库的搜索栏中输入以下内容时服务器的反应:
\\\<|> exec master..xp_cmdshell \\\<|>net user test testpass /ADD\\\<|> --
这时, 请求字符串被发送到SQL Server, 服务器将处理以下代码:
SELECT * FROM myTable WHERE someText =\\\<|>\\\<|> exec master..xp_cmdshell \\\<|>net user test testpass /ADD\\\<|>--\\\<|>
注意, 用户输入的第一个单引号关闭了这个字符串,SQL Server 非常渴望运行下一个SQL statement,包括一个添加本地用户帐号到数据库中的命令。如果这个应用程序以 \\\<|>sa\\\<|>来运行,MSSQL SERVER 服务将会被渴望去访问这台机器的用户以足够的权限来运行。另外,我们也要注意“--”将会迫使SQL Server 忽略其后面的引号。

单引号并不是唯一的问题,作为搜索输入时,输入数字反而比输入字符串安全多了。而且如果顶替比自己权限要高的用户输入数据时,开发人员将不会去检验输入,并且SQL Server将有可能去运行它。至于到底会造成多大的影响,这依奈于injected代码是被以什么级别的权限运行。最不幸的是以像\\\<|>sa\\\<|>或某个数据库的拥有者的权限去运行。在很多情况下开发人员这样做完全是为了避免配置和维护数据库对象的权限。
这有一张关于使用了过高权限运行数据库应用程序的影响的表格 :
权限级别 后果
sa 拥有SQL Server的所有控制权. 能够读/写/废除数据库上存储的所有数据 。
数据库拥有者 能够读/写所拥有的数据库上的所有数据.能投递表格,建立新的对象,通常有所拥有的数据库的完全控制权.
普通用户 (推荐) 能够访问所有被给予访问权限的对象. 最好,仅仅能运行一些存储过程 往最坏的去想,可能能读/写有权访问的table和view。

攻击方法:
见"详细"部分

解决方案:
在应用程序中,防止SQL Injection的几种方法:
· 如果用户被要求输入一个数字, 使用ISNUMERIC 或类似的函数检验数据类型
· 对于字符串输入, 使用replace( ) 函数将单引号用双引号代替。
goodString = replace(inputString,\\\<|>,\\\<|>\\\<|>)
· 使用存储进程对数据的访问进行抽象,使其他用户不能直接访问table或 view
· 在使用存储进程时, 使用ADO 控制对象,使变量变得强壮。
· 建立有关代码检查和peer-test 的强壮代码标准。
如果应用程序遭到SQL Injection攻击我们又是如何检测的呢?
我们推荐的方法是在测试平台上暂时地禁止错误的handling,以便ODBC错误或SQL Server错误显示出来。你也能简单地尝试输入单引号到你的应用程序中去,看是否会引起错误 . 引起错误的原因通常认为是脆弱的输入认证机制和非法的SQL字符串.
总之,良好的代码检查习惯是最好的方法。现在舍得花时间,花人力去做比事情发生了再去做强一万倍。

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-2 15:19 , Processed in 0.075409 second(s), 16 queries .

返回顶部