Thinkphp v5.1.x 环境搭建 docker run -it -d -p 80:80 vulfocus/thinkphp:6.0.12 漏洞复现 漏洞分析 这里以thinkphp 6为例进行分析,thinkphp 5类似。Thinkphp的中间件默认会调用handle函数,因此直接在LoadLangPack.php的handle函数中下断点 在detect函数中会从request中提取多个参数 查看config可知,detect...
如:图一,我们在配置好多语言项的时候,发现我们同时也设置了默认语言,可以当我们打开浏览器的时候发现项目的默认语言只会跟随者浏览器的语言而显示当前的语言类别,并不会根据我们在图一的设置默认语言项显示,这是因为在TP框架下的/thinkphp/library/think/Lang.php这个语言文件里面的detect()这个方法配置的有点小问题...
每个middleware 的handle()函数都会被调用,这里断在LoadLangPack.php的handle(),直接在最开头调用$langset = $this->detect($request);: 跟进这个detect(),可以看到依次排查了GET["lang"]、HEADER["think-lang"]、COOKIE["think_lang"],并且将其不做任何过滤,直接赋值给了$langSet: 然后默认情况下,即allow_l...
此问题源于Thinkphp框架内/thinkphp/library/think/Lang.php文件中detect()方法的配置错误。该方法仅检测浏览器的Accept-Language,导致即使在配置文件中设置默认语言,页面也不会显示所设语言。这可视为框架中的一个小BUG。为解决此问题,可对detect方法进行升级。升级后的代码示例如下:在实际应用中,开发...
三、漏洞分析 首先看LoadLangPack这个类,handle()函数 中先调用detect()方法在请求中检查是否有参数设置语言多个判断中检查了get、header、cookie等位置,config['allow_lang_list']默认为空情况下,$langSet赋给$range并返回又回到handle()中$this->lang->switchLangSet($langset); 执行...
然后最最最重要的一点,必须将\thinkphp\library\think\Lang.php 中的detect()方法修改: /** * 自动侦测设置获取语言选择 * @return string*/publicstaticfunctiondetect() {//自动侦测设置获取语言选择$langSet= Config::get('default_lang');if(isset($_GET[self::$langDetectVar])) {//url中设置了语言变...
'AUTO_DETECT_LANG' => false, // 自动侦测语言 /* 数据库设置 */ 'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8 'DB_DEPLOY_TYPE' => 0, // 数据库部署方式 0 集中式(单一服务器) 1 分布式(主从服务器) 'DB_RW_SEPARATE' => false, ...
进行漏洞复现时,以ThinkPHP 6为例分析,首先在LoadLangPack.php的handle函数中设置断点,在detect函数中从request中提取多个参数。查看config可知,detect从请求的不同位置提取如lang等参数。默认情况下,allow_lang_list配置为空,因此从lang参数中获取的变量未经过过滤直接传给了$this->range并返回该值。...
可以看到当设置多语言模式后,执行$this->lang->detect()检测语言,进入/thinkphp/library/think/lang.php detect()函数 程序会按照顺序通过url,cookie或浏览器获取语言设置,我们在lang中输入payload,此时payload被赋值给为参数$langSet。回到loadLangPack函数,下一步执行$this->request->setLangset($this->lang->ran...
< 二、在Application/Common/conf/config.php配置文件中新增如下内容: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 <?php'LANG_SWITCH_ON'=>true,// 开启语言包功能'LANG_AUTO_DETECT'=>true,// 自动侦测语言 开启多语言功能后有效'LANG_LIST'=>'zh-cn,en-us',// 允许切换的语言列表 用逗号分隔...