文件读取漏洞的攻防

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  # 可能包含有用的路径信息

在这里插入图片描述

获取枚举进程状态:

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

在这里插入图片描述
在这里插入图片描述

网络信息:

  • /proc/net/arp # arp表,可以获得内网其他机器的地址
  • /proc/net/tcp
    在这里插入图片描述
/proc/self/environ

程序运行的环境变量信息
在这里插入图片描述

再比如刚才通过burp intruder扫出来的各种路径,比如web日志,dnsmasq日志:
在这里插入图片描述
可用于进一步搜集信息。

路径穿越的绕过

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

?不知道为什么
在这里插入图片描述

或者通过url encode
一次不行就两次:
在这里插入图片描述
在这里插入图片描述

通过00截断:

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

在这里插入图片描述

路径穿越的防御

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

示例代码:

File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
    // process file
}
发布了601 篇原创文章 · 获赞 101 · 访问量 100万+

猜你喜欢

转载自blog.csdn.net/caiqiiqi/article/details/103775900