CTFer成长之路-Web⼊门之任意⽂件读取漏洞
任意⽂件读取漏洞
所谓⽂件读取漏洞,就是攻击者通过⼀些⼿段可以读取服务器上开发者不允许读到的⽂件。
从整个攻击过程来看,它常常作为资产信息搜集的⼀种强⼒的补充⼿段,服务器的各种配置⽂件、⽂件形式存储的密钥、服务器信息(包括正在执⾏的进程信息)、历史命令、⽹络信息、应⽤源码及⼆进制程序都在这个漏洞触发点被攻击者窥探。
qq蓝钻有什么用⽂件读取漏洞常见触发点
Web语⾔
蛇夫座PHP
官方:实施渐进式延迟法定退休年龄PHP标准函数中有关⽂件读的部分不再详细介绍,这些函数包括但可能不限于:file_get_contents()、file()、fopen()函数(及其⽂件指针操作函数fread()、fgets()等),与⽂件包含相关的函数(include()、require()、include_once()、require_once()等),以及通过PHP读⽂件的执⾏系统命令(system()、exec()等)。这些函数在PHP应⽤中⼗分常见,所以在整个PHP代码审计的过程中,这些函数会被审计
⼈员重点关注。除了上⾯提到的标准库函数,很多常见的PHP扩展也提供了⼀些可以读取⽂件的函数。例如,php-curl扩展(⽂件内容作为HTTP body)涉及⽂件存取的库(如数据库相关扩展、图⽚相关扩展)、XML模块造成的XXE等。
Python
与PHP不同的是,Python的Web应⽤更多地倾向于通过其⾃⾝的模块启动服务,同时搭配中间件、代理服务将整个Web应⽤呈现给⽤户。⽤户和Web应⽤交互的过程本⾝就包含对服务器资源⽂件的请求,所以容易出现⾮预期读取⽂件的情况。因此,我们看到的层出不穷的Python某框架任意⽂件读取漏洞也是因为缺乏统⼀的资源⽂件交互的标准。漏洞经常出现在框架请求静态资源⽂件部分,也就是最后读取⽂件内容的open函数,但直接导致漏洞的成因往往是框架开发者忽略了Python函数的feature,如os.path.join()函数。
很多开发者通过判断⽤户传⼊的路径不包含“.”来保证⽤户在读取资源时不会发⽣⽬录穿越,随后将⽤户的输⼊代⼊os.path.join的第⼆个参数,但是如果⽤户传⼊“/”,则依然可以穿越到根⽬录,进⽽导致任意⽂件读取。这是⼀个值得我们注意并深思的地⽅。除了python框架容易出这种问题,很多涉及⽂件操作的应⽤也很有可能因为滥⽤open函数、模板的不当渲染导致任意⽂件读取。⽐如,将⽤户输⼊的某些数据作为⽂件名的⼀部分(常见于认证服务或者⽇志服务)存储在服务器中,在取⽂件内容的
部分也通过将经过处理的⽤户输⼊数据作为索引去查相关⽂件,这就给了攻击者⼀个进⾏⽬录穿越的途径。与PHP相同,Python的⼀些模块可能存在XXE读⽂件的情况。此外,Python的模板注⼊、反序列化等漏洞都可造成⼀定程度的任意⽂件读取,当然,其最⼤危害仍然是导致任意命令执⾏。
Java
除了Java本⾝的⽂件读取函数FileInputStream、XXE导致的⽂件读取,Java的⼀些模块也⽀持“file://”协议,这是Java应⽤中出现任意⽂件读取最多的地⽅,如Spring Cloud Config Server路径穿越与任意⽂件读取漏洞(CVE-2019-3799)、Jenkins任意⽂件读取漏洞(CVE-2018-1999002)等。
Ruby
在CTF线上⽐赛中,Ruby的任意⽂件读取漏洞通常与Rails框架相关。到⽬前为⽌,我们已知的通⽤漏洞为Ruby On Rails远程代码执⾏漏洞(CVE-2016-0752)、Ruby On Rails路径穿越与任意⽂件读取漏洞(CVE-2018-3760)、Ruby On Rails路径穿越与任意⽂件读取漏洞(CVE-2019-5418)。
Node
⽬前,已知Node.js的express模块曾存在任意⽂件读取漏洞(CVE-2017-14849)。CTF中Node的⽂件读取漏洞通常为模板注⼊、代码注⼊等情况。
读取配置文件失败有时我们⽆法获取当前应⽤所在的⽬录,通过cwd命令可以直接跳转到当前⽬录:
/proc/[pid]/cmd/ ([pid]指向进程的运⾏⽬录)
环境变量中可能存在secret_key,这时也可以通过environ进⾏读取:
/proc/[pid]/environ ([pid]指向进程运⾏时的环境变量)
其他⽬录
Nginx配置⽂件可能存在其他路径:
/usr/local/nginx/conf/* (源代码安装或其他⼀些系统)
⽇志⽂件:
/var/log/* (经常出现Apache2的Web应⽤可读/var/log/apache2/access/log从⽽分析⽇志,盗取其他选⼿的解题步骤)
Apache默认Web根⽬录:
/var/www/html/
PHP session⽬录:
经典的游戏名字
/var/lib/php(5)/sessions/ (泄露⽤户session)
⽤户⽬录:
[user_dir_you_know]/.bash_history (泄露历史执⾏命令)
[user_dir_you_know]/.bashrc (部分环境变量)
[user_dir_you_know]/.ssh/id_rsa(.pub) (ssh登录私钥/公钥)
[user_dir_you_know]/.viminfo (vim使⽤记录)
[pid]指向进程所对应的可执⾏⽂件。有时我们想读取当前应⽤的可执⾏⽂件再进⾏分析,但在实际利⽤时可能存在⼀些安全措施阻⽌我们去读可执⾏⽂件,这时可以尝试读取/proc/self/exe。例如:
/proc/[pid]/fd/(1|2) (读取[pid]指向进程的stdout或stderror或其他)
/proc/[pid]/maps ([pid]指向进程的内存映射)
/
搬新家祝福语proc/[pid]/(mounts|mountinfo) ([pid]指向进程所在的⽂件系统挂载情况,CTF常见的是docker环境这时mount会泄露⼀些敏感路径)
/proc/[pid]/net/* ([pid]指向进程的⽹络信息,如读取TCP将获取进程所绑定的TCP端⼝ARP将泄露⽹段内⽹IP信息)