安全矩阵

 找回密码
 立即注册
搜索
查看: 863|回复: 0

dedecms之汗流浃背的审计1day

[复制链接]

102

主题

102

帖子

330

积分

中级会员

Rank: 3Rank: 3

积分
330
发表于 2024-3-25 00:20:26 | 显示全部楼层 |阅读模式
本帖最后由 jiangmingzi 于 2024-3-25 00:20 编辑

江南韵 WIN哥学安全 2024-03-02 15:20 天津

[color=rgba(0, 0, 0, 0.9)]前言:
又是我,深情哥大弟子江南韵(压星河),最近跟着学了一手更新包审计1day,感觉又更新了技能书。
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]1.官网查找更新包:

https://www.dedecms.com/download#changelog
看了一圈就是这个更新日志了,里面都是更新包,我们直接下载一个最新的更新包
[color=rgba(0, 0, 0, 0.9)]
然后直接打开看看,研究了一下应该是类似文件覆盖的更新的
[color=rgba(0, 0, 0, 0.9)]
那就好办了,他们教我直接看文件大小就行

[color=rgba(0, 0, 0, 0.9)]

2.直接定位更新的代码
发现多出了这个,这一看不就限制了任意读取或者删除
[color=rgba(0, 0, 0, 0.9)]
再往下面看,发现了危险函数unlink,接下来就看delete参数是不是我们可控的就行了
[color=rgba(0, 0, 0, 0.9)]

3.审计的基本思路
听学长说拿到代码最好看一下目录结构,一般网上都会有的,可以更方便的定位到存在漏洞的功能点,然后再网上就找到了
[color=rgba(0, 0, 0, 0.9)]
文件再后台/dede/upload.php里面,其实更新日志都写了
[color=rgba(0, 0, 0, 0.9)]
接下来就是路由了,听说好像直接get传入参数就可以给$delete赋值了
[color=rgba(0, 0, 0, 0.9)]
可控加路由+危险函数,漏洞点就产生了,真离谱,下次有时间再看看路由情况
[color=rgba(0, 0, 0, 0.9)]
1day的poc如下

/dede/upload.php?delete=../../要删除的文件
4.还有一个存在漏洞上传的php
/puls/mytag_js.php前台的,当时以为是前台的上传,后面发现不是

危险函数为file_put_contents和include,那就是文件包含了应该
[color=rgba(0, 0, 0, 0.9)]
看一下参数可不可控跟踪$cacheFile发现是可控的 aid是我们可以赋值的

$cacheFile = DEDEDATA.'/cache/mytag-'.$aid.'.htm';
接下来就是$myvalues,经过调式可得,首先得满足aid=1&nocache=1,才能走下去,$myvalues是通过$tagbody控制的
[color=rgba(0, 0, 0, 0.9)]
再往上走$tagbody是由$row控制
[color=rgba(0, 0, 0, 0.9)]
再看看$row,是由我们传入的aid控制的,所以这里两个参数都可以控制,但是具体$row的值还是不知道从来里来的
[color=rgba(0, 0, 0, 0.9)]
所以我们直接看数据库对应的表__mytag,还有注释
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]
可以分析出这个功能点应该再自定义标签js哪里,如图:
[color=rgba(0, 0, 0, 0.9)]
然后警告调试myvalues的值是通过查询自定义id值1,再将图中正常内容的值赋值给myvalues,也就是上面的123456

[color=rgba(0, 0, 0, 0.9)]所以一目了然了,通过再后台自定义标签js正常内容添加内容,通过file_put_contents将内容写入到data/cache/mytag-1.htm,include包含这个文件就行了。

include $cacheFile;
[color=rgba(0, 0, 0, 0.9)]但是还是有一堆内容检测,挺好绕的,大家可以测试一下,我就不放poc了

global $cfg_disable_funs;        $cfg_disable_funs = isset($cfg_disable_funs) ? $cfg_disable_funs : 'phpinfo,eval,assert,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,file_put_contents,fsockopen,fopen,fwrite,preg_replace';        $cfg_disable_funs = $cfg_disable_funs.',[$]GLOBALS,[$]_GET,[$]_POST,[$]_REQUEST,[$]_FILES,[$]_COOKIE,[$]_SERVER,include,require,create_function,array_map,call_user_func,call_user_func_array,array_filert';        foreach (explode(",", $cfg_disable_funs) as $value) {            $value = str_replace(" ", "", $value);            if(!empty($value) && preg_match("#[^a-z]+['\"]*{$value}['\"]*[\s]*[([{']#i", " {$myvalues}") == TRUE) {                $myvalues = dede_htmlspecialchars($myvalues);                die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$myvalues}</pre>");            }            if(!empty($value) && preg_match("#<\?(php|=)#i", " {$myvalues}") == TRUE) {                //                $myvalues = dede_htmlspecialchars($myvalues);                die("DedeCMS提示:当前页面中存在恶意代码!<pre>{$myvalues}</pre>");            }            if(!empty($value) && preg_match("#(<)[\s]*(script)[\s\S]*(src)[\s]*(=)[\s]*[\"|']#i", " {$content}") == TRUE) {                preg_match_all("#(src)[\s]*(=)[\s]*[\"|'][\s]*((http|https)(:\/\/)[\S]*)[\"|']#i", " {$content}", $subject);                foreach ($subject[3] as $url) {                    if (preg_match("#^(http|https):\/\/#i", $url) && !preg_match("#^(http|https):\/\/{$_SERVER['HTTP_HOST']}#i", $url)) {                        die("DedeCMS提示:非本站资源无法访问!<pre>{$url}</pre>");                    }                }            }
[color=rgba(0, 0, 0, 0.9)]绕过上面的内容检测,就可以拿最新版的shell了,但是很难受这个是后台的洞,myvalues值是后台修改的,害就分析到这里吧。
[color=rgba(0, 0, 0, 0.9)]
[color=rgba(0, 0, 0, 0.9)]

5 总结

[color=rgba(0, 0, 0, 0.9)]想了想交了一下cnvd,发现重复了,真的是汗流浃背了,真nm卷,最新版也重复,下次看看其他的。
[color=rgba(0, 0, 0, 0.9)]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-9-8 12:50 , Processed in 0.013320 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表