第八题 特殊字符绕过
可以看到前面几道题的绕过方式在本道题已经都进行了防护,那么是不是就么有渠道了?
在Windows操作系统中,::$DATA
是一个特殊的标记,用于NTFS文件系统的文件流(Alternate Data Streams,ADS)。这个概念首次出现在NTFS文件系统中,允许在一个文件上附加额外的数据流,这些数据流可以包含任意数据,并且通常用于存储与文件相关的元数据。
使用场景
- 存储元数据:应用程序可以使用文件流来存储与主文件相关的额外信息,比如配置数据或附加的资源。
- 隐藏数据:由于文件流在标准的文件浏览器中不可见,它们可以被用来隐藏数据或恶意代码。
- 应用程序数据隔离:不同的应用程序可以为同一个文件创建不同的数据流,以隔离它们的数据。
示例
假设你有一个名为 example.txt
的文件,你可以使用以下命令在Windows命令行中为这个文件添加一个名为 stream1
的数据流,并写入一些数据:
cmd
echo Hello, World! > example.txt:stream1
这个命令会在 example.txt
文件上创建一个名为 stream1
的数据流,并写入 "Hello, World!"。你可以通过以下命令读取这个数据流的内容:
cmd
type example.txt:stream1
安全考虑
由于文件流可以被用来隐藏数据,它们也被用于恶意软件的隐藏和数据泄露。例如,攻击者可能会在合法文件上附加恶意代码,并利用文件流来绕过安全检查。
注意事项
- 在Linux或macOS系统中,文件流不被支持,因此
::$DATA
标记不会有任何效果。 - 在处理文件上传时,如果服务器运行在Windows上,需要特别注意检查和过滤文件名中的
::$DATA
标记,以防止潜在的安全风险。
在Web应用的安全测试中,了解和识别这种文件流的使用是非常重要的,以确保应用的安全性。
利用上面的知识,我们可以想办法绕过防护上传文件
第九题 混合绕过
在某些情况下,尤其是当应用程序只进行一次过滤时,可以利用这一点来绕过文件上传的限制。
绕过思路
- 文件名构造:通过在文件名中添加额外的点和空格,例如
shell.php. .
,可以利用一次性过滤的特性。 - 过滤逻辑:
- 由于代码只执行一次过滤,
trim()
和deldot()
只会处理一次,导致最终的文件名可能仍然包含有效的扩展名。 - 例如,
shell.php. .
在经过过滤后,可能会变成shell.php
,而不是被完全删除。
- 由于代码只执行一次过滤,
示例步骤
- 构造文件名:将文件命名为
shell.php. .
。 - 上传文件:将这个文件上传到目标应用。
- 验证结果:如果上传成功,检查文件是否可以执行。
注意事项
- 确保在上传时,文件名的格式符合服务器的要求。
- 这种绕过方法依赖于服务器的过滤实现,因此在不同的应用中可能会有所不同。
- 进行安全测试时,务必遵循法律法规和道德规范。
这种利用一次性过滤的绕过方法在安全测试中非常常见,了解这些细节可以帮助你更有效地识别和利用潜在的安全漏洞。
通过上述知识点,我们可以利用这一点就行绕过
第十题 双写绕过
若上传的文件后缀在禁止的列中,那么就将后缀替换为空,不过仅仅过滤一次,我们采用双写绕过防护。
第十一题 白名单 00截断绕过
00截断是一种常见的文件上传绕过技术,它利用了某些服务器在解析文件名时对空字符(NULL,即ASCII码为0的字符)的处理不当。在PHP版本小于5.3.4且magic_quotes_gpc
配置关闭的情况下,可以通过在文件名中插入%00
(URL编码的空字符)来截断文件名,使得服务器只解析%00
之前的部分,从而绕过文件类型的限制。
例如,如果服务器只允许上传图片文件,攻击者可以通过上传名为shell.php%00.jpg
的文件来绕过限制。服务器在解析文件名时会在%00
处停止,因此只将shell.php
部分视为文件名,而忽略了后面的.jpg
,导致攻击者能够上传并执行PHP脚本。
00截断的关键在于它利用了服务器在处理文件名时的漏洞。在文件名中插入%00
后,服务器会将%00
后面的所有内容视为文件的一部分,而不是文件名的一部分,从而绕过了对文件扩展名的检查。
在使用00截断时,需要注意以下几点:
- 服务器的PHP版本需要低于5.3.4。
magic_quotes_gpc
配置需要关闭。- 00截断通常用于GET请求的URL参数中,因为GET请求的参数会被自动URL解码。而在POST请求中,需要手动将
%00
进行URL解码或在Hex中修改为00,因为POST请求的内容不会自动进行URL解码。
在实际应用中,00截断可以用于绕过文件上传的白名单限制,但这种技术的使用是非法的,并且违反了道德和法律规定。因此,了解这种技术的目的应该是为了更好地保护系统安全,而不是用于进行非法攻击。在进行安全测试和审计时,了解和识别这种漏洞是非常重要的,以确保应用程序的安全性。
在PHP 5.3.4之前的版本中,如果magic_quotes_gpc
配置项被关闭,那么在处理文件名或路径时,遇到URL编码的%00
(代表空字符),PHP会将其解释为字符串的结束符。这意味着如果在文件名中包含%00
,那么在字符串处理时,%00
之后的内容会被截断,只保留%00
之前的内容。
例如,如果攻击者上传了一个名为shell.php%00.jpg
的文件,服务器在处理这个文件名时,会忽略%00
后面的.jpg
,因此文件实际上会被保存为shell.php
,而不是shell.php.jpg
。如果服务器的文件上传处理逻辑不严格,这可能会导致攻击者上传并执行恶意PHP脚本,从而产生安全风险。
这种截断技术利用了C语言中的字符串处理特性,因为在C语言中,\0
(空字符)通常被用作字符串的结束符。由于PHP在底层使用了C语言,所以继承了这一特性。在文件名中插入空字符(通过%00
实现)会导致字符串在该位置被截断。
需要注意的是,这种截断技术仅在特定条件下有效,即PHP版本必须低于5.3.4,且magic_quotes_gpc
必须为OFF状态。此外,这种技术通常只能在前端绕过中使用,而后端绕过则需要更复杂的条件或技术。
在现代的PHP环境中,这种截断技术已经不再有效,因为PHP已经修复了相关的漏洞,并且magic_quotes_gpc
配置项在PHP 5.4.0中被移除,并在PHP 7.4.0中彻底废弃。因此,为了确保Web应用的安全性,开发者应该确保使用最新版本的PHP,并采取适当的安全措施来防止文件上传漏洞。