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
推荐文章: