|
来源:曾经感动'sBlog
一.接触起因
这几天事情较多,一直都没去老大的论坛转!今天好友joli突然Q我说论坛上有人发了个脚本的问题,叫我也一起看一下,于是我就跑过去看了下(你家离论坛很近?竟然可以跑着过去!),也就有了下面这篇文章(测试版本为讯时新闻发布系统v2.70版)。
二.漏洞初探
打算先看有没有经典的OR漏洞,虽然已经出来很久的漏洞了,但是很多程序仍然会存在这样的漏洞,admin_login.asp存在如下代码: ifrequest("user")=""orrequest("pass")=""then conn.close setconn=nothing Response.Redirect"login.asp?id=0" ’如果user或者pass等于空就掉转到login.asp?id=0这个页面上 else'注释下如果上面条件不成立就执行下面语句
user=LCase(chkhtm(request("user")))'注释下这里先用chkhtm函数过滤然后用lcase在过滤 pass=md5(chkhtm(trim(request("pass")))) ’然后带入sql语句查询 sql="select*fromadminwhere[user]='"&user&"'and[pass]='"&pass&"'" Setrs=Server.CreateObject("ADODB.RecordSet") rs.Opensql,conn,1,1
好!上面关键的地方我都进行了一下注释,最关键的地方就是chkhtm函数,他是做什么的?我在titleb.asp中找到了他的定义! functionchkhtm(stra) stra=replace(stra,"<","<") stra=replace(stra,">",">") stra=replace(stra,"'","") stra=replace(stra,"(","(") stra=replace(stra,")",")") stra=replace(stra,";",";") stra=replace(stra,",",",") stra=replace(stra,"%","%") stra=replace(stra,"+","+") chkhtm=stra endfunction
很明显的一个过滤函数,在函数的第四行,已经过滤掉了“'”号了,所以OR漏洞是没戏了,思路到这里就断了。
三.再探漏洞
在查看代码的时候曾经被某人误导,一直抓不到点子上去了,这时候花非花刚好来上网,我把程序传给他,他把思路告诉我,然后他让我看了admin_chk.asp文件,大概代码如下:
<%
1.session("admin__user")=Request.Cookies("adminuser") 2.session("admin__pass")=Request.Cookies("adminpass") 3.session("dJ")=Request.Cookies("admindj")
4.adminuser=Request.Cookies("adminuser") 5.adminpass=Request.Cookies("adminpass") 6.admindj=Request.Cookies("admindj")
7.ifadminuser=""oradminpass=""then 8.Response.Redirect"login.asp?id=8" 9.endif
...省略部分代码...
10.user=trim(session("admin__user")) 11.pass=session("admin__pass")
12.sql="select*fromadminwhere[user]='"&adminuser&"'and[pass]='"&adminpass&"'" 13.Setrs=Server.CreateObject("ADODB.RecordSet") 14.rs.Opensql,conn,1,1 15.ifrs.recordcount=0then 16.Response.Redirect"login.asp?id=8" 17.endif ...再省略... %>
1,2,3是通过request.cookies方法从客户端获取cookie信息(KEY分别是adminuser,adminpass,admindj),并存入session中,分别对应:session("admin__user")、session("admin__pass")、session("dj")。然后在4,5,6分别把Request.Cookies("adminuser"),Request.Cookies("adminpass"),Request.Cookies("admindj")的值存入变量adminuser,adminpass,admindj中,如果变量adminuser,adminpass的值为空,就转到login.asp?id=8页面,10,11是将session("admin__user")和session("admin__pass"),存入变量user和pass中。12,13,14将变量adminuser和adminpass的值参与sql查询。将拿客户端的cookie信息进行sql查询,这样做的结果是造成欺骗漏洞,但是由于参与查询的cookie还包括密码,所以这种利用条件比较困难,必须在得到用户的密码(估计有人要骂我了,呵呵,能得到密码还COOKIE欺骗干嘛,不过这个密码是MD加密的,也就是可以省去破解这一步了(另外一个就是cookie注入了,貌似可以,但是我们进行测试之后都构造不出可行的攻击语句,有高手能搞定的话,请告知一下,先谢过了!)。思路再一次中断...
四.三顾讯时
正在一筹莫展的石斛,花花说找到了另外一个漏洞,漏洞文件在admin_news_view.asp,漏洞代码如下:
newsid=trim(request("newsid")) sql="select*fromnewswhereid="&newsid Setrs=Server.CreateObject("ADODB.RecordSet") rs.Opensql,conn,1,1
这个文件以admin开头,但是没有进行权限的判断等,用户可直接查看,而这里通过request获取从客户端传来的数据newsid的值,并用trim函数过滤之后存入变量newsid中。然后将此变量参与SQL查询。此过程,只用trim函数过滤了空格并没有做其他的限制,所以从这里可以看出来一个注入漏洞就产生了。
|