thinkphp3.2.3RCE
ThinkPHP3.2.X RCE漏洞 分析,复现)
漏洞利用条件:
assign方法变量可控
如:
漏洞分析
tp3基础
assign两种调用方法:
传入一个数组如assign(array('a'=>'haha'));
传入两个变量assign('a','haha');
暂且将a和haha称为键值对,
assign方法传入的键值对可以在模板中通过{$变量名}调用
如在模板中使用{$a}即可取到haha
display方法,显示模板内容,参数是模板位置,如果参数为空调用默认模板
分析
tp3在解析模板时,会生成一个php缓存文件$_filename
,将解析后的模板写入这里,然后再include $_filename
解析过程中将 {$a}
变成 :<?php echo ($a); ?>
,在这之前使用extract,生成变量$a=haha
,
这样就达到了模板可以直接调用键值对的效果
缓存变量名是$_filename
所以,如果我在assign传入('_filename','日志'),那extract就会导致变量覆盖,然后include日志文件http://xxx.com?s=<?php phpinfo();?>
,就会触发报错,将url写入日志,然后include日志,getshell
复现的时候发现个问题,写入日志时,直接访问http://xxx.com?s=<?php phpinfo();?>
尖括号会被浏览器编码
burp抓包改下就好了
代码调试
如图,获取一个test参数,assign,然后display
访问:http://tp3.cc/?test[_filename]=./Application/Runtime/Logs/Common/21_08_03.log
assign
Controller的assign调用view的assign
assgin将键值对存到tVar里
display
Controller的display调用view的display
调用fetch方法
tVar值传给了params['var'],然后传给了listen
跟踪params,调用了exec
继续跟踪发现调用了Behavior\ParseTemplateBehavior->run
变量传给了
$data
,又将$_data['var']
传给了fetch又load
终于
extract变量覆盖,,这里include的就是日志文件
assgin将键值对存到tVar里
display
Controller的display调用view的display
调用fetch方法
tVar值传给了params['var'],然后传给了listen
跟踪params,调用了exec
继续跟踪发现调用了Behavior\ParseTemplateBehavior->run
变量传给了$data,又将$_data['var']传给了fetch
又load
终于
extract变量覆盖,,这里include的就是日志文件