在登陸后臺(tái)時(shí),接收用戶輸入的Userid和Password數(shù)據(jù),并分別賦值給user和pwd,然后再用
sql="select * from admin where username="&user&" and password="&pwd&""
這句來對用戶名和密碼加以驗(yàn)證。
以常理來考慮的話,這是個(gè)很完整的程序了,而在實(shí)際的使用過程中,整套程序也的確可能正常使用。但是如果Userid的值和password的值被賦于:safer’ or’1’=’1’ 這時(shí),
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’
有這樣的問題,我們就來試著解決它。從上面的程序中各位也可以看出,只要對用戶輸入的數(shù)據(jù)進(jìn)行嚴(yán)格過濾就可以了。如下:
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 "WL ..jiajia"
response.end
end if
next
%〉
同樣是先取得用戶輸入數(shù)據(jù),然后分析用戶輸入的每一個(gè)字符,如發(fā)現(xiàn)異常,則轉(zhuǎn)到錯(cuò)誤頁面。 if cl="" or us="%" or us="〈" or us="〉" then 這一句中可以加入任意的過濾字符,跟據(jù)具體情況而定。
修補(bǔ):
username=replace(trim(request("username")),"’","")
password=replace(trim(Request("password")),"’","")
把“’”給過濾了
如果想用“’”當(dāng)做密碼就這樣:
1、select * from user where user=’ " & User & "’ "
2、如果返回不為假,則取密碼
pass=rs("passwd")
3、判斷:if pass=password
4、得出結(jié)論。
例如:[/code]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")[/code]
當(dāng)?shù)顷懱峤挥脩舻顷懕韱螘r(shí),數(shù)據(jù)庫會(huì)執(zhí)行以下的代碼
sql=``sele ct * from user s where username=`` and password = ``
一般用`or`=`or`提交進(jìn)去后,這段代碼就會(huì)執(zhí)行這樣的程序 。
sql=``sele ct * from user s where username=` `or`=`or` ` and password = ` `or`=`or` `
`or`的前面一個(gè)單引號,就會(huì)和數(shù)據(jù)執(zhí)行中 username=` 中的這個(gè)單引號,形成一個(gè)雙引號,是由于數(shù)據(jù)庫中 單引號和雙引號的區(qū)分不是很明確,所以 username=``or`=`or`` 中的兩個(gè)單引號就會(huì)誤認(rèn)為是合法的語法,執(zhí)行的用戶名就是 or`=`or 這樣的話,數(shù)據(jù)庫會(huì)返回所有用戶名,而uers數(shù)據(jù)庫會(huì)認(rèn)為登陸用戶合法(密碼同理),便而可以進(jìn)入后臺(tái)。
常用的后臺(tái)萬能登陸密碼:
'or''='
"or=or"
'or''=''or''='
'or'='or'
'or'='1'
'or' '1'='1'
or 'a'='a'
修補(bǔ)方法:
在后臺(tái)登錄文件源代碼中找到這些代碼:
<%
pwd = request.form("pwd")
name = request.form("name")
Set rs = Server.CreateObject("ADODB.Connection")
sql = "select * from Manage_User where UserName='" & name & "' And PassWord='"&encrypt(pwd)&"'"
由于接受變量pwd、name時(shí)沒有做任何處理。才導(dǎo)致這個(gè)漏洞。我們要讓它進(jìn)行處理,過濾掉“'”符號。只要把文件改成以下代碼即可:
<%
pwd = replace(trim(request.form("pwd")),"'","")
name = replace(trim(request.form("name")),"'","")
Set rs = Server.CreateObject("ADODB.Connection")
sql = "select * from Manage_User where UserName='" & name & "' And PassWord='"&encrypt(pwd)&"'"