Dcat Admin JSON 字段渲染高危安全漏洞 [XSS 脚本攻击]

当 JSON 字段中被写入了 xss 脚本时,在详情 show() 页面的 json() 字段显示渲染时,由于 json 字段都是使用 <pre></pre> 标签渲染,xss 脚本会浏览器直接加载并执行。

复现

JSON 数据:

"[\"<sCRiPt sRC=\\/\\/code.jquery.com/jquery-3.7.1.min.js><\\/sCrIpT>\"]"

伪代码:

protected function detail($id)
{
    return Show::make($id, new Model(), function (Show $show) {
        $show->field('comments')->json();
    });
}

这里的 js 脚本被浏览器直接加载了:
Dcat Admin JSON 字段渲染高危安全漏洞 [XSS 脚本攻击]

临时修复

创建文件:
app/Admin/Extensions/Show/SafeJson.php

<?php

namespace App\Admin\Extensions\Show;

use Dcat\Admin\Show\AbstractField;
use Dcat\Admin\Widgets\Dump;

class SafeJson extends AbstractField
{
    public function render()
    {
    $value = $this->value;

    $content = is_string($value) ? json_decode($value, true) : $value;
     if (is_array($content)) {
            array_walk($content, function (&$v, $k) {
                $v = htmlspecialchars($v);
      });
      } else {
            $content = htmlspecialchars($content);
      }

        return Dump::make($content)->runScript(false);
  }
}

编辑 app/Admin/bootstrap.php

<?php

use App\Admin\Extensions\Show\SafeJson;
use Dcat\Admin\Show\Field;

Field::extend('safeJson', SafeJson::class);

新增 dcat_admin_ide_helper.php 方法

namespace Dcat\Admin\Show {

    use App\Admin\Extensions\Show\SafeJson;

    /**
     * @method SafeJson safeJson(...$params)
     */
    class Field {}
}

修改伪代码:

protected function detail($id)
{
    return Show::make($id, new Model(), function (Show $show) {
        $show->field('comments')->safeJson();
    });
}

修改结果:

Dcat Admin JSON 字段渲染高危安全漏洞 [XSS 脚本攻击]

这里只是临时修复,已经提交了PR,等待作者合并。

本作品采用《CC 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 8
Cooper

合并估计遥遥无期了吧 :sweat_smile:

3个月前 评论
MArtian (楼主) 3个月前
ljheisenberg 3个月前
MArtian (楼主) 3个月前
Dcatplus-杨光

好的。 plus 版,已经加入处理代码。修正问题。发布更新版本

3个月前 评论

目前仅限json 字段吗,普通的text 没事吧,前天刚对富文本编辑器的用了了个 Purifier

3个月前 评论
MArtian (楼主) 3个月前
porygonCN

git仓库已更新 一开始不知道pr怎么用没直接合并你的代码 抱歉了 :joy:

3个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!