网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

不当编写SQL语句导致系统不安全


发布日期:2020年11月30日
 
不当编写SQL语句导致系统不安全

在一般的多用户应用系统中只有拥有正确的用户名和密码的用户才能进入该系统我们通常需要编写用户登录窗口来控制用户使用该系统这里以Visual Basic+ADO为例

漏洞的产生

用于登录的表

Users(namepwd)

建立一个窗体Frmlogin其上有两个文本框TextText和两个命令按钮cmdokcmdexit两个文本框分别用于让用户输入用户名和密码两个命令按钮用于登录退出

定义Ado Connection对象和ADO RecordSet对象

Option Explicit

Dim Adocon As ADODBConnection

Dim Adors As ADODBRecordset

在Form_Load中进行数据库连接

Set Adocon = New ADODBConnection

AdoconCursorLocation = adUseClient

adoconOpen Provider=MicrosoftjetOLeDB;Data Source= && _

AppPath && estmdb;

cmdok中的代码

Dim sqlstr As String

sqlstr = select * from usersswheresname= && TextText && _

and pwd= && TextText &&

Set adors = New ADODBRecordset

Set Adors=AdoconExecute(sqlstr)

If AdorsRecordcount> Then //或If Not AdorsEOF then

MsgBox Pass //通过验证

Else

MsgBox Fail //未通过验证

End if

运行该程序看起来这样做没有什么问题但是当在Text中输入任意字符串(如)在Text中输入a or a=a时我们来看sqlstr此时的值

select * from usersswheresname= and pwd=a or a=a

执行这样一个SQL语句由于or之后的a=a为真值只要users表中有记录则它的返回的eof值一定为False这样就轻易地绕过了系统对于用户和密码的验证

这样的问题将会出现在所有使用select * from usersswheresname= && name && and pwd= && password &&的各种系统中无论你是使用那种编程语言

漏洞的特点

在网络上以上问题尤其明显笔者在许多网站中都发现能使用这种方式进入需要进行用户名和密码验证的系统这样的一个SQL漏洞具有如下的特点

与编程语言或技术无关

无论是使用VBDelphi还是ASPJSP

隐蔽性

现有的系统中有相当一部分存在着这个漏洞而且不易觉察

危害性

不需要进行用户名或密码的猜测即可轻易进入系统

解决漏洞的方法

控制密码中不能出现空格

对密码采用加密方式

这里要提及一点加密不能采用过于简单的算法因为过于简单的算法会让人能够构造出形如a or a=a的密文从而进入系统

将用户验证和密码验证分开来做先进行用户验证如果用户存在再进行密码验证这样一来也能解决问题

上一篇:木马克星与瑞星、诺顿闹矛盾

下一篇:黑客入侵WindowsXP常用的七种方法