发新话题
打印

[转载]Dvbbs sp2上传漏洞再现 击溃动网sp2的神话

[转载]Dvbbs sp2上传漏洞再现 击溃动网sp2的神话

信息来源:TNT-B Security Team & Hoky

这篇是我们TNT-B小组贴在dvbbs上的一篇文章!
原文见http://www.dvbbs.net/TNT-B/DVBBS.TXT 可能现在已经删了!hoho

前段时间听说动网的上传再次出现了不可修复的错误,有人居然说是upload.inc有错,我仔细的读了N遍代码,可以肯定的说,upload.inc应该没有办法利用,今天无意中跑到动网的官方网站上去仔细的看了一下,个人资料修改里有上传,但是发帖里却没有上传,upload.asp和post_upload.asp同样用到了upload.inc,证明这个文件绝对没有问题,那问题一定出在post_upfile.asp上了,打开这个文件再次通读一遍!
一看
If upload_ViewType<>999 and F_Type=1 then
Dvbbs.execute("insert into dv_upFile (F_BoardID,F_UserID,F_Username,F_Filename,F_Viewname,F_FileType,F_Type,F_FileSize,F_Flag) values ("&Dvbbs.BoardID&","&Dvbbs.UserID&",&#39;"&Dvbbs.membername&"&#39;,&#39;"&replace(rename,"|","")&"&#39;,&#39;"&F_Viewname&"&#39;,&#39;"&replace(FileExt,".","")&"&#39;,"&F_Type&","&Filesize&",4)")
Else
Dvbbs.execute("insert into dv_upFile (F_BoardID,F_UserID,F_Username,F_Filename,F_FileType,F_Type,F_FileSize,F_Flag) values ("&Dvbbs.BoardID&","&Dvbbs.UserID&",&#39;"&Dvbbs.membername&"&#39;,&#39;"&replace(rename,"|","")&"&#39;,&#39;"&replace(FileExt,".","")&"&#39;,"&F_Type&","&Filesize&",4)")


有sql语句,难道传说中的上传再次利用是注入而不是上传,那我们就把他提交的变量每一个来通读一下
Dvbbs.BoardID,Dvbbs.UserID,Dvbbs.membername,F_Viewname,F_Type,Filesize这几个是肯定没有问题的,其它的几个我们就来看一下,这几个变量从哪来的,怎么得到的!

先说第一个replace(rename,"|","")把rename里的"|"这个符号去掉,我们看看rename的变量怎么来的,rename=createPath&Filename&"|"
是用createpath和filename连接起来再加上"|"生成的,"|"符号在后面被过滤了,可以不用考滤,再分别看看creatpath和filename
File_name = createName()
Filename = File_name&"."&FileExt(由file_name和fileExt联合起来的)
Private Function createName()
Dim ranNum
Randomize
ranNum=int(999*rnd)
createName=year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum
End Function


很明显,file_name是按年月日加随机数生成的,没有办法利用,疑点就在fileExt了。。。。。
难道,传说中的就要出现了,先不慌,我们先看看其它的地方
而creatpath又是这样来的
Private Function createPath()
Dim objFSO,Fsofolder,uploadpath
uploadpath=year(now)&"-"&month(now) &#39;以年月创建上传文件夹,格式:2003-8
On Error Resume Next
Set objFSO = Server.createObject("Scripting.FileSystemObject")
If objFSO.FolderExists(Server.MapPath(CheckFolder&uploadpath))=False Then
objFSO.createFolder Server.MapPath(CheckFolder&uploadpath)
End If
If Err.Number = 0 Then
createPath=uploadpath&"/"
Else
createPath=""
End If
Set objFSO = Nothing
End Function


creatpath又是用uploadpath加上fso按年月生成的,例如uploadfile/2004-11之类的,这样,又不能利用
好,这里发现一个疑点了

我们再看另一个变量replace(FileExt,".",""),直接就是前面提到的有疑点的那个fileExt了,呵呵,看准了,就是他了。我们把他的来龙去脉全找出来,看看能不能利用
Set File=upload.File(FormName) &#39;&#39;生成一个文件对象
FileExt=FixName(File.FileExt)
在这里,他开始出现了
file.fileExt这个不是我们提交的扩展名吗,玩过动网上传的都知道,抓个包,改个扩展名这是蛮正常的事,看来有门了,至少我们这个地方可以利用,====,FileExt=FixName(File.FileExt)他还用fixname来过滤了的,我们看看这个函数有什么用
Function FixName(UpFileExt)
If IsEmpty(UpFileExt) Then Exit Function
FixName = Lcase(UpFileExt)
FixName = Replace(FixName,Chr(0),"")
FixName = Replace(FixName,".","") 哈哈,把.替换成空了,为什么动网sp2的上传利用不了,就在这里的原因
FixName = Replace(FixName,"asp","")把asp替换成空
FixName = Replace(FixName,"asa","") asa过滤
FixName = Replace(FixName,"aspx","") aspx过滤
FixName = Replace(FixName,"cer","") cer过滤
FixName = Replace(FixName,"cdx","") cdx过滤
FixName = Replace(FixName,"htr","") htr过滤
End Function


