昨晚到处都是关于thinkphp rce漏洞的消息,所以今天想着分析复现一下
我这里用的是一款基于thinkphp5开发的程序进行测试,漏洞成功利用需要thinkphp开启多语言模式
直接文件包含:
其中/www/server/php/72/lib/php/hello.php为phpinfo文件
使用pearcmd在/tmp文件夹下创建文件再进行包含,前提是php安装了pearcmd,并且开启了register_argc_argv选项,这里有疑问参见P神博客
首先创建文件
再包含
thinkphp程序初始化都会运行/thinkphp/library/think/app.php的initialize()函数,函数中使用this->loadLangPack()获取语言包
进入loadLangPack看一下
可以看到当设置多语言模式后,执行$this->lang->detect()检测语言,进入/thinkphp/library/think/lang.php detect()函数
程序会按照顺序通过url,cookie或浏览器获取语言设置,我们在lang中输入payload,此时payload被赋值给为参数$langSet。回到loadLangPack函数,下一步执行$this->request->setLangset($this->lang->range());设置语言,再执行load函数进行加载。
可以看到load函数的参数是由目录和langset参数拼接构造的,并且没有对传入参数进行过滤和限制。
跟进/thinkphp/library/think/lang.php的load函数,参数传递给了$file,漏洞触发位于标识位置,函数对传入的file参数直接进行了包含操作,造成文件包含漏洞