漏洞复现 漏洞分析 这里以thinkphp 6为例进行分析,thinkphp 5类似。Thinkphp的中间件默认会调用handle函数,因此直接在LoadLangPack.php的handle函数中下断点 在detect函数中会从request中提取多个参数 查看config可知,detect就是从请求的不同位置中提取lang等参数 默认情况下,allow_lang_list 这个配置为空,因此从...
漏洞复现 漏洞分析 这里以thinkphp 6为例进行分析,thinkphp 5类似。 Thinkphp的中间件默认会调用handle函数,因此直接在LoadLangPack.php的handle函数中下断点 在detect函数中会从request中提取多个参数 查看config可知,detect就是从请求的不同位置中提取lang等参数 默认情况下,allow_lang_list 这个配置为空,因此从lang...
先看PHP官方补丁内容:在think5中修改的文件定位在了think\lang.php的detect方法,定位漏洞位置。 观察未修复的漏洞文件:在detect()其结果为定义了一个self::$range,通过源码分析可得,此参数受到下列参数影响: 我们将其中:$_GET[self::$langDetectVar]输出出来,验证参数内容的可控程度,其参数内容完全可控,并且detect的...
漏洞分析 这里以thinkphp 6为例进行分析,thinkphp 5类似。 Thinkphp的中间件默认会调用handle函数,因此直接在LoadLangPack.php的handle函数中下断点 在detect函数中会从request中提取多个参数 查看config可知,detect就是从请求的不同位置中提取lang等参数 默认情况下,allow_lang_list 这个配置为空,因此从lang参数中拿到...
漏洞分析 thinkphp框架运行时会首先加载thinkphp/library/think/App.php文件进行一系列的初始化操作。在run函数中可以看到当开启了多语言机制,会运行Lang::detect()函数。 跟进Lang::detect()函数,可以看到会依次从url,cookie,自动侦测浏览器中获取设置的语言,然后返回结果 在App.php中获取语言结果以后加载系统语言包...
}$this->request->filter($this->config('app.default_filter'));//读取默认语言$this->lang->range($this->config('app.default_lang'));if($this->config('app.lang_switch_on')) {//开启多语言机制 检测当前语言$this->lang->detect(); ...
= $name && is_dir(APP_PATH . $name)) { Route::bind($name); } } $request->filter($config['default_filter']); // 默认语言 Lang::range($config['default_lang']); // 开启多语言机制 检测当前语言 $config['lang_switch_on'] && Lang::detect(); $request->langset(Lang::range());...
漏洞主要在于 LoadLangPack 类中的 handle 函数,该函数先通过 detect() 方法检查请求参数是否设置了语言,之后将设置值返回并用于切换语言集。在传递给 load() 函数后,参数又传入 parse() 函数,直接用 include 包含文件,此为漏洞触发点。从获取参数到传入 parse() 函数前,均未对内容进行过滤。四...
漏洞分析、调试 thinkphp 6 调试环境:windows ,php7.3,thinkphp6.0.12 打开多语言中间件: 访问: http://127.0.0.1:82/?lang=../../../../../public/index 每个middleware 的handle()函数都会被调用,这里断在LoadLangPack.php的handle(),直接在最开头调用$langset = $this->detect($request);: ...
三、漏洞分析 首先看LoadLangPack这个类,handle()函数 中先调用detect()方法在请求中检查是否有参数设置语言 多个判断中检查了get、header、cookie等位置,config['allow_lang_list']默认为空情况下,$langSet赋给$range并返回 又回到handle()中$this->lang->switchLangSet($langset); 执行 ...