- 帖子
- 15
- 积分
- 23
- 威望
- 30
- 金钱
- 30
- 在线时间
- 0 小时
|
9楼
发表于 2008-7-23 08:37
| 只看该作者
引用:
下面是引用haicao于06-12-2005 13:19发表的:
如果是asp+access结构的话.
过不过滤无所谓.
asp+access密码验证可以这样写
...
.....
.......
sql="select * from ad where user='"&user&"'"
rs.open sql,conn,1,1
if password=rs("password") then
成功登陆!
end if
user字段俺这么输:
admin' or password='123456
如果运气好,有个密码正好是123456的
在密码字段再输个 123456
不就进去了么?
对于字符输入,还是过滤的比较好,至少单引号必须过滤
这样一来,被单引号引起来的东西,无论如何躲不过去了
比如'&user&'
把单引号转换为& #39;
只要user字段输任何东西,都会当作字符串处理,而单引号一出现又被替换掉
那么该字段的注射就不可能了(愚见,请大家批评)
所以事实上很多的注射都是发生在数字型参数里,因为程序员总是记得对于数字型的参数,在SQL里是不需要用单引号引起来的,那么,即使进行了过滤,如果不充分,还是可以进行注射的.
比如在BBSXP上次的blog.asp中,有个id字段进行了过滤,但是,我们完全可以绕过去.
复制内容到剪贴板
代码:
if id<>"" then
sql="select * from [calendar] where id="&id&" order by id Desc"
虽然这个id变量过滤掉了'
不过对于AC的我们构造一个union查询
12 union select 1,2,username,userpass,5,6,7 from [user] where membercode=5
就可以查询区长的用户名和密码了,当然,修改条件查询任何人的密码也没问题的
对于MSSQL,union会出错,那么我们这么做:
12 and exists(select * from clubconfig where substring(adminpassword,1,1) between 0x30 and 0x46)
这样就跳过了单引号的限制,还有比较大小时用到的>和<符号
用二分法很容易得到所有数据,毕竟这种公开代码的程序的表的结构都很清楚
总结:
要防止用' or ''='登陆后台,应该说是要防止SQL 注射
防止SQL注射,个人认为最简单的注意方法有两个,1,检查所有输入,凡字符型,过滤掉单引号,并且用单引号引起来.
比如
user=replace(request(user),"'")
select * from admin where user='"&user&"'
如果是数字型,直接用
id=int (request(id))
select * from blog where id="&id&"
个人认为这样基本上就差不多了,有错误的地方欢迎大家指正个人论坛: http://www.xdxf.net
帖子60 精华2 积分3417 阅读权限100 性别男 在线时间134 小时 注册时间2005-5-3 最后登录2008-5-28 查看详细资料TOP
evilow
晶莹剔透§烈日灼然 |
|