ASP/VBScript中CHR(0)的由来以及带来的安全问题分析

2019-01-16 00:16:13王旭


' 该函数仅供演示,请勿用于生产环境
Function GetFileExtensionName(filename)
Dim lastdotpos
lastdotpos = InstrRev(filename, ".")
GetFileExtensionName = Right(filename, Len(filename) - lastdotpos)
End Function

这个函数只用来演示,通过这个函数我们可以取到一个上传文件的扩展名,比如说sample.jpg,通过上面的函数获得jpg,如果恶意攻击者构造这么一个上传文件名sample.asp<null>.jpg,也就是"sample.asp" & CHR(0) & ".jpg",则上面的函数依旧获取扩展名为jpg,而ASP由于VBScript特性,会按照CHR(0)进行字符串截断,那么上传后文件名变成了sample.asp,这是相当危险的。通常的做法就是过滤掉CHR(0),比如下面的函数:


Function filterFileName(fileName)
filterFileName = Replace(fileName, vbNullChar, "")
End Function

不过如果出现这种情况,则说明用户可能在尝试利用上传漏洞攻击系统,所以我认为比较妥当的做法是发现包含CHR(0),则禁止文件上传,避免过滤后恶意文件依旧上传了,虽然恶意文件不起作用。查询了正则库RegExLib.com ,我找到了比较好的判断校验文件名的办法,接下来提供这个比较通用的正则匹配文件名是否合法的函数供大家参考:


Function IsAcceptableFileName(fileName)
Set objRegExp = New RegExp
objRegExp.IgnoreCase = True
objRegExp.Global = False
objRegExp.Pattern = _
"^(?!^(PRN|AUX|CLOCK$|CONFIG$|" & _
"NUL|CON|COMd|LPTd|..*)" & _
"(..+)?$)[^x00-x1f?*:"";|/]+$"
IsAcceptableFileName = objRegExp.Test(fileName)
Set objRegExp = Nothing
End Function

IsAcceptableFileName函数可以检测文件名是否包含一些非法的字符比如0x00~0x1F以及?*/这些禁止的路径字符,同时还能检测Windows下特殊的设备名,比如PRN、CON、NUL等,避免恶意设备名文件上传。

2011年12月20日更新

关于NULL字符上传漏洞攻击实现代码请参考《ASP上传漏洞之利用CHR(0)绕过扩展名检测脚本》

您可能感兴趣的文章:

ASP、vbscript编码模板ASP中一个用VBScript写的随机数类利用vbscript脚本修改文件内容,此适用于自动化的操作中asp,VBscript语法错误,史上最全最详细最精确vbscript脚本编程教程2利用fso来进行文件操作使用vbscript脚本在表单中进行选择的代码用vbscript脚本实现返回 IP 配置数据的代码ASP里面令人震撼地Debug类(VBScript)调试JavaScript/VBScript脚本程序(IE篇)JavaScript/VBScript脚本程序调试(Wscript篇)枚举域内计算机个数vbscript脚本(没环境,没测试)ASP(VBScript)中整除和取余ASP基础知识VBScript基本元素讲解ASP基础入门第四篇(脚本变量、函数、过程和条件语句)