文件读取漏洞的攻防

https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass
参考:
http://wp.blkstone.me/2018/06/abusing-arbitrary-file-read/
https://wsygoogol.github.io/2017/01/27/%E4%BB%BB%E6%84%8F%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E6%BC%8F%E6%B4%9E%E7%9A%84%E5%88%A9%E7%94%A8/

当前执行的命令:

/proc/self/cmdline  # 可能包含有用的路径信息

文件读取漏洞的攻防_第1张图片

获取枚举进程状态:

/proc/xxxx/cmdline # 进程状态枚举 xxxx 可以为0000-9999 使用burpsuite intruder

文件读取漏洞的攻防_第2张图片
文件读取漏洞的攻防_第3张图片

网络信息:

  • /proc/net/arp # arp表,可以获得内网其他机器的地址
  • /proc/net/tcp
    文件读取漏洞的攻防_第4张图片
/proc/self/environ

程序运行的环境变量信息
文件读取漏洞的攻防_第5张图片

再比如刚才通过burp intruder扫出来的各种路径,比如web日志,dnsmasq日志:
文件读取漏洞的攻防_第6张图片
可用于进一步搜集信息。

路径穿越的绕过

....//....//....//etc/passwd

?不知道为什么
文件读取漏洞的攻防_第7张图片

或者通过url encode
一次不行就两次:
文件读取漏洞的攻防_第8张图片
文件读取漏洞的攻防_第9张图片

通过00截断:

filename=../../../proc/self/cmdline%00.png

文件读取漏洞的攻防_第10张图片

路径穿越的防御

首先,应用应该避免让用户可控系统访问文件的API参数。
如果一定要用户指定,那只能通过过滤来避免漏洞了
一方面,如果可以是某些白名单就白名单,如果不行,则对用户可控的文件名只允许字母和数字;
另一方面,将用户提供的文件名与一个基本路径(通常是提供文件名拼接的上级路径)进行拼接,然后进行canonicalize(规范化),也就是进行路径穿越(执行完…/)之后再对这个值进行判断,是否以给定的base路径开头。

示例代码:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}

你可能感兴趣的:(java,安全)