|
注入主要的原因出在sql语句上.
主要表现为检查密码时采用如下的sql
假设提交的用户名为变量a
提交的密码为变量b
则查询语句为
"select * from admin where username='"+a+"' and userpwd='"+b+"'"
执行语句后只要判断返回的记录集是否为空的就ok.
这里存在的问题是, 我们可以利用sql的特点, 在密码这一项里面, 变换一下.
假设我们提交的密码为"' or '1'='1",用户名随便,假设为"abc"
那么上述的sql语句执行后会变为
"select * from admin where username='abc' and userpwd='' or '1'='1'"
由于后面是or '1'='1'
所以这个查询会返回admin表所有的记录!
如果单纯地判断记录集为空的话, 那么这时无疑是会显示登录成功!
之前给了一个还有这个漏洞的网站, 觉得有点不厚道. 还是改掉算了. 大家要注意哦.
我的一个简单的解决办法是先查找用户名
select * from admin where username='abc'
然后返回记录集,注意上面这句一样可以注入, 会返回所有的记录
然后我们判断密码, 此时指针是指向第一条记录的, 我们取密码域跟提交的值比较. 这里的密码用MD5加密.服务器端密码是以密文形式存放的. 这样注入的语句经MD5函数转换后便使得注入的那部分无效化,这样可以很大程序上避免注入攻击. 但不排除某人碰中第一条记录密码的可能, 呵呵.
正确的处理办法是限制注册用户名和密码不能含有空格等特殊字符.然后登陆判断时可以查检查这些字符. 然后再组成sql语句.
[ 本帖最后由 庐山升龙霸 于 2006-3-30 10:14 编辑 ] |
|