asp中null字符截断

在asp中,字符串中是允许存在null字符的,但是许多asp的文件上传系统中,当文件名中含有null字符时,会导致null字符后面的数据被忽略。简单的说,如果有一个asp的文件操作函数create_file(),传递参数a.jpg,那么会产生一个a.jpg的文件。

可是,如果传递一个带有null字符的参数呢?看下面的例子:

asp中null字符截断

这样,因为null字符后面的数据都被丢弃,调用函数时,则会产生一个nc.exe文件。


web服务器在处理上传的文件时,通常都会对文件的格式做限制,最简单的方法就是对文件后缀名做判断,但是这种简单的校验方式,利用null就可以很容易的绕过。如上传一个nc.exe文件时,通过代理软件抓包,手动把文件名改为上面图片中的格式,那么asp获取到的文件后缀名为.BMP,但是真正传递给文件操作对象后,很有可能最后产生了一个nc.exe文件。如下图:

asp中null字符截断

null字符截断问题,通常出现于asp上传文件的功能中,而且据说只适用于multipart/form-data方式(这个未经验证过)。get和post方式提交变量时,如果变量名中含有%00或null,那么这个变量会被自动截断,即最终获取到的变量value是null之前的部分。所以想利用这个特性来处理get和post的变量也是不太可能的。另外,目前自己亲测过的,ActiveXObject("Scripting.FileSystemObject")对象在操作文件时,null后面的字符会被忽略,也就是可以利用这个漏洞。如果使用CreateObject("Persits.Upload")这个对象,那么在保存文件时,会产生错误,改漏洞不能在这个对象上被利用。


个人针对这个问题,比较通俗的但是不一定正确的理解是,操作系统的文件名中,就是以null结尾的,所以在创建文件的时候,操作系统的文件系统会自动将null后面的数据丢掉。


全文主要参考了这篇文章:http://www.security-assessment.com/files/documents/whitepapers/0x00%20vs%20ASP%20file%20upload%20scripts.pdf