thinkphp5 rce原理分析
文末附赠相关综合利用工具
文章中主要介绍以下4种漏洞的原理分析过程:
5.0.X 路由过滤不严谨rce
5.1.X 路由过滤不严谨rce
__construct 变量覆盖导致RCE
5.0.X 数据库信息泄露
1. 5.0.x 路由过滤不严谨导致rce
1.1 原理分析
设置兼容模式(pathinfo)路由解析时,没有对”\“进行过滤,导致可以指定任意模块控制器和方法,例如:
1.
http://127.0.0.1/tp5.0/public/index.php?s=index/think/app/invokefunction
模块:index
控制器:think
方法:app
参数:invokefunction
正常解析会出错,因为没有think中没有app方法。
2.
http://127.0.0.1/tp5.0/public/index.php?s=index/think\app/invokefunction
模块:index
控制器:think\app
方法:invokefunction
加上"\"后就会将think\app解析成为一个整体,就是think下的app文件。
首先进入入口文件public下的index.php中:
进入start.php中,先加载base.php,再执行app.php中的run方法。
跟进run方法,前面为初始化的一些东西
到这开始进入路由解析,使用的routeCheck方法。
跟进routeCheck方法,先调用Request.php中的path方法,
跟进path方法,调用pathinfo方法,来判断pathinfo(是否为兼容模式)。
跟进pathinfo方法,Config::get(‘var_pathinfo’)查看是否配置了var_pathinfo参数,如果配置了为兼容模式,并提取出默认参数s的值,最后传到app.php中的$path。
下面$config[‘url_route_must’]为查看是否开启了强制路由,如果开启解析’\’时就会失败,就不会产生rce。
进入parseUrlPath方法中,该方法将路由拆分为模块、控制器、方法。这里面并没有过滤’\’。
返回将返回得值赋值给$path,如下图:
提取模块,提取$path中的模块”index”。