博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dedecms最新版本存储型XSS
阅读量:4544 次
发布时间:2019-06-08

本文共 3725 字,大约阅读时间需要 12 分钟。

由于编辑文章的模板参数 typeid2可控,导致存储XSS发生。

dedecms/dede/templets/article_edit.htm页面316-325行代码如下:

      
 文章副栏目: ' style='width:200px;' /> 选择副栏目

从上面可以看出,变量$channelid 与 $arcRow['typeid2'] 只要可控,就可以造成XSS,接下来我们去找找能控制$channelid和$arcRow['typeid2']的页面。

dedecms/dede/catalog_do.php页面249-310行代码如下:

else if($dopost == 'unitCatalog'){
CheckPurview('t_Move'); require_once(DEDEINC.'/oxwindow.class.php'); require_once(DEDEINC.'/typelink.class.php'); require_once(DEDEINC.'/channelunit.func.php'); if(empty($nextjob)) {
$typeid = isset($typeid) ? intval($typeid) : 0; $row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__arctype` WHERE reid='$typeid' "); $tl = new TypeLink($typeid); $typename = $tl->TypeInfos['typename']; $reid = $tl->TypeInfos['reid']; $channelid = $tl->TypeInfos['channeltype']; if(!empty($row['dd'])) {
ShowMsg("栏目: $typename($typeid) 有子栏目,不能进行合并操作!", '-1'); exit(); } $typeOptions = $tl->GetOptionArray(0, 0, $channelid); $wintitle = '合并栏目'; $wecome_info = "栏目管理 >> 合并栏目"; $win = new OxWindow(); $win->Init('catalog_do.php', 'js/blank.js', 'POST'); $win->AddHidden('dopost', 'unitCatalog'); $win->AddHidden('typeid', $typeid); $win->AddHidden('channelid', $channelid); $win->AddHidden('nextjob', 'unitok'); $win->AddTitle("合并目录时不会删除原来的栏目目录,合并后需手动更新目标栏目的文档HTML和列表HTML。"); $win->AddItem('你选择的栏目是:', "$typename($typeid)"); $win->AddItem('你希望合并到那个栏目?', ""); $win->AddItem('注意事项:', '栏目不能有下级子栏目,只允许子级到更高级或同级或不同父级的情况。'); $winform = $win->GetWindow('ok'); $win->Display(); exit(); } else {
if($typeid==$unittype) {
ShowMsg("同一栏目无法合并,请后退重试!", '-1'); exit(); } if(IsParent($unittype, $typeid)) {
ShowMsg('不能从父类合并到子类!', 'catalog_main.php'); exit(); } $row = $dsql->GetOne("SELECT addtable FROM `#@__channeltype` WHERE id='$channelid' "); $addtable = (empty($row['addtable']) ? '#@__addonarticle' : $row['addtable'] ); $dsql->ExecuteNoneQuery("UPDATE `#@__arctiny` SET typeid='$unittype' WHERE typeid='$typeid' "); $dsql->ExecuteNoneQuery("UPDATE `#@__feedback` SET typeid='$unittype' WHERE typeid='$typeid' "); $dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid='$unittype' WHERE typeid='$typeid' "); $dsql->ExecuteNoneQuery("UPDATE `#@__archives` SET typeid2='$unittype' WHERE typeid2='$typeid' "); $dsql->ExecuteNoneQuery("UPDATE `#@__addonspec` SET typeid='$unittype' WHERE typeid='$typeid' "); $dsql->ExecuteNoneQuery("UPDATE `$addtable` SET typeid='$unittype' WHERE typeid='$typeid' "); $dsql->ExecuteNoneQuery("DELETE FROM `#@__arctype` WHERE id='$typeid' "); UpDateCatCache(); ShowMsg('成功合并指定栏目!', 'catalog_main.php'); exit(); }}

由于变量$channelid 在该文件头部已经被过滤为intval($channelid),所以这个变量利用不了。

弱点代码在这里
$dsql->ExecuteNoneQuery(“UPDATE `#@__archives` SET typeid2=’$unittype’ WHERE typeid2=’$typeid’ “);
只要我们构造好POC,即可修改dede_archives表typeid2的值,从而造成存储XSS,因为编辑文章的时候,typeid2的值已经在数据库改了,所以每次编辑文章即可触发这个恶意代码。
也就是说当提交

URLpostdata:dopost=unitCatalog&nextjob='非空值'&typeid=0&unittype='>

下面这个sql语句就会执行成功

$dsql->ExecuteNoneQuery(“UPDATE `#@__archives` SET typeid2=’$unittype’ WHERE typeid2=’$typeid’ “);
当然执行这条sql语句前提是这个表里的一定要有1条记录

利用方法就是CSRF 让管理员请求这个构造好的URL即可

转载于:https://www.cnblogs.com/milantgh/p/3602117.html

你可能感兴趣的文章
Jetty:部署到Jetty
查看>>
在XP上安装VS2002
查看>>
linux程序设计——网络信息(第十五章)
查看>>
待补的坑
查看>>
算法稳定性
查看>>
static关键字详解
查看>>
python删除列表中元素的方法
查看>>
进程与线程(2)- python实现多进程
查看>>
MySQL性能优化的最佳20+条经验
查看>>
GUI线程安全详解(二)
查看>>
编写一个Servlet,将表单提交的商品信息输出到页面中
查看>>
使用.NET Core与Google Optimization Tools实现加工车间任务规划
查看>>
成都Uber优步司机奖励政策(3月22日)
查看>>
How to capture video frames from the camera as images using AV Foundation
查看>>
静态变量、实例变量、局部变量与线程安全
查看>>
Oracle 11.2.0.4.0 Dataguard部署和日常维护(6)-Dataguard Snapshot篇
查看>>
python基础语法_9-2函数式编程
查看>>
js实现文字超出部分用省略号代替实例代码
查看>>
SpringCloud学习笔记(3)——Hystrix
查看>>
选择本地文件file
查看>>