首页 » Web前端 » svarphp技巧_DedeCMS组合马脚分析

svarphp技巧_DedeCMS组合马脚分析

访客 2024-11-20 0

扫一扫用手机浏览

文章目录 [+]

1. `_RunMagicQuotes()`2. `addslashes($svar)`

下面的$id 值是通过参数传入流程传入进来的。
/uploads/dede/member_toadmin.php

1. `$arr_password[$id] = "{$timestamp}";`2. `$content = "json_encode($arr_password);`3. `$fp = fopen($filename, 'w')` 1. `$filename = DEDEDATA.'/password.data.php';`5. `fwrite($fp, $content);`

漏洞代码节选:

svarphp技巧_DedeCMS组合马脚分析

// /uploads/include/common.inc.php 文件处代码if (!defined('DEDEREQUEST')){ foreach(Array('_GET','_POST','_COOKIE') as $_request) { foreach($$_request as $_k => $_v) { if($_k == 'nvarname') ${$_k} = $_v; else ${$_k} = _RunMagicQuotes($_v); } }}// /uploads/include/common.inc.php 文件处代码function _RunMagicQuotes(&$svar){ if(!get_magic_quotes_gpc()) { if( is_array($svar) ) { foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v); } else { ... $svar = addslashes($svar); } } return $svar;}// /uploads/dede/member_toadmin.phpif($dopost == "toadmin"){ ... $filename = DEDEDATA.'/password.data.php'; if (file_exists($filename)) { require_once(DEDEDATA . '/password.data.php'); $arr_password = json_decode($str_password, true); } ... $arr_password[$id] = "{$timestamp}"; $content = "<?php\r\n\$str_password='".json_encode($arr_password)."';"; $fp = fopen($filename, 'w') or die("写入文件 $filename 失落败,请检讨权限!
"); fwrite($fp, $content); fclose($fp);}
2. 剖析

漏洞成因:在DedeCMS中, 首先会用_RunMagicQuotes()函数,把 $_GET, $_POST, $_COOKIE 这三种办法获取到的用户输入过滤一遍。

svarphp技巧_DedeCMS组合马脚分析
(图片来自网络侵删)

然后在_RunMagicQuotes()函数中, 调用了PHP内置的addslashes()函数将获取到的所有输入进行转义。

然后 json_encode() 函数会将反斜杠进行转义, 这时候单引号就逃逸了 addslashes()函数的过滤, 逃逸了过滤的单引号, 和最开头的单引号实现了闭合。
如下图所示

闭合掉单引号之后, 利用php拼接的性子, 就能传入恶意函数了, 当 $id 的值为 '.phpinfo()?>时, 如下图所示

3. 复现

1.首先打开注册会员功能找到本地文件uploads/install/config.cache.inc.php, 将里面的$cfg_mb_open = 'N'; 改为 $cfg_mb_open = 'Y';。
2.然后注册一个会员(就在主页上)

3.前往后台页面, 找到会员 -> 注册会员列表 -> 提升。
点击提升按钮, 按照提示填写表格。
填写完毕之后, 暂时先不要点击确定提升按钮。

4.配置好浏览器代理, 打开BurpSuit或者类似的其它工具, 开启Proxy模块中的Intercept is on。
然后再点击上一步的确定提升按钮, 这时候能够捕获到HTTP要求包, 要求体部分如下所示。

请把稳这里的id参数, 这里便是漏洞触发点, 将其修正为 3'.phpinfo()?>, 然后将数据包Forward 放回去

可以看到, 恶意代码已经成功注入到 /uploads/data/password.data.php 文件中

访问 /uploads/data/password.data.php 文件, 可以看到成功实行了注入进去的代码。

4. 鸡肋

让我们回到最开始的那段漏洞代码片段中, 里面有一段代码是这样写的。

<?php$filename = DEDEDATA.'/password.data.php';if (file_exists($filename)) { require_once(DEDEDATA . '/password.data.php'); $arr_password = json_decode($str_password, true);}

这段代码, 检测了是否存在 password.data.php 这个文件, 如果存在的话, 则直接对password.data.php 文件的内容进行解码。
也便是说我们没有办法再往里面注入恶意代码了。

那么问题来了,如果碰着网站已经有一个正常内容的password.data.php文件,这个漏洞就没有任何意义了,毕竟这个漏洞只能在没有这个文件的情形下才能触发。
食之无味,弃之可惜。

DedeCMS任意文件删除漏洞(CVE-2022-30508)1. 简述

漏洞涉及文件: /uploads/dede/upload.php漏洞详细代码:

$delete = preg_replace("#^([.][/])#", "", $delete);...if ($dopost === 'delete') { $uploadTmp = DEDEDATA . '/uploadtmp'; if (unlink($uploadTmp . '/' . $delete)) { echo 'success'; exit(); } echo 'fail';}2. 剖析

漏洞成因: preg_replace()对过滤不严格,导致依然能够路径穿越。
然后通过代码中的unlink()函数实现任意文件删除。

3. 复现

首先在根目录下新建一个test.txt文件

由于该漏洞涉及的代码片段比较大略,直策应用内置的参数输入办法输入参数,这里选择的是$_GET传参/uploads/dede/upload.php?dopost=delete&delete=/Rebmal/../../../test.txt

可以看到已经成功删除了test.txt文件。

4. 建议

请升级到最新版本。

from : https://xz.aliyun.com/t/12526

标签:

相关文章

php反射机制机能技巧_php反射机制用法详解

面向工具编程中工具被授予了自省的能力,而这个自省的过程便是反射。反射,直不雅观理解便是根据到达地找到出发地和来源。比如,一个光秃秃...

Web前端 2024-12-12 阅读0 评论0