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]
好了,到这里结束了
由于以前在一个论坛发过了,这次是直接复制的,而图片论坛程序加了他们的网址,所以我把图片的字涂了
liu40107557 2008-6-28 00:14
好东西。顶起走。
hanyue03 2008-7-15 00:12
:face7 :face7 :face7 顶了在看