php 点击alert确定后执行_bolt cms V3.7.0 xss和远程代码执行漏洞

导航:

1. 漏洞环境搭建2.  漏洞分析3. 漏洞测试3.1. xss3.2. 远程代码执行4. 影响版本5. 防御方案

1. 漏洞环境搭建

github上下载对应版本,这里下载3.7.0.

https://github.com/bolt/bolt/releases

解压后需要重命名以下文件:

mv .bolt.yml.dist .bolt.ymlmv composer.json.dist composer.jsonmv composer.lock.dist composer.lockmv src/Site/CustomisationExtension.php.dist src/Site/CustomisationExtension.php

为了快速搭建这里使用phpstudy,开启apache和mysql

0db283f633c66b6317fd427ddf3d8258.png

点击网站,创建站点,选择好php版本并创建数据库,记住域名、数据库名称、用户名和密码

f9fc0ec5f2275fe35fb1f3dc8d8808c2.png

配置数据库app/config/config.yml。填好数据库名称、用户名和密码然后保存

bfe4270f5a9d5801bf93828e85f664b7.png

然后浏览器访问http://上面自己设置的域名/public即可到安装页面,第一次需要设置管理员账号和密码

http://上面自己设置的域名/public        http://上面自己设置的域名/public/bolt  # 管理地址

e45fa75925a93cb8784531925c8edc24.png

2.  漏洞分析

1)XSS成因分析

该漏洞存在于vendor/bolt/bolt/src/Controller/Backend/Users.php。有两个变量$user和$userEntity用于存储和使用以显示此代码中的用户数据。$userEntity在传递给$form->isValid(),这表明$user有未编码的输入和$userEntity是具有编码的输入。也就是说使用$user未对用户输入编码,使用$userEntity可以对用户输入编码。

下面代码使用

$user->getDisplayName()而不是$userEntity->getDisplayName(),显示未编码的用户输入,所以导致XSS。

switch ($action) {        case 'disable':            if ($this->users()->setEnabled($id, false)) {                $this->app['logger.system']->info("Disabled user'{$user->getDisplayname()}'.", ['event' => 'security']);$this->flashes()->info(Trans::__('general.phrase.user-disabled', ['%s'=> $user->getDisplayname()]));            } else {$this->flashes()->info(Trans::__('general.phrase.user-failed-disabled',['%s' => $user->getDisplayname()]));            }            break;        case 'enable':            if ($this->users()->setEnabled($id, true)) {                $this->app['logger.system']->info("Enabled user'{$user->getDisplayname()}'.", ['event' => 'security']);$this->flashes()->info(Trans::__('general.phrase.user-enabled', ['%s'=> $user->getDisplayname()]));            } else {$this->flashes()->info(Trans::__('general.phrase.user-failed-enable',['%s' => $user->getDisplayname()]));            }            break;        case 'delete':            if ($this->isCsrfTokenValid() && $this->users()->deleteUser($id)) {                $this->app['logger.system']->info("Deleted user'{$user->getDisplayname()}'.", ['event' => 'security']);$this->flashes()->info(Trans::__('general.phrase.user-deleted', ['%s'=> $user->getDisplayname()]));            } else {$this->flashes()->info(Trans::__('general.phrase.user-failed-delete',['%s' => $user->getDisplayname()]));            }            break;        default:            $this->flashes()->error(Trans::__('general.phrase.no-such-action-for-user',['%s' => $user->getDisplayname()]));    }

2)远程代码执行成因分析

 public 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. 漏洞测试

3.1. xss

构造payload

xxxxxxxxxx POST /preview/page HTTP/1.1Host: localhost    contenttype=pages&title=title&slug=testpage1&teaser=teaser1&body=

267efa7a17b64295b041275925f9a7c1.png

4b83357648b5fc6884ed341201604158.png

3.2. 远程代码执行

创建一个文件,然后编辑这个文件,写入木马保存。

5aa5ac9bbb696b3973d78709c1a3bda4.png

985c5a4e05e97e1ecd74000d02dde5fb.png

然后将shell.html重命名危shell.html.php\.

8069c4586a7906c977133959e7c942eb.png

即可变成shell.html.php

17185b3a442d92a4fde508f847443932.png

访问该文件即可执行命令

5c40741b20acced65634d3359a1b3f91.png

4. 影响版本

Bolt CMS<= 3.7.0

5. 防御方案

     1. XSS        使用具有编码值的变量来显示用户信息。使用$userEntity而不是$user     2. RCE        重命名时更改数据流。先把数据传过来normalizePath()数据,然后通过validateFileExtension()。这样,验证函数验证最终值。
1d30030350184b12f18c7095e47aacba.gif

相关实验:

WordPress social-warfare插件XSS和RCE漏洞

https://www.hetianlab.com/expc.do?w=exp_ass&ec=ECIDd94d-9f25-44de-bcbb-869ec08838c4

通过实验了解WordPresssocial-warfare插件XSS和RCE漏洞的成因和利用方法,学会在无需身份验证的情况下实现对网站和服务器的控制。

有才能的你快来投稿吧!

投稿细则都在里面了,点击查看哦

重金悬赏 | 合天原创投稿涨稿费啦!

7287c8d1f0ae6dcd2d405dc2e9d63b3b.png eeae49ededf8d8d4a9f42cd88dcbfa09.gif

温馨提示:8月10日-8月14日,课堂用户购课使用京东白条支付将享受【立减60优惠】。

584f992d007957879945af94397841d5.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值