|
漏洞描述:
在login.asp中,接收用户输入的Userid和Password数据,并分别赋值给user和pwd,然后再用sql=\"select * from admin where username=\"&user&\" and password=\"&pwd&\"\" 这句来对用户名和密码加以验证。
以常理来考虑的话,这是个很完整的程序了。而在实际的使用过程中,整套程序也的确可能正常使用。
但是如果Userid的值和password的值被赋于:safer’ or’1’=’1’ 这时,sql=\"select * from admin where username=\"&user&\" and password=\"&pwd&\"\" 就成了:
sql=\"select * from reg where user=safer’ or’1’=’1’ and pass=safer’ or’1’=’1’
怎么样?!我不说大家也明白了吧!
既然有这样的问题,接下来我们就来看看如何解决它。从上面的程序中各位也可以看出,只要对用户输入的数据进行严格过滤就可以了。具体可以参下面的程序:
Quote
〈%
user=request.from(\"UserID\")
pass=request.from(\"password\")
for i=1 to len(UserID)
cl=mid(UserID,i,1)
if cl=\"\" or us=\"%\" or us=\"〈\" or us=\"〉\" then
response.redirect \"54safer ..haha\"
response.end
end if
next
%〉
同样是先取得用户输入数据,然后分析用户输入的每一个字符,如发现异常,则转到错误页面。
if cl=\"\" or us=\"%\" or us=\"〈\" or us=\"〉\" then 这一句中可以加入任意的过滤字符,跟据具体情况而定。
********************************************************************
漏洞修补:
username=replace(trim(request(\"username\")),\"’\",\"\")
password=replace(trim(Request(\"password\")),\"’\",\"\")
把“’”给过滤了
如果你想用“’”当做密码 就用下面的方法
1、select * from user where user=’ \" & User & \"’ \"
2、如果返回不为假,则取密码
pass=rs(\"passwd\")
3、判断:if pass=password
4、得出结论。
例子:
Quote
sql=\"select * from ****_admin where admin_pass=’\"&admin_pass&\"’ and admin=’\"&admin&\"’\"
rs.open sql,conn,1,3
if not(rs.bof and rs.eof) then
if admin_pass=rs(\"admin_pass\") then
session(\"admin\")=rs(\"admin\") |
|