哈哈,全部只是过滤了一些特殊的地方,但是我们如果拿来注入用到的引号,分号,逗号,--,一个都没有过滤,也就是说是通行无阻了,嘎嘎,接下来就是用到构造语句了,我们再来看他的sql语句
insert into dv_upFile (F_BoardID,F_UserID,F_Username,F_Filename,F_Viewname,F_FileType,F_Type,F_FileSize,F_Flag) values ("&Dvbbs.BoardID&","&Dvbbs.UserID&",&#39;"&Dvbbs.membername&"&#39;,&#39;"&replace(rename,"|","")&"&#39;,&#39;"&F_Viewname&"&#39;,&#39;"&replace(FileExt,".","")&"&#39;,"&F_Type&","&Filesize&",4)


在values后面
"&Dvbbs.BoardID&","&Dvbbs.UserID&",&#39;"&Dvbbs.membername&"
这些全部是正常的,我们改了fleExt后,rename也跟着变化了,所以实际上后面的&replace(FileExt,".","")&这里我们就可以不管了,只要构造前面的rename,再看看reanme是如何来的
rename=createPath&Filename&"|"
File_name = createName()
Filename = File_name&"."&FileExt


createpath是正常的一串值,可以不计,file_name也是正常的值可以不计,中间有一个.可以不计,后面的"|"他帮我们自己过滤了,可以不计.我们假设他的语句为
insert into dv_upFile (F_BoardID,F_UserID,F_Username,F_Filename,F_Viewname,F_FileType,F_Type,F_FileSize,F_Flag) values ("1","1",&#39;"user"&#39;,&#39;uploadfile/2004-11/2324128374912.jpg&#39;,&#39;user&#39;,&#39;jpg&#39;,"1","1000",4)


这是一条正常的语句,我们能利用的地方就是jpg,这个地方是我们包里可以传送过去的,是本地的文件扩展名,那我们就把jpg构造成具体的完整的sql语句。
比如jpg替换成
jpg&#39;,&#39;user&#39;,&#39;jpg&#39;,"1","1000",4);update dv_admin set userpasswrod=&#39;123&#39; where username=&#39;admin&#39;--jpg

(说一句,他的f_type是用来检测文件类型的,如果是1,也就是图片就执行的前一条sql语句,如果是其它就执行的后一条语句,具体的代码在这里
F_Type = CheckFiletype(FileExt)
checkfiletype函数的代码又是这样的
Private Function CheckFiletype(FileExt)
Dim upFiletype
Dim FilePic,FileVedio,FileSoft,FileFlash,FileMusic
FileExt=Lcase(Replace(FileExt,".",""))
select Case Lcase(FileExt)
Case "gif", "jpg", "jpeg","png","bmp","tif","iff"
CheckFiletype=1
Case "swf", "swi"
CheckFiletype=2
Case "mid", "wav", "mp3","rmi","cda"
CheckFiletype=3
Case "avi", "mpg", "mpeg","ra","ram","wov","asf"
CheckFiletype=4
Case Else
CheckFiletype=0
End select
End Function


这里也用到了fileExt这个变量,也就是我们的扩展名
去掉所有的".",然后再去取后的扩展名,所以我们的语句最后结束时要用考滤到这个,因为第一语句和第二语句构造方法不一样的!)
嘎嘎,dv_admin里的admin的userpassword就被改为123了.
如果是access版的好像有点难度,分号是不能多语执行的,又不是where条件,不能拿来猜测,而且values的值好像不能用select 来把其它的值填入,只有把整个select 的值拿来返回做为记录加入,没办法在values里单独取值,有没有人能有办法构造出这个完美的语法来,教教偶,偶sql水平不是蛮高,access版的暂时还没有想到完整的办法。
文章至些结束了,最的要说的就是所有的放入到sql语句里的参数都要严格检测,这个地方的补丁一个是在fixname()函数里过滤,如果不会的暂时就先关掉发帖上传的功能吧,等补丁!
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

关于dvsp2上传漏洞再现一文

文章作者:y1_shu

无语,这篇文章不晓得是被谁发出来的,这篇文章是假的,当时我看代码的时候少看了一个函数,这个地方的注入是通不过的,不要浪费时间了,不过这篇文章提出来了一个思路,用这个思路可以在另一个地方用同样的方法注入sql版的动网sp2,所以希望看了这篇文章的人别去试了,没希望的!
扩展名在过滤之后还会到数据库去轮询一次的,你构造的扩展名数据库里根本没有,所以不可能上传的,sql语句也不可能执行!但是另一个地方没有到数据库轮询,所以可以构造注入,这入篇文章是我刚开始测试的时候的笔记,真正的文章不是这一篇,他们在动网上帖出来是骗人的!希望看的人别说我误导别人,这篇文章我只给过三个人,结果不晓得怎么搞的被传出来的,对不起!
具体的在数据库轮询的函数在这里
引用:

&#39;判断文件类型是否合格
Private Function CheckFileExt(FileExt)
Dim Forumupload,i
CheckFileExt=False
If FileExt="" or IsEmpty(FileExt) Then
CheckFileExt=False
Exit Function
End If
If FileExt="asp" or FileExt="asa" or FileExt="aspx" Then
CheckFileExt=False
Exit Function
End If
Forumupload=Split(Dvbbs.Board_Setting(19),"|")
For i=0 To ubound(Forumupload)
If FileExt=Lcase(Trim(Forumupload(i))) Then
CheckFileExt=True
Exit Function
Else
CheckFileExt=False
End If
Next
End Function



看到
For i=0 To ubound(Forumupload)
If FileExt=Lcase(Trim(Forumupload(i))) Then
CheckFileExt=True
Exit Function
Else


这一段没有,到数据库轮询了的!所以这个地方是不可利用,大家没必要讨论了,真正能利用的地方是在另一个文件
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

发新话题