Windows下的"你画我猜" -- 告别效率低下的目录扫描方法
字数 1212 2025-08-29 08:32:10

Windows环境下的高效目录扫描技术详解

0x01 前言

在Web应用安全测试中,目录和文件结构的探测是基础且关键的环节。传统Linux环境下通常只能依赖指纹识别或暴力枚举,效率低下。而在Windows环境下,利用系统特有机制可以实现更高效的目录扫描方法。

0x02 Windows API与通配符特性

Windows API函数FindFirstFileExW()FindFirstFile()对特殊字符有特殊处理:

  • > 等价于通配符?(匹配0或1个字符)
  • < 等价于通配符*(匹配0或多个字符)
  • " 等价于通配符.(匹配单个字符,除换行符外)

受影响PHP函数

include(), include_once(), require(), require_once()
fopen(), copy(), file_get_contents(), readfile()
file_put_contents(), mkdir(), opendir(), readdir()
move_uploaded_file(), getimagesize()

注意:这是Windows API层面的特性,任何调用这些API的语言都可能存在此问题,PHP只是其中之一。

0x03 IIS短文件名机制

Windows为兼容MS-DOS,为长文件名创建8.3格式的短文件名:

  1. 文件名显示前6字符,后接~1(同名文件数字递增)
  2. 扩展名显示前3字符

查看方法

cmd > dir /x

0x04 Windows + IIS 6 + .NET环境探测

适用条件

  1. 文件名>8字符或扩展名>3字符
  2. Windows + IIS + .NET环境
  3. 只能获取文件名前6位和扩展名前3位

探测方法

  1. 文件名猜测

    http://target/a*~1****/xxx.aspx   # 404表示存在
    http://target/aa*~1****/xxx.aspx  # 400表示不存在
    
  2. 判断文件/目录

    http://target/abc775*~1/xxx.aspx  # 404表示目录
    
  3. 扩展名猜测

    http://target/abc775*~1*a**/xxx.aspx
    http://target/abc775*~1*as*/xxx.aspx
    http://target/abc775*~1*asp/xxx.aspx
    

0x05 Windows + IIS 7.x + .NET环境探测

关键差异

默认情况下GET请求无论是否存在都返回404,需使用OPTIONS方法:

  • 存在:返回404
  • 不存在:返回200

开启详细错误后

  • 存在:错误代码0x00000000
  • 不存在:错误代码0x80070002

0x06 Windows + Apache + PHP环境探测

特性1:利用PHP函数逐位猜测

示例代码:

<?php
$filename = $_GET['filename'];
$file = "./abcdefg1234567aaabb/" . $filename;
var_dump(getimagesize($file));
?>

目录猜测

http://target/1.php?filename=../a</01.png    # 正常表示存在
http://target/1.php?filename=../aa</01.png   # 错误表示不存在

文件猜测

http://target/1.php?filename=../path/w<.php
http://target/1.php?filename=../path/wo<.php

特性2:直接使用短文件名访问

http://target/abcdef~1/woaini~1.php
http://target/uploads/abcdef~1.zip

0x07 Windows + IIS + PHP环境探测

组合特性

  1. 使用OPTIONS方法猜测短文件名
  2. 利用PHP函数猜测完整路径
  3. 使用通配符直接访问文件

示例

http://target/1.php?filename=../abcdefg1234567aaabbb/<.php
http://target/abcdefg1234567aaabbb/w<.php

0x08 Windows + Nginx + PHP环境探测

特性差异

  1. 可直接用短文件名访问目录和文件
  2. 可用通配符访问文件(不能访问目录)
  3. 保留PHP函数特性

示例

http://target/abcdef~1/xxxaaa~1.php
http://target/abcdef~1/x<.php

0x09 技术原理总结

这些技术本质上是Windows三个特性的组合应用:

  1. Windows API对特殊字符的处理
  2. 8.3短文件名机制
  3. 不同Web服务器和语言对这些特性的实现差异

0x10 防御建议

  1. 禁用短文件名生成(修改注册表)
  2. 对用户输入进行严格过滤
  3. 避免将敏感函数与用户输入直接关联
  4. 关闭不必要的详细错误信息

参考资源

  1. Microsoft IIS Tilde Character Vulnerability/Feature
  2. HITB Quals 2018 CTF Writeup
Windows环境下的高效目录扫描技术详解 0x01 前言 在Web应用安全测试中,目录和文件结构的探测是基础且关键的环节。传统Linux环境下通常只能依赖指纹识别或暴力枚举,效率低下。而在Windows环境下,利用系统特有机制可以实现更高效的目录扫描方法。 0x02 Windows API与通配符特性 Windows API函数 FindFirstFileExW() 和 FindFirstFile() 对特殊字符有特殊处理: > 等价于通配符 ? (匹配0或1个字符) < 等价于通配符 * (匹配0或多个字符) " 等价于通配符 . (匹配单个字符,除换行符外) 受影响PHP函数 : 注意:这是Windows API层面的特性,任何调用这些API的语言都可能存在此问题,PHP只是其中之一。 0x03 IIS短文件名机制 Windows为兼容MS-DOS,为长文件名创建8.3格式的短文件名: 文件名显示前6字符,后接 ~1 (同名文件数字递增) 扩展名显示前3字符 查看方法 : 0x04 Windows + IIS 6 + .NET环境探测 适用条件 文件名>8字符或扩展名>3字符 Windows + IIS + .NET环境 只能获取文件名前6位和扩展名前3位 探测方法 文件名猜测 : 判断文件/目录 : 扩展名猜测 : 0x05 Windows + IIS 7.x + .NET环境探测 关键差异 默认情况下GET请求无论是否存在都返回404,需使用OPTIONS方法: 存在:返回404 不存在:返回200 开启详细错误后 : 存在:错误代码 0x00000000 不存在:错误代码 0x80070002 0x06 Windows + Apache + PHP环境探测 特性1:利用PHP函数逐位猜测 示例代码: 目录猜测 : 文件猜测 : 特性2:直接使用短文件名访问 0x07 Windows + IIS + PHP环境探测 组合特性 使用OPTIONS方法猜测短文件名 利用PHP函数猜测完整路径 使用通配符直接访问文件 示例 : 0x08 Windows + Nginx + PHP环境探测 特性差异 可直接用短文件名访问目录和文件 可用通配符访问文件(不能访问目录) 保留PHP函数特性 示例 : 0x09 技术原理总结 这些技术本质上是Windows三个特性的组合应用: Windows API对特殊字符的处理 8.3短文件名机制 不同Web服务器和语言对这些特性的实现差异 0x10 防御建议 禁用短文件名生成(修改注册表) 对用户输入进行严格过滤 避免将敏感函数与用户输入直接关联 关闭不必要的详细错误信息 参考资源 Microsoft IIS Tilde Character Vulnerability/Feature HITB Quals 2018 CTF Writeup