最近爆出了PHPCMS V9.1.13任意文件包含漏洞,新版本(v9.1.16)已经针对该漏洞做了修复。
下载PHPCMS V9.1.13,解压。
这里我就用Linux天生具备的高效分析能力去快速定位存在漏洞的函数。就懒得找入口点看代码了。
首先我们看触发漏洞的url:/index.php?m=search&c=index&a=public_get_suggest_keyword&url=test&q=../../phpsso_server/caches/configs/database.php
我将public_get_suggest_keyword作为关键字在源码中查找:
1,cd phpcms_v9_GBK/install_package/
2,grep -H -n -R "public_get_suggest_keyword" *
参数说明:-H可以显示文件名;-n显示行号;-R递归目录,查找所有文件
结果如图:
在phpcms/modules/search/index.php文件的第198行找到该函数的定义了:public function public_get_suggest_keyword()
vim phpcms/modules/search/index.php
然后在vim里按shift+冒号,进入vim命令行模式,输入set number可以显示行号,再输入198,直接跳转到198行处:
198 public function public_get_suggest_keyword() {
199 $url = $_GET['url'].'&q='.$_GET['q'];
200
201 $res = @file_get_contents($url);
202 if(CHARSET != 'gbk') {
203 $res = iconv('gbk', CHARSET, $res);
204 }
205 echo $res;
206 }
注意第201行的file_get_contents函数,该函数可以获得指定文件的内容,在此并未做过滤直接可以读取任意文件内容。
在新版本中该函数已经修复:
198 public function public_get_suggest_keyword() {
199 $url = $_GET['url'].'&q='.$_GET['q'];
200 $trust_url = array('c8430fcf851e85818b546addf5bc4dd3');
201 $urm_md5 = md5($url);
202 if (!in_array($urm_md5, $trust_url)) exit;
203
204 $res = @file_get_contents($url);
205 if(CHARSET != 'gbk') {
206 $res = iconv('gbk', CHARSET, $res);
207 }
208 echo $res;
209 }