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 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 8
Cooper

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

1年前 评论
MArtian (楼主) 1年前
ljheisenberg 1年前
MArtian (楼主) 1年前
Dcatplus-杨光

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

1年前 评论

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

1年前 评论
MArtian (楼主) 1年前

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

1年前 评论