菜头粿
标题:
动力文章系统又一个安全漏洞
[打印本页]
作者:
glcui
时间:
2009-8-29 12:15
标题:
动力文章系统又一个安全漏洞(凤城社区)
动力文章系统又一个安全漏洞
以下内容含脚本,或可能导致页面不正常的代码
[B]以下是俺的一个朋友(也是教育线的朋友)原创的文章,已经发表![/B]
[center]动力文章系统又一个安全漏洞
——网站文件可被任意删除[/center]
[center]作者:谢作如[/center]
因为自己的网站连续被人恶意侵入了两次,从IIS的日志看出都是“脚本注入”惹的祸,这才开始关注网站的脚本安全来。学了几期的《黑客防线》,感觉大有进步。恰好前几天朋友让我检测一下他网站的安全情况,于是就试试身手,结果居然发现了关于动力文章系统的一个惊人的安全漏洞。
[B]发现漏洞:[/B]
朋友使用的是动力文章系统3.51版,找来找去也没有发现有哪个地方存在“注入点”,以前发现的打印页面存在的注入漏洞被补上了,因为打了最新的安全补丁,也就不存在上传扩展名为cer类的asp木马的可能了。说实在的,我是很佩服webboy的水平,同样是教师,我就没办法写出这样优秀的网站管理系统,呵呵。
找不到注入点,就只能去找找有没有逻辑错误。无法上传文件就试着下载文件,无法获取管理权,就试试去删除文件。我在本机上安装了同样版本动力文章系统,思路换了好几个方向,还好,发现漏洞了:
存在问题的文件:User_ArticleSave.asp
分析:动力文章系统有个很好的功能,在线编辑文章时可以上传文件(图片),插入文件(图片),在保存文章时,系统将检测那些已经上传的文件是否使用,如果发现某一文件名并没有出现在文章内容中,也没有被设为首页图片,就自动删除文件。这样能够保证网站的uploadfiles目录中不会存在垃圾文件。这些文件名就存放在uploadfiles这个隐藏的对象中。
疑问:如果我们手工在uploadfiles中填入网站中某一重要文件名,如:首页文件“/Index.asp”(使用相对网站根目录的绝对路径),递交表单时,系统检测到“/Index.asp” 并没有出现在文章内容中,也没有被设为首页图片,岂不是也会自动删除Index.asp文件?
[B]漏洞测试:[/B]
马上在本机上进行测试,成功!接下来去下载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”要改为测试网站的真实网址),并把<input name="UploadFiles" type="hidden" id="UploadFiles">中的“hidden”改为“text”。
(3)、随便填写一些必要的文字,在出现的UploadFiles对象中填入你要删除的文件的绝对路径,如“/index.asp”。
(4)、递交表单。
[B]其他说明:[/B]
(1)、你必须要有一个可以发表文章的帐户。一般使用动力文章系统的网站都开放用户注册的。
(2)、并非只有这个文件存在漏洞,其他如上传资源之类的页面也存在同样漏洞。
[B]防范措施:[/B]
(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 "
<li>" & arrUploadFiles(intTemp) & "包含非法字符,已被清除!</li>"
UploadFiles=""
else
strRubbishFile=server.MapPath(arrUploadFiles(intTemp))
if fso.FileExists(strRubbishFile) then
fso.DeleteFile(strRubbishFile)
response.write "
<li>" & arrUploadFiles(intTemp) & "在文章中没有用到,也没有被设为首页图片,所以已经被删除!</li>"
end if
end if
else
if intTemp=0 then
UploadFiles=arrUploadFiles(intTemp)
else
UploadFiles=UploadFiles & "|" & arrUploadFiles(intTemp)
end if
end if
next
else
if instr(Content,UploadFiles)<=0 and UploadFiles<>DefaultPicUrl then
if ucase(left(UploadFiles,len(SaveUpFilesPath)))<>ucase(SaveUpFilesPath) or instr(UploadFiles,"../")>0 then
response.write "
<li>" & UploadFiles & "包含非法字符,已被清除!</li>"
UploadFiles=""
else
strRubbishFile=server.MapPath(UploadFiles)
if fso.FileExists(strRubbishFile) then
fso.DeleteFile(strRubbishFile)
response.write "
<li>" & UploadFiles & "在文章中没有用到,也没有被设为首页图片,所以已经被删除!</li>"
end if
UploadFiles=""
end if
end if
set fso=nothing
end If
'结束
(4)、其实以上的方法都不能从根本上解决这个漏洞,最好的方式就是换一种方式编程来实现“删除没有用到的文件”这一功能,比如采用session来记录上传文件名等等。
[B]结语[/B]
目前动力文章系统是使用范围最广的免费代码之一,并且有好多系统模仿了动力系统的这一功能(比如我,呵呵)。利用该漏洞是十分狠毒的,真正的损人不利己,因为被这样删除的文件可不是能在“回收站”中找回来的!请大家本着黑客的宗旨“不要破坏他人系统”,不要在他人的网站上尝试,本机装个动力系统玩玩就行了。我公开这个漏洞的目的只是希望每个程序员在编写脚本的时候能够多想想安全,不要出现类似的问题。
[em38]
说明:上面显示的是代码内容。您可以先检查过代码没问题,或修改之后再运行.
欢迎光临 菜头粿 (https://cn.521000.cn/)
Powered by Discuz! X3