上传漏洞-ASP 中 chr(0) 文件上传漏洞原理及解决方法

作者: 来源:HTMer 日期:2009-10-18

我们在用 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)。ITPOW编辑注)

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

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

(chr(0) 漏洞是在完全按客户端的文件名来保存时才存在,如果文件标识符是系统决定的,而文件扩展名由客户端文件名来提取,则不会出现安全问题。实际上,我们应用中不可能完全按照客户端文件名来保存,因为这本身就是一种漏洞,因为这样客户端就可以上传文件来覆盖已经存在的文件了。ITPOW编辑注)

相关文章