1)简介
ThinkPHP是一个免费开源的,快速的,简单的面向对象的国产轻量级PHP开发框架。
ThinkPHP遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业级应用开而诞生的,具有免费开源,快速简单及面向对象等众多的优秀功能和特性。ThinkPHP经历了五年多发展的同时,在社区团队的积极参与下,在易用性,扩展性和性能方面不断优化和改进,众多的典型案例确保可以稳定用于商业以及门户的开发。
ThinkPHP借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,采用单一入口模式等。融合了Struts的Action思想和JSP的TagLib(标签库),ROR的ORM映射和ActiveRecord模式;封装了CURD和一些常用操作,在项目配置,类库导入,模板引擎,查询语言,自动验证,视图模型,项目编译,缓存机制,SEO支持,分布式数据库,多数据库连接和切换,认证机制和扩展性方面均有独特的表现。
使用ThinkPHP,可以更方便和快捷的开发和部署应用。ThinkPHP本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念,用最少的代码完成更多的功能,宗旨就是让WEB应用开发更简单,更快速!
2)安装方法
下载ThinkPHP后解压完成会形成两个文件夹:ThinkPHP和Examples。
ThinkPHP无需单独安装,将ThinkPHP文件夹FTP至服务器Web目录或拷贝至本地Web目录下面即可。
3)ThinkPHP目录结构说明
ThinkPHP.php:框架入口文件
Common:包含框架的一些公共文件,系统定义,系统函数和惯例配置等
Conf:框架配置文件目录
Lang:系统语言文件目录
Lib:系统基类库目录
Tpl:系统模板目录
Extend:框架扩展s
4)ThinkPHP运行环境要求
thinkphp可以支持Windows/Unix服务器环境,可以运行包括Apache,IIS和nginx在内的多种WEB服务器和多种模式。需要PHP5.2.0以上版本支持,支持MYSQL,MSSQL,PGSQL,SQLITE,ORACLE,LBASE以及PDo等多种数据库和连接。
ThinkPHP本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块。ThinkPHP底层运行的内存消耗极低,而本身的文件大小也是轻量级,因此不会出现空间和内存占用的瓶颈。
一、2-rce
0x01 提前了解知识
preg_replace函数:
preg_replace( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = - 1 [ , int &$count ]])
搜索subject中匹配pattern的部分,以replacement进行替换。
$pattern:要搜索的模式,可以是字符串或者一个字符串数组
$replacement:用于替换的字符串或者数组
$subject:用于替换的目标字符串或者数组
$limit:可选,对于每个模式用于每个subject字符串的最大可替换数。默认是-1
$count:可选·,为替换执行的次数
返回值:
如果subject为一个数组,则返回一个数组,其他情况下返回一个字符串。
如果匹配被查找到,替换后的subject被返回,其他情况下,返回没有改变的 subject,如果发生错误返回NULL
正则表达式:https://www.runoob.com/regexp/regexp-syntax.html
0x02 实验步骤
访问页面,发现是一个Thinkphp的cms框架,由于是漏洞复现,我们很清楚的知道他的版本是2.x。如果不知道版本的可以通过乱输入径进行报错,或是使用云悉指纹识别进行检测
![](https://img-blog.csdnimg.cn/img_convert/6feb563085cdb36dafb471588de1d652.png)
此时输入已经爆出的远程代码执行命令即可浮现漏洞:
![](https://img-blog.csdnimg.cn/img_convert/495eddee63e34fc0482e754bf7dcfec2.png)
![](https://img-blog.csdnimg.cn/img_convert/cd7adbc632d21853599b911373ac15d5.png)
这里只要将phpinfo()换成一句话木马即可成功!
0x03 实验原理
1)通过观察这句话,我们可以清楚的知道它是将
1
${@phpinfo()}
作为变量输出到了页面显示,其原理,我通过freebuf总结一下:
在PHP当中, ${} 是可以构造一个变量的, {} 写的是一般字符,那么就会被当作成变量,比如 ${a} 等价于 $a
thinkphp所有的主入口文件默认访问index控制器(模块)
thinkphp所有的控制器默认执行index动作(方法)
http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值...]
数组$var在路径存在模块和动作时,会去除前面两个值。而数组$var来自于explode($depr,trim($_SERVER['PATH_INFO'],'/'));也就是路径。
所以我们构造poc如下:
/index.php?s=a/b/c/${phpinfo()}
/index.php?s=a/b/c/${phpinfo()}/c/d/e/f
/index.php?s=a/b/c/d/e/${phpinfo()}.......