bolt cms V3.7.0 xss和远程代码执行漏洞
1. 漏洞环境搭建
github上下载对应版本,这里下载3.7.0.
1 | https://github.com/bolt/bolt/releases |
解压后需要重命名以下文件:
1 | mv .bolt.yml.dist .bolt.yml |
为了快速搭建这里使用phpstudy,开启apache和mysql
点击网站,创建站点,选择好php版本并创建数据库,记住域名、数据库名称、用户名和密码
配置数据库app/config/config.yml。填好数据库名称、用户名和密码然后保存
然后浏览器访问http://上面自己设置的域名/public即可到安装页面,第一次需要设置管理员账号和密码
1 | http://上面自己设置的域名/public |
2. 漏洞分析
- XSS成因分析
该漏洞存在于vendor/bolt/bolt/src/Controller/Backend/Users.php。有两个变量$user和$userEntity用于存储和使用以显示此代码中的用户数据。$userEntity在传递给$form->isValid(),这表明$user有未编码的输入和$userEntity是具有编码的输入。也就是说使用$user未对用户输入编码,使用$userEntity可以对用户输入编码。
下面代码使用$user->getDisplayName()而不是$userEntity->getDisplayName(),显示未编码的用户输入,所以导致XSS。
1 | switch ($action) { |
远程代码执行成因分析
1
2
3
4
5
6
7
8
9public function rename($path, $newPath)
{
$path = $this->normalizePath($path);
$newPath = $this->normalizePath($newPath);
$this->assertPresent($path);
$this->assertAbsent($newPath);
$this->doRename($path, $newPath);
}normalizePath()函数在第823行acts的同一文件中定义作为Flysystem的normalizePath()函数的包装器。已经习惯了
获取文件的“真实”路径。这用于验证文件位置等等。例如,./somedir/../text.txt == ./text.txt == text.txt
所以’./text.txt’ 传递给此函数,它返回 ‘text.txt’
所以,从文件名 ‘backdoor.php/.’ 将其传递给normalizePath()它返回 ‘backdoor.php’ ,这正是我们所需要的。
所以数据流看起来,首先是值’backdoor.php/.’ 传递给validateFileExtension()返回NULL,因为后面没有文本最后一个点。所以,extesion过滤器被绕过了。接下来,相同的值是传递给normalizePath(),它删除最后一个“/.”,因为它看起来像它是指向当前目录的路径。最后,文件被重命名为’backdoor.php’
3. 漏洞测试
1. xss
构造payload
1 | POST /preview/page HTTP/1.1 |
2. 远程代码执行
创建一个文件,然后编辑这个文件,写入木马保存。
1 | 然后将shell.html重命名危shell.html.php\. |
即可变成shell.html.php
访问该文件即可执行命令
4. 影响版本
Bolt CMS<= 3.7.0
5. 防御方案
1. XSS
使用具有编码值的变量来显示用户信息。使用$userEntity而不是$user
2. RCE
重命名时更改数据流。先把数据传过来normalizePath()数据,然后通过validateFileExtension()。这样,验证函数验证最终值。
6. 漏洞细节参考
https://seclists.org/fulldisclosure/2020/Jul/4
- 本文作者: ordar
- 本文链接: https://mrwq.github.io/bolt cms V3.7.0 xss和远程代码执行漏洞/
- 版权声明: 本文作者: ordar123 转载请注明出处!