因为自己的网站连续被人恶意侵入了两次,从IIS的日志看出都是“脚本注入”惹的祸,这才开始关注脚本安全起来。前几天朋友让我检测一下他网站的安全情况,于是就试试身手,结果居然发现了关于动力文章系统的安全漏洞。
发现漏洞
朋友使用的是动力文章系统3.51版,找来找去也没有发现有哪个地方存在“注入点”,以前发现的打印页面的注入漏洞也被补上了,因为打了最新的安全补丁,也就不存在上传扩展名为CER类的ASP木马的可能了。说实在的,我是很佩服Webboy的水平,同样是教师,我就没办法写出这样优秀的网站管理系统,呵呵。
找不到注入点,就只能去找找有没有逻辑错误了。无法上传文件就试着下载文件,无法获取管理权,就试试去删除文件。我在本机上安装了同样版本动力文章系统,思路换了好几个方向,还好,发现漏洞了。存在问题的文件是User_ArticleSave.asp。
1.分析:动力文章系统有个很好的功能,在线编辑文章时可以上传文件(图片),插入文件(图片),在保存文章时,系统将检测那些已经上传的文件是否使用,如果发现某一文件名并没有出现在文章内容中,也没有被设为首页图片,就自动删除文件。这样能够保证网站的Uploadfiles目录中不会存在垃圾文件。这些文件名就存放在Uploadfiles这个隐藏的对象中。
2.疑问:如果我们手工在Uploadfiles中填入网站内某一重要的文件名,如:首页文件“/Index.asp”(使用相对网站根目录的绝对路径),递交表单时,系统检测到“/Index.asp” 并没有出现在文章内容中,也没有被设为首页图片,岂不是也会自动删除Index.asp文件?
漏洞测试
马上在本机上进行测试,成功!接下来去下载3.6版本的动力系统(最新版本),同样成功!可以说这个漏洞存在目前动力的所有系统!因为动易系统时采用安装组件的方式,感到有点烦,就没有继续测试,理论上肯定也是成功的,有兴趣的朋友可以试试。
漏洞利用过程:
(1)把添加文章的页面保存在本地;
(2)修改页面中的表单递交地址,如将“document.myform.action='User_ArticleSave.asp'”中的“User_ArticleSave.asp”改为“http://127.0.0.1/User_ArticleSave.asp(“127.0.0.1”要改为测试网站的真实网址)“,并把“”中的“hidden”改为“text”。
(3)随便填写一些必要的文字,在出现的Uploadfiles对象中填入你要删除的文件的绝对路径,如“/index.asp”。
(4)递交表单。
这里有几点需要注意的:你必须要有一个可以发表文章的账户,一般使用动力文章系统的网站都开放用户注册的;并非只有这个文件存在漏洞,其它如上传资源之类的页面也存在同样漏洞。
防范措施
防护的措施有以下几种,大家可以选择适合自己的方式:
1.关闭“删除无用的上传文件”功能,把User_ArticleSave.asp文件中的相应语句删除或用“’”注释,这样有点消极。
2.有些人首先想到的解决方法可能会是“禁止站外递交“。动力系统的管理员管理页面是有这样功能的,可以把这样的功能加在用户管理页面中,相关分析《黑客防线》前几期已经讲得很清楚了,不再重复。表面上看这种方式可以防止漏洞,其实这种解决方法不是很彻底,我至少有两种方法来重新利用这个漏洞,如捕获、修改、重新发送数据包。
3.等待Webboy的补丁,我这里先写一段代码让大家先凑合着用:
'删除无用的上传文件
if ObjInstalled=True and Uploadfiles<>"" then
dim fso,strRubbishFile
Set fso = Server.CreateObject("Scripting.FileSystemObject")
if instr(Uploadfiles,"|")>1 then
dim arrUploadfiles,intTemp
arrUploadfiles=split(Uploadfiles,"|")
Uploadfiles=""
for intTemp=0 to ubound(arrUploadfiles)
if instr(Content,arrUploadfiles(intTemp))<=0 and arrUploadfiles(intTemp)<>DefaultPicUrl then
if ucase(left(arrUploadfiles(intTemp),len(SaveUpFilesPath)))<>ucase(SaveUpFilesPath) or instr(arrUploadfiles(intTemp),"../")>0 then
response.write "
Uploadfiles=""
else
strRubbishFile=server.MapPath(arrUploadfiles(intTemp))
if fso.FileExists(strRubbishFile) then
fso.DeleteFile(strRubbishFile)
response.write "
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



