前言
在日常的任务环境中,漏洞的存在对任何系统而言都是巨大的风险隐患。特别是一些比较古老的系统或者存在已知漏洞框架、组件这方面的系统渗透测试,在日常挖掘中,未授权文件下载和越权文件上传,我们应该不在陌生,此类漏洞可定级一中、一高风险。在本次测试中,通过对多个功能模块的代码审计,发现了一些严重的安全问题。
- 未授权文件下载
未授权文件下载是一个常见的安全漏洞,通常由于文件路径和文件名生成不安全,且缺乏适当的权限验证。在代码审计过程中,我们发现多个功能模块(如试题下载、代金券导出和成绩导出)存在文件生成路径和名称直接暴露在Web目录下,且文件下载链接可以通过简单的URL猜测或爆破方式获取。这使得攻击者可以轻松地下载敏感数据文件,从而导致数据泄露。
- 越权文件上传
越权文件上传漏洞同样是一个严重的安全问题,特别是在没有进行严格的文件类型和权限校验的情况下。代码审计显示,文件上传功能中缺乏对文件类型的严格验证和用户权限的检查,攻击者可以利用该漏洞上传恶意文件,甚至可能获得服务器的控制权。这种漏洞的存在不仅会导致数据泄露,还可能导致系统被攻击者利用,从而威胁到整个系统的安全。
文件未授权下载
一、试题下载
>app\exam\controller\basic.master.php
} $questions = $this->exam->getQuestionListByArgs($args); $fname = 'data/score/'.$this->ev->get('subjectid').'-'.$this->ev->get('sectionid').'-'.$this->ev->get('knowsid').'-questions.csv'; $r = array(); foreach($questions as $p) { $r[] = array('questiontype' => $p['questiontype'],'question' => iconv("UTF-8","GBK",html_entity_decode($p['question'])),'questionselect' => iconv("UTF-8","GBK",html_entity_decode($p['questionselect'])),'questionselectnumber' => iconv("UTF-8","GBK",$p['questionselectnumber']),'questionanswer' => iconv("UTF-8","GBK",html_entity_decode($p['questionanswer'])),'questiondescribe' => iconv("UTF-8","GBK",html_entity_decode($p['questiondescribe'])),'knowsid' => $p['qkknowsid'],'questionlevel' => $p['questionlevel']); } if($this->files->outCsv($fname,$r)) $message = array( 'statusCode' => 200, "message" => "试题导出成功,转入下载页面,如果浏览器没有相应,请<a href=\"{$fname}\">点此下载</a>", "callbackType" => 'forward', "forwardUrl" => "{$fname}" ); else $message = array( 'statusCode' => 300, "message" => "试题导出失败" ); $this->G->R($message); }
这个洞是随便点的功能,没记住是哪个功能点了,直接在代码上整吧!先看上面代码块是一个生成文件路径和文件名称的代码,这里通过$this->ev->get()
方法从外部输入获取subjectid
、sectionid
和knowsid
,并用这些参数构建了文件路径和名称。
$fname = 'data/score/'.$this->ev->get('subjectid').'-'.$this->ev->get('sectionid').'-'.$this->ev->get('knowsid').'-questions.csv';
data/score/ 为生成的Web目录路径为用户提供下载,这个是将全部的考试试题,进行导出的动作,并不是部分。
然后就是文件生成,使用$this->files->outCsv
方法将题目列表数据写入到$fname
指定的CSV文件中。
if($this->files->outCsv($fname,$r))
文件下载链接在文件生成成功后,系统返回一个包含文件下载链接的消息。这里的$fname
变量直接插入到了链接中。
$message = array( 'statusCode' => 200, "message" => "试题导出成功,转入下载页面,如果浏览器没有相应,请<a href=\"{$fname}\">点此下载</a>", "callbackType" => 'forward', "forwardUrl" => "{$fname}" );
POC地址是这样的,直接在/data/score上挂载生成的文件内容,之后就是通过文件名下载。
http://XXX.XXX.XX.XX/dat