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 脚本被浏览器直接加载了:
临时修复
创建文件: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();
});
}
修改结果:
这里只是临时修复,已经提交了PR,等待作者合并。
本作品采用《CC 协议》,转载必须注明作者和本文链接
合并估计遥遥无期了吧 :sweat_smile:
好的。 plus 版,已经加入处理代码。修正问题。发布更新版本
目前仅限json 字段吗,普通的text 没事吧,前天刚对富文本编辑器的用了了个 Purifier
git仓库已更新 一开始不知道pr怎么用没直接合并你的代码 抱歉了 :joy: