chr(0)文件上传漏洞原理

[ 2009-09-26 17:30:36 | 作者: admin ]
字号: | |
p.s. 该上传漏洞相当普遍,解决也很简单,程序提取上传的文件后缀,加以白名单判断(勿使用黑名单),然后系统自动生成 随机文件名+后缀 即可解决。

我们在用 ASP 开发文件上传功能的时候,为了防止用户上传木马程序,常常会限制一些文件的上传,常用的方法是判断一下上传文件的扩展名是否符合规定,可以用 right 字符串函数取出上传文件的文件名的后四位,这样很容易就能判断了,但是这里面有一个漏洞,非常危险,就是 chr(0) 漏洞,详情请接着往下看。

一、首先解释下什么是 chr(0)?

在 ASP 中可以用 chr() 函数调用 ASCII 码,其中 chr(0) 表示调用的是一个结束字符,简单的说当一个字符串中包含 chr(0) 字符时,只能输出 chr(0) 前面的字符,chr(0) 后面的字符将不被输出。举例如说明:

<%response.write "HTMer.com"&chr(0)&" 欢迎您 "%> 以上代码你在 IIS 下运行下看看,是不是只会输出“HTMer.com”呢?后面的“欢迎您”就没有了,因为读到 chr(0) 时就认为该语句结束了。

二、chr(0) 漏洞上传原理:

假设我在 ASP 程序中已经设置只能上传 jpg 文件,这里看我怎么利用 chr(0) 漏洞上传 ASP 木马的:

这里假设有一个 ASP 木马文件为 htmer.asp,我把它改名为 htmer.asp .jpg,大家有没有看到中间有一个空格?我们在获取该文件名时,这个空格就被认为是 chr(0),当用 right("htmer.asp .jpg",4) 看的时候,确实是 .jpg,但是当实际读取 htmer.asp .jpg,并生成文件的时候,系统读到 chr(0) 就以为结束了,所以后面的 .jpg 就输出不来了,上传后的文件名被自动生成了 htmer.asp,这意味着什么?我想你应该知道了吧。(由于显示的原因,文中“.jpg”前面的空格实际上代表 chr(0)。千一网络编辑注)

三、解决 chr(0) 漏洞的方法

解决办法是检查上传的文件名里面有没有 chr(0),在 ASP 中直接用 replace 函数替换掉 chr(0) 字符即可。

(chr(0) 漏洞是在完全按客户端的文件名来保存时才存在,如果文件标识符是系统决定的,而文件扩展名由客户端文件名来提取,则不会出现安全问题。实际上,我们应用中不可能完全按照客户端文件名来保存,因为这本身就是一种漏洞,因为这样客户端就可以上传文件来覆盖已经存在的文件了。)
[最后修改由 admin, 于 2010-05-03 09:02:12]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=1294

这篇日志没有评论。

此日志不可发表评论。