/proc/self/cmdline # 可能包含有用的路径信息
/proc/xxxx/cmdline # 进程状态枚举 xxxx 可以为0000-9999 使用burpsuite intruder
....//....//....//etc/passwd
filename=../../../proc/self/cmdline%00.png
首先,应用应该避免让用户可控系统访问文件的API参数。
如果一定要用户指定,那只能通过过滤来避免漏洞了
一方面,如果可以是某些白名单就白名单,如果不行,则对用户可控的文件名只允许字母和数字;
另一方面,将用户提供的文件名与一个基本路径(通常是提供文件名拼接的上级路径)进行拼接,然后进行canonicalize(规范化),也就是进行路径穿越(执行完…/)之后再对这个值进行判断,是否以给定的base路径开头。
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}