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 脚本攻击]](https://cdn.learnku.com/uploads/images/202410/23/56030/QQ5ryf6ixW.png!large)
临时修复
创建文件: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 脚本攻击]](https://cdn.learnku.com/uploads/images/202410/23/56030/0P0VtG6edq.png!large)
这里只是临时修复,已经提交了PR,等待作者合并。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
合并估计遥遥无期了吧 :sweat_smile:
好的。 plus 版,已经加入处理代码。修正问题。发布更新版本
目前仅限json 字段吗,普通的text 没事吧,前天刚对富文本编辑器的用了了个 Purifier
git仓库已更新 一开始不知道pr怎么用没直接合并你的代码 抱歉了 :joy: