1.3 任意文件读取漏洞
所谓文件读取漏洞,就是攻击者通过一些手段可以读取服务器上开发者不允许读到的文件。从整个攻击过程来看,它常常作为资产信息搜集的一种强力的补充手段,服务器的各种配置文件、文件形式存储的密钥、服务器信息(包括正在执行的进程信息)、历史命令、网络信息、应用源码及二进制程序都在这个漏洞触发点被攻击者窥探。 文件读取漏洞常常意味着被攻击者的服务器即将被攻击者彻底控制。当然,如果服务器严格按照标准的安全规范进行部署,即使应用中存在可利用的文件读取漏洞,攻击者也很难拿到有价值的信息。文件读取漏洞在每种可部署Web应用的程序语言中几乎都存在。当然,此处的“存在”本质上不是语言本身的问题,而是开发者在进行开发时由于对意外情况考虑不足所产生的疏漏。 业界公认的代码库通常被称为“轮子”,程序可以通过使用这些“轮子”极大地减少重复工作量。如果“轮子”中存在漏洞,在“轮子”代码被程序员多次迭代复用的同时,漏洞也将一级一级地传递,而随着对底层“轮子”代码的不断引用,存在于“轮子”代码中的安全隐患对于处在“调用链”顶端的开发者而言几乎接近透明。对于挖掘Web应用框架漏洞的安全人员来说,能否耐心对这条“调用链”逆向追根溯源也是一个十分严峻的挑战。另外,有一种任意文件读取漏洞是开发者通过代码无法控制的,这种情况的漏洞常常由Web Server自身的问题或不安全的服务器配置导致。Web Server运行的基本机制是从服务器中读取代码或资源文件,再把代码类文件传送给解释器或CGI程序执行,然后将执行的结果和资源文件反馈给客户端用户,而存在于其中的众多文件操作很可能被攻击者干预,进而造成诸如非预期读取文件、错误地把代码类文件当作资源文件等情况的发生。
1.3.1文件读取漏洞常用触发点
1.3.1.1 WEB语言
1. PHP
PHP标准函数中有关文件读的部分不再详细介绍,这些函数包括但可能不限于:file_get_contents()、file()、fopen()函数(及其文件指针操作函数fread()、fgets()等),与文件包含相关的函数(include()、require()、include_once()、require_once()等),以及通过PHP读文件的执行系统命令(system()、exec()等)。这些函数在PHP应用中十分常见,所以在整个PHP代码审计的过程中,这些函数会被审计人员重点关注 PHP开发技术越来越倾向于单入口、多层级、多通道的模式,其中涉及PHP文件之间的调用密集且频繁。开发者为了写出一个高复用性的文件调用函数,就需要将一些动态的信息传入(如可变的部分文件名)那些函数(见图1-3-1)
public static function registerComposerLoader($composerPath)
{
if (is_file(scomposerPath . ' autoload_namespaces. php'))
{
smap = require $composerPath. ' autoload_namespaces. php';
oreach (smap as snamespace => $path)
{
self::addPsro(snamespace, $path);
}
}
if (is_file($composerPath . ' autoload_psr4. php'))
{
smap = require $composerPath. ' autoload_psr4. php';
oreach (smap as snamespace => $path)
{
self: : addPsr4(snamespace, spath);
if (is_file(scomposerPath . ' autoload_classmap. php'))
{
sclassMap = require $composerPath. ' autoload_classmap. php';
if (sclassMap)
{
self::addClassMap(sclassMap);
}
}
}
}
PHP扩展也提供了一些可以读取文件的函数,例如,php-curl扩展(文件内容作为HTTP body)涉及文件存取的库(如数据库相关扩展、图片相关扩展)、XML模块造成的XXE等。 在遇到的有关PHP文件包含的实际问题中,我们可能遇到三种情况: ①文件路径前面可控,后面不可控; ②文件路径后面可控,前面不可控; ③文件路径中间可控。
2.Python
Python的Web应用更多地倾向于通过其自身的模块启动服务,同时搭配中间件、代理服务将整个Web应用呈现给用户,用户和Web应用交互的过程本身就包含对服务器资源文件的请求,所以容易出现非预期读取文件的情况。
3.Java
除了Java本身的文件读取函数FileInputStream、XXE导致的文件读取,Java的一些模块也支持“file://”协议,这是Java应用中出现任意文件读取最多的地方,如Spring Cloud ConfigServer路径穿越与任意文件读取漏洞(CVE-2019-3799)、Jenkins任意文件读取漏洞(CVE-2018-1999002)等
4.Ruby
Ruby的任意文件读取漏洞通常与Rails框架相关。到目前为止,我们已知的通用漏洞为Ruby On Rails远程代码执行漏洞(CVE-2016-0752)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2018-3760)、Ruby On Rails路径穿越与任意文件读取漏洞(CVE-2019-5418)
5.Node
已知Node.js的express模块曾存在任意文件读取漏洞(CVE-2017-14849),但笔者还未遇到相关CTF赛题。CTF中Node的文件读取漏洞通常为模板注入、代码注入等情况。
未完待续…………………………
|