(一)空格绕过
- 原理
- Windows系统将文件名中的空格视为空,但程序检测代码无法自动删除空格,使攻击者可借此绕过黑名单限制。
- 基于黑名单验证的代码分析
- 代码未对上传文件的文件名进行去空格处理,存在安全隐患。
- 相关代码逻辑包括对文件上传的一系列判断,如检查文件路径是否存在,定义禁止上传的文件扩展名数组,获取文件名和后缀并进行处理,但缺少去空格步骤。
- Burpsuite绕过黑名单验证
- 使用Burpsuite截断HTTP请求,修改文件名并添加空格,从而绕过黑名单验证实现文件上传。
(二).号绕过
- 原理
- Windows系统会自动去除文件后缀名最后一个点,攻击者可利用此特性绕过黑名单。
- 基于黑名单验证代码分析
- 查看代码发现缺少去除文件名最后边点的处理。
- 代码逻辑与上述类似,在处理上传文件时,对文件名和后缀进行操作,但未考虑去除最后一个点的情况。
- Burpsuite绕过黑名单验证
- 利用Burpsuite截断HTTP请求,上传文件加.绕过上传限制。
(三)特殊符号绕过
- 原理
- 在Windows系统下,上传文件名中test.php::会在服务器上生成文件,且内容相同并被解析,而黑名单可能未对DATA进行过滤。
- 基于黑名单模糊测试
- 分析代码发现没有对::$DATA进行过滤,存在漏洞。
- 代码在处理上传文件时,对文件名进行了如去除末尾点、获取后缀并转换小写等操作,但未对::$DATA进行处理。
- Burpsuite绕过黑名单验证
- 利用Burpsuite截断HTTP请求,修改请求为1.php::$DATA进行上传。
(四)路径拼接绕过
- 原理
- 用户可自定义文件名,如1.php.+空格+.,经过deldot函数删除最后一个点(但后续处理不完善)和trim函数删除空格后变为1.php.,利用Windows自动去除最后一个点的特性成功上传。
- 上传后的文件没有经过随机化重命名直接保存在服务器上,这为攻击者提供了绕过机会。
- 基于黑名单验证代码分析
- 代码在处理上传文件时,对文件名进行了一些常规处理,如获取文件名、处理后缀等,但未进行随机化重命名。
- Burpsuite绕过黑名单验证
- 利用Burpsuite截断HTTP请求,在.php后面加(点 空格 点)来绕过黑名单验证。
(五)双写绕过
- 原理
- 代码编写过程中只对黑名单中的内容进行一次空替换,导致双写绕过。例如,1.phphpp可能会绕过对.php的限制。
- 基于黑名单代码分析
- 介绍了str_ireplace()函数的替换规则,该函数在处理黑名单替换时存在缺陷,只替换一次且替换为空。
- Burpsuite绕过黑名单验证
- 利用Burpsuite截断,直接将php文件后缀名修改为pphphp来绕过验证。
(六)00截断(白名单绕过)
- 原理
- 0x00是ascii码为0的字符,在一些函数处理时被当作结束符,系统读取文件名遇到0x00认为读取结束。
- PHP5.3之后版本修复了00截断问题,且该截断受限与magic_quotes_gpc和addslashes函数。
- GET型00截断
- GET型提交的内容会被自动进行URL解码,攻击者可利用00截断。
- 示例代码展示了如何通过构造URL实现00截断上传文件。
- POST型00截断
- 原理:POST请求中%00不会被自动解码,需要在16进制中进行修改00。
- 抓包及修改示例:给出了抓包过程中涉及的请求头和文件名等信息,以及修改POST请求包的具体操作,通过在16进制中修改相关内容来实现00截断。
三、安全影响
这些绕过方法被攻击者利用后,可能导致恶意文件(如webshell)上传到服务器,攻击者可借此获取服务器控制权,从而对服务器上的数据和系统安全造成严重威胁,包括数据泄露、篡改服务器设置、执行恶意命令等。