作者:月无痕&&花非花 来源:红狼安全小组(www.wolfexp.net,www.crst.com.cn) 注:本文以发表于黑客手册,转载请加上出处 三顾讯时--对讯时新闻发布系统的艰难突破
月无痕&&花非花
一.接触起因
这几天事情较多,一直都没去老大的论坛转!今天好友joli突然Q我说论坛上有人发了个脚本的问题,叫我也一起看一下,于是我就跑过去看了下(你家离论坛很近?竟然可以跑着过去!),也就有了下面这篇文章(测试版本为讯时新闻发布系统v2.70版 )。
二.漏洞初探
打算先看有没有经典的OR漏洞,虽然已经出来很久的漏洞了,但是很多程序仍然会存在这样的漏洞,admin_login.asp存在如下代码: if request("user")="" or request("pass")=""then conn.close set conn=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 * from admin where [user]=’"&user&"’ and [pass]=’"&pass&"’" Set rs = Server.CreateObject("ADODB.RecordSet") rs.Open sql,conn,1,1
好!上面关键的地方我都进行了一下注释,最关键的地方就是chkhtm函数,他是做什么的?我在titleb.asp中找到了他的定义! function chkhtm(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 end function
很明显的一个过滤函数,在函数的第四行,已经过滤掉了“’”号了,所以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.if adminuser="" or adminpass="" then 8. Response.Redirect "login.asp?id=8" 9.end if
...省略部分代码...
10.user=trim(session("admin__user")) 11.pass=session("admin__pass")
12.sql = "select * from admin where [user]=’"&adminuser&"’ and [pass]=’"&adminpass&"’" 13.Set rs = Server.CreateObject("ADODB.RecordSet") 14.rs.Open sql,conn,1,1 15.if rs.recordcount=0 then 16. Response.Redirect "login.asp?id=8" 17.end if ...再省略... %>
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 * from news where id="&newsid Set rs = Server.CreateObject("ADODB.RecordSet") rs.Open sql,conn,1,1 这个文件以admin开头,但是没有进行权限的判断等,用户可直接查看,而这里通过request获取从客户端传来的数据newsid的值,并用trim函数过滤之后存入变量newsid中。然后将此变量参与SQL查询。此过程,只用trim函数过滤了空格并没有做其他的限制,所以从这里可以看出来一个注入漏洞就产生了。
用order by函数判断参与SQL查询的字段为26个,提交 http://222.90.4.20/news/admin_ne ... 0union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26%20from%20admin ,返回错误,如图1所示:

1 2 3 4 5 6 下一页
·上一篇: 整个服务器群的沦陷:一次曲折的安全检测
·下一篇: 135批量抓肉鸡 批量开TELNET
|