我的ASP程序有后门,请大家帮忙看看是怎么回事

zhangyaocom 2011-12-07 11:30:08
我的ASP程序有后门,因为我后台有登录记录
但凡是登录过系统的人,无论帐号密码对与错,都会记录上去,前提是输入了帐号和密码

但是我今天看记录的时候,有一个用户名为空的记录登录了,登录显示错误
但是我的登录页面设置了,正常后台登录,如果帐号或者密码为空,就提示为空,不能登录.就不会记录登录记录
我不知道这个后门是怎么被人利用的,他用空帐号登录了,并且显示在后台登录记录里了.

ASP高手们,帮小弟,看看这是怎么回事
...全文
110 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyaocom 2011-12-07
  • 打赏
  • 举报
回复
我后台验证了,后台当然要验证的
<%
Dim Rs,Sql
Admin=Trim(Request.Form("Admin"))

Pass=Md5(Trim(Request.Form("Pass")))

Admin=Replace(Admin,"'","''")

Pass=Replace(Pass,"'","''")

set Rs=Server.CreateObject("ADODB.RecordSet")

Sql="select * from AdminData where Name='" & Admin & "' and Pass='" & Pass & "'"
Rs.Open sql,conn,1,3

if Rs.eof and Rs.bof then
Rs.close
Set Rs=nothing
InsertLog(False)
response.write"<SCRIPT language=JavaScript>alert('用户名或密码不正确!');"
response.write"javascript:history.go(-1)</SCRIPT>"
Response.end
Else
Session("Admin_name") = Rs("Name")
Session("Last_Ip") = Rs("Login_Ip")
Session("Login_Ip") = Request.ServerVariables("REMOTE_HOST")
Session("Last_Time") = Rs("Login_Time")
Session("Login_Time") = Now()
Rs("Last_Ip") =Rs("Login_Ip")
Rs("Login_Ip") = Request.ServerVariables("REMOTE_HOST")
Rs("Last_Time") =Rs("Login_Time")
Rs("Login_Time") = Now()
Rs.Update
Rs.Close
Set Rs = Nothing
InsertLog(True)
Response.Redirect "index.asp"
end if
%>


这是提交登录用户名和密码的表单后,进行验证的代码

但是还是有一个用户名为空的登录过我的后台,我就奇怪了,怎么可以用户名为空呢?

大家帮忙看看啊,小弟不胜感激
默默不得鱼 2011-12-07
  • 打赏
  • 举报
回复
直接把浏览器JS脚本禁用掉就跳过你那验证了 后台也要验证的
zhangyaocom 2011-12-07
  • 打赏
  • 举报
回复
楼上大的哥,有Q吗?我给你在Q上发个截图,让你看一下
hookee 2011-12-07
  • 打赏
  • 举报
回复
直接通过程序用 http协议递交就可以绕过前台判断的,所以后台程序也要做判断。
zhangyaocom 2011-12-07
  • 打赏
  • 举报
回复
在前台判断的
在前台已经通过javascript语句进行了判断,但是后台里仍然有一个用户名为空的,登录了进来
这就是我奇怪的地方
hookee 2011-12-07
  • 打赏
  • 举报
回复
正常后台登录,如果帐号或者密码为空,就提示为空 <---这个是在前台程序还是后台程序判断的? 光前台程序判断是没有用的.
  • 打赏
  • 举报
回复
后台也要验证不能为空这是最基本的
  • 打赏
  • 举报
回复
典型的 最简单的BUG
清水滴竹 2011-12-07
  • 打赏
  • 举报
回复
应该在前台和后台都要验证,应为只在前台验证,别人可以通过家提交,绕过你的前台界面直接提交的
chate 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhangyaocom 的回复:]
数据库是ACCESS

我想知道的是,为什么一个空的用户名,曾经在后台有过登录记录,并且登录记录是失败的

我前台通过javascript已经较验了如果为空则不提交表单了
[/Quote]应该是发帖机一类的程序入侵。它禁用js你就无法校验,预先知道你的程序类型,登录就不成问题!
cjfriends 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hookee 的回复:]
不是非得要通过浏览器才能递交表单呀。
[/Quote]

不是说了吗?人家未必是通过你的界面操作的
zhangyaocom 2011-12-07
  • 打赏
  • 举报
回复
谁能解答一下,为什么空用户名,会有过登录记录?
后台的登录记录就显示了一个帐户为空的登录失败的记录
hookee 2011-12-07
  • 打赏
  • 举报
回复
不是非得要通过浏览器才能递交表单呀。
Access一样可以用参数化查询, 连接改成access即可.
zhangyaocom 2011-12-07
  • 打赏
  • 举报
回复
数据库是ACCESS

我想知道的是,为什么一个空的用户名,曾经在后台有过登录记录,并且登录记录是失败的

我前台通过javascript已经较验了如果为空则不提交表单了
hookee 2011-12-07
  • 打赏
  • 举报
回复
数据库是sql server还是access? sql server的话光Admin=Replace(Admin,"'","''")是 不行的
用参数化查询


Set conn = CreateObject("ADODB.Connection")
conn.Open "Provider=SQLNCLI;Server=127.0.0.1;Database=XXX;Uid=sa;Pwd=sa;"

Admin = Trim(Request.Form("Admin"))
Pass = Md5(Trim(Request.Form("Pass")))
sql = "SELECT * FROM AdminData WHERE Name=? AND Pass=?"
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = conn
cmd.CommandText = sql
cmd.CommandType = 1
cmd.Prepared = True
Set prm = cmd.CreateParameter("Name", 200, 1, 50, Admin)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("Pass", 200, 1, 50, Pass)
cmd.Parameters.Append prm
Set rs = CreateObject("ADODB.RecordSet")
rs.CursorLocation = 3
rs.Open cmd, , 1, 3
If rs.BOF And rs.EOF Then
rs.close
Set rs = Nothing
conn.Close
Set conn = Nothing
InsertLog(False)
response.write "<SCRIPT language=JavaScript>alert('用户名或密码不正确!');"
response.write "javascript:history.go(-1)</SCRIPT>"
Response.end
Else
Session("Admin_name") = rs("Name")
Session("Last_Ip") = rs("Login_Ip")
Session("Login_Ip") = Request.ServerVariables("REMOTE_HOST")
Session("Last_Time") = rs("Login_Time")
Session("Login_Time") = Now()
rs("Last_Ip") = rs("Login_Ip")
rs("Login_Ip") = Request.ServerVariables("REMOTE_HOST")
rs("Last_Time") = rs("Login_Time")
rs("Login_Time") = Now()
rs.Update
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
InsertLog(True)
Response.Redirect "index.asp"
End If


lifefamily 2011-12-07
  • 打赏
  • 举报
回复
Admin=Trim(Request.Form("Admin"))

Pass=Md5(Trim(Request.Form("Pass")))

Admin=Replace(Admin,"'","''")

Pass=Replace(Pass,"'","''")

这一块不严谨!!其一,如果pass是MD5加密过的了,根本没有必要再Pass=Replace(Pass,"'","''")。
其二,Admin仅替换'是不科学的,需要同时过滤其它字符,不然不要写入SQL查询语句中。
修正方法:
(1)限定 admin长度,如
if len(admin)>12 then
response.end
因为攻击代码绝大部分是多于12个字符的。这样即使有攻击代码,也无法成功。
(2)加强过滤,对于%,;等也要过滤。
(3)或加用攻击字符判断,例如,如果发现异常字符,自动中止,而不是replace

28,409

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