首页 | 源码下载 | 网站模板 | 网页特效 | 广告代码 | 网页素材 | 字体下载 | 书库 | 站长工具
会员投稿 投稿指南 RSS订阅
当前位置:主页>网络编程>SQL server>资讯:SQLServer应用程序中的高级SQL注入

SQLServer应用程序中的高级SQL注入

www.jz123.cn  2008-09-09   来源:   中国建站    袁袁整理    我要投递新闻


Sp_password
到一个Transact-SQL语句中,这个审计机制记录日志如下:
--''sp_password''wasfoundinthetextofthisevent.
--Thetexthasbeenreplacedwiththiscommentforsecurityreasons.
这种行为发生在所有的T-SQL日记记录中,即使''sp_password''发生在一个注释中。这个过程打算通过sp_password隐藏用户的密码,但这对于一个攻击者来说是非常有用的方法。
因此,为了隐藏所有注入,攻击者需要简单地在''—''注释字符后追加sp_password,例如:
Username:admin''—sp_password
事实上一些被执行的SQL将被记录,但是查询本身将顺利地从日志中消失。

[防范]
这部分讨论针对记述的攻击的一些防范。我们将讨论输入确认和提供一些简单的代码,然后我们将从事SQLSERVER锁定。

[输入验证]
输入验证是一个复杂的题目。比较有代表性的是,自从过于严密地确认倾向于引起部分应用程序的暂停,输入确认问题很难被解决,在项目开发中投入很少的注意力在输入确认上。输入确认不是倾向于将它加入到应用程序的功能当中,因此它一般会被忽视。
下面是一个含有简单代码的讨论输入确认的大纲。这个简单的代码不能直接用于应用程序中,但是它十分清晰地阐明了不同的策略。
不同的数据确认方法可以按以下分类:
1)努力修改数据使它成为正确的
2)拒绝被认为是错误的输入
3)只接收被认为是正确的输入
第一种情况有一些概念上的问题;首先,开发人员没必要知道那些是错误数据,因为新的错误数据的形式始终被发现。其次,修改数据会引起上面描述过的数据的长度问题。最后,二次使用的问题包括系统中已经存在数据的重新使用。
第二种情况也存在第一种情况中的问题;已知的错误输入随着攻击技术的发展变化。
第三种情况可能是三种中最好的,但是很难实现。
从安全角度看合并第二种方法和第三种方法可能是最好的方法——只允许正确的输入,然后搜索输入中已知的错误数据。
带有连接符号的姓名的问题对于体现合并两种方法的必要性是一个好的例子:
QuentinBassington-Bassington
我们必须在正确输入中允许连接符号,但是我们也意识到字符序列''—''对SQLSERVER很重要。
当合并修改数据和字符序列确认时,会出现另一个问题。例如,如果我们应用一个错误过滤在除去单引号之后去探测''—'',''select''和''union'',攻击者可以输入:
uni''onsel''ectversion-''-
既然单引号被除去,攻击者可以简单地散布单引号在自己的错误的字符串中躲避被发现。
这有一些确认代码的例子:
方法一——过滤单引号
functionescape(input)
input=replace(input,"''","''''")
escape=input
endfunction

方法二——拒绝已知的错误输入
functionvalidate_string(input)
known_bad=array("select","insert","update","delete","drop","—","''")
validate_string=true
fori=lbound(known_bad)toubound(known_bad)
if(instr(1,input,known_bad(i),vbtextcompare)<>0)then
validate_string=false
exitfunction
endif
next
endfunction

方法三——只允许正确的输入
functionvalidatepassword(input)
good_password_chars=”abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789”
validatepassword=true
fori=1tolen(input)
c=mid(input,I,1)
if(InStr(good_password_chars,c)=0)then
validatepassword=false
exitfunction
endif
next
endfunction

[SQLSERVER锁定]
在这指出的重要一点是锁定SQLSERVER是必要的;外面的是不安全的。这是一个但创建SQLSERVER时需要做的事情的简短的列表:
1.确定连接服务器的方法
a.确定你所使用的网络库是可用的,那么使用"NetworkUtility"
2.确定哪些帐户是存在的
a.为应用程序的使用创建一个低权限的帐户
b.删除不必要的帐户
c.确定所有帐户有强壮的密码;执行密码审计
3.确定哪些对象存在
a.许多扩展存储过程能被安全地移除。如果这样做了,应该移除包含在扩展存储过程代码中的''.dll''文件
b.移除所有示例数据库——例如''northwind''和''pubs''数据库
4.确定哪写帐户能过使用哪些对象
a.应用程序进入数据库所使用的帐户应该有保证能够使用它需要的对象的最小权限
5.确定服务器的补丁
a.针对SQLSERVER有一些缓冲区溢出和格式化字符串攻击,也有一些其他的安全补丁发布。应该存在很多。
6.确定什么应该被日志记录,什么应该在日志中结束。

上一篇:sql标签嵌套调用实现循环显示栏目文章标签 下一篇:MYSQL使用简述

评论总数:2 [ 查看全部 ] 网友评论


关于我们隐私版权广告服务友情链接联系我们网站地图