-
-
DedeCms 最新注入漏洞详细分析
-
发表于: 2014-5-12 11:55 2423
-
新闻链接:e2bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0R3H3z5e0m8K6k6h3y4Q4x3X3g2U0L8$3#2Q4x3V1k6*7N6h3W2^5K9h3&6D9L8%4g2V1L8$3&6Y4i4K6u0r3x3e0p5I4y4U0t1#2i4K6u0W2K9s2c8E0L8l9`.`.
新闻时间:2014-03-27
新闻正文
前几天dede的补丁出来以后我分析的文章,既然现在利用工具也已经公开了,也没什么不分享的道理
乌云上kobin97爆出了一个织梦cms的注入0day,无奈我不是核心白帽子看不了。土司上有同学发表的分析文章,无奈我没有阅读权限100看不了。于是我只能在蛛丝马迹中寻找一些信息,自己分析一下关于这个0day。
以前完全没有看过dede的源码,所以我先拿出以前下的一个不知什么时候更新的dede5.7,然后去乌云寻找一些蛛丝马迹。在这里我找到了这么一个回复:
从这里我大概知道,如何绕过单引号了。然后昨天从基友那得来,漏洞出现的位置:/plus/recommend.php。
来到这个文件,其中找到一个sql语句:
$arcRow=$dsql->GetOne("SELECT s.*,t.* FROM `dede_member_stow` AS s LEFT JOIN `dede_member_stowtype` AS t ON s.type=t.stowname WHERE s.aid='$aid' AND s.type='$type'");
if(!is_array($arcRow)){
ShowMsg("无法把未知文档推荐给好友!","-1");
exit();
}
$arcRow['arcurl']=$arcRow['indexurl']."=".$arcRow['aid'];
extract($arcRow, EXTR_SKIP);
可控变量有$aid和$type。可惜前面aid经过了is_numeric函数的过滤,就剩type了。
但在这里试着输出一下,可以明显的看到,$type变量是使用了addslashes转义了的。那么如何绕过?
因为之前乌云上的那个回复,我大概知道如何绕过addslashes。先来看到/include/common.inc.php,这个文件是包含在目标文件最上面的,也是全局的一个文件。
112行:
//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if($_FILES)
{
require_once(DEDEINC.'/uploadsafe.inc.php');
}
包含了一个uploadsafe.inc.php文件,我们进去看看:
<?php
if(!defined('DEDEINC')) exit('Request Error!');
if(isset($_FILES['GLOBALS'])) exit('Request not allow!');
//为了防止用户通过注入的可能性改动了数据库
//这里强制限定的某些文件类型禁止上传
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";
$keyarr = array('name', 'type', 'tmp_name', 'size');
if ($GLOBALS['cfg_html_editor']=='ckeditor' && isset($_FILES['upload']))
{
$_FILES['imgfile'] = $_FILES['upload'];
$CKUpload = TRUE;
unset($_FILES['upload']);
}
foreach($_FILES as $_key=>$_value)
{
foreach($keyarr as $k)
{
if(!isset($_FILES[$_key][$k]))
{
exit('Request Error!');
}
}
if( preg_match('#^(cfg_|GLOBALS)#', $_key) )
{
exit('Request var not allow for uploadsafe!');
}
$$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\", $_FILES[$_key]['tmp_name']);
看到这里我就懂了,一个变量覆盖,并且使用str_replace将\\替换成了\(因为在双引号里面,所以本身包含一个转义,看起来是4个\换成2个\)。
\\换成了\,代表什么意义?之前我们的addslashes函数将\’转义成了\\\’,然后我们把\\换成\,你看到了什么,\\\’变成了\\’,反斜杠被转义了,双引号逃出来了。
然后因为有一个$$key覆盖变量,所以我们就可以把后面的$type在这里覆盖掉。
不过前面还有一个小判断:
foreach($keyarr as $k)
{
if(!isset($_FILES[$_key][$k]))
{
exit('Request Error!');
}
}
$_FILE[$_key][$k]必须在$keyarr数组中,这个数组是array('name', 'type', 'tmp_name', 'size'),所以我们还需要传递这些变量。
33eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8Y4m8D9N6i4y4Q4x3V1k6J5k6h3y4G2L8h3#2W2L8X3c8Q4x3X3g2H3K9s2m8Q4x3@1k6S2K9h3c8Q4x3@1b7I4i4K6t1$3i4K6g2X3c8V1W2x3c8g2y4Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6g2n7L8X3q4E0k6g2)9#2c8q4)9J5y4W2)9#2k6V1k6u0e0p5g2e0i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9#2b7Y4y4A6P5X3g2Q4y4f1c8Q4x3U0k6Q4y4h3k6r3d9f1I4q4f1#2)9#2b7Y4c8&6M7r3g2Q4y4f1c8Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6t1$3i4K6g2X3c8V1W2x3c8g2y4Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6g2n7N6r3#2H3i4K6g2X3L8X3q4E0k6g2)9#2c8q4)9K6c8q4!0q4y4W2!0n7x3#2!0m8z5q4!0q4y4g2)9^5y4g2!0m8y4g2!0q4y4#2)9^5x3W2!0n7z5b7`.`.
有了注入点,后面就简单了。绕过80sec防注入,网上的文章很多,我就不再赘述。
直接给出exp:
09fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0R3H3z5e0m8K6k6h3y4Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8s2g2K6i4K6u0r3M7X3g2U0L8$3#2E0k6h3&6V1i4K6u0W2M7r3S2H3i4K6y4r3j5h3W2V1i4K6y4p5x3g2)9J5y4W2)9#2k6V1k6u0e0p5g2e0i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9#2b7X3&6S2L8h3g2Q4y4f1c8Q4x3U0k6Q4y4h3k6r3d9f1I4q4f1#2)9#2b7Y4c8&6M7r3g2Q4y4f1c8Q4y4f1u0K6K9i4A6W2i4K6g2p5i4K6t1$3i4K6g2X3c8V1W2x3c8g2y4Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9J5y4W2)9#2k6V1k6u0e0p5g2e0i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9#2b7Y4c8E0M7q4)9#2k6X3&6S2L8h3g2Q4y4f1c8Q4x3@1c8S2j5g2)9#2b7#2)9J5y4$3q4F1k6q4)9J5b7X3y4Z5j5i4u0Q4x3U0S2Q4y4o6m8Q4y4U0m8Q4x3U0N6Q4y4U0m8Q4x3U0W2Q4x3V1u0Q4x3V1k6Q4x3V1q4Q4x3U0p5#2x3o6l9H3x3q4g2F1K9h3!0F1i4K6u0m8i4K6u0r3i4K6u0n7i4K6u0r3i4K6u0m8i4K6t1I4y4e0l9H3x3o6m8e0k6f1I4W2j5%4c8Q4x3V1q4Q4x3V1k6Q4x3V1t1I4i4K6u0o6x3W2)9J5b7K6y4Q4x3V1y4Y4M7X3!0#2M7q4)9#2k6X3y4G2L8X3y4S2N6q4)9J5z5s2g2K6k6i4u0A6k6q4)9J5b7K6m8^5x3U0y4Q4x3V1y4H3N6$3c8Q4x3U0W2Q4x3V1x3#2i4K6u0o6y4W2)9J5b7K6N6Q4x3V1x3^5i4K6u0o6z5g2)9J5y4X3&6T1M7%4m8Q4x3@1u0X3M7X3!0E0i4K6t1$3L8X3u0K6M7q4)9K6b7W2)9$3x3q4)9J5y4e0t1K6i4K6b7H3i4K6g2X3i4K6g2X3j5h3c8E0K9h3&6Q4y4U0m8Q4x3U0f1J5x3H3`.`.
新闻时间:2014-03-27
新闻正文
前几天dede的补丁出来以后我分析的文章,既然现在利用工具也已经公开了,也没什么不分享的道理
乌云上kobin97爆出了一个织梦cms的注入0day,无奈我不是核心白帽子看不了。土司上有同学发表的分析文章,无奈我没有阅读权限100看不了。于是我只能在蛛丝马迹中寻找一些信息,自己分析一下关于这个0day。
以前完全没有看过dede的源码,所以我先拿出以前下的一个不知什么时候更新的dede5.7,然后去乌云寻找一些蛛丝马迹。在这里我找到了这么一个回复:
从这里我大概知道,如何绕过单引号了。然后昨天从基友那得来,漏洞出现的位置:/plus/recommend.php。
来到这个文件,其中找到一个sql语句:
$arcRow=$dsql->GetOne("SELECT s.*,t.* FROM `dede_member_stow` AS s LEFT JOIN `dede_member_stowtype` AS t ON s.type=t.stowname WHERE s.aid='$aid' AND s.type='$type'");
if(!is_array($arcRow)){
ShowMsg("无法把未知文档推荐给好友!","-1");
exit();
}
$arcRow['arcurl']=$arcRow['indexurl']."=".$arcRow['aid'];
extract($arcRow, EXTR_SKIP);
可控变量有$aid和$type。可惜前面aid经过了is_numeric函数的过滤,就剩type了。
但在这里试着输出一下,可以明显的看到,$type变量是使用了addslashes转义了的。那么如何绕过?
因为之前乌云上的那个回复,我大概知道如何绕过addslashes。先来看到/include/common.inc.php,这个文件是包含在目标文件最上面的,也是全局的一个文件。
112行:
//转换上传的文件相关的变量及安全处理、并引用前台通用的上传函数
if($_FILES)
{
require_once(DEDEINC.'/uploadsafe.inc.php');
}
包含了一个uploadsafe.inc.php文件,我们进去看看:
<?php
if(!defined('DEDEINC')) exit('Request Error!');
if(isset($_FILES['GLOBALS'])) exit('Request not allow!');
//为了防止用户通过注入的可能性改动了数据库
//这里强制限定的某些文件类型禁止上传
$cfg_not_allowall = "php|pl|cgi|asp|aspx|jsp|php3|shtm|shtml";
$keyarr = array('name', 'type', 'tmp_name', 'size');
if ($GLOBALS['cfg_html_editor']=='ckeditor' && isset($_FILES['upload']))
{
$_FILES['imgfile'] = $_FILES['upload'];
$CKUpload = TRUE;
unset($_FILES['upload']);
}
foreach($_FILES as $_key=>$_value)
{
foreach($keyarr as $k)
{
if(!isset($_FILES[$_key][$k]))
{
exit('Request Error!');
}
}
if( preg_match('#^(cfg_|GLOBALS)#', $_key) )
{
exit('Request var not allow for uploadsafe!');
}
$$_key = $_FILES[$_key]['tmp_name'] = str_replace("\\\\", "\\", $_FILES[$_key]['tmp_name']);
看到这里我就懂了,一个变量覆盖,并且使用str_replace将\\替换成了\(因为在双引号里面,所以本身包含一个转义,看起来是4个\换成2个\)。
\\换成了\,代表什么意义?之前我们的addslashes函数将\’转义成了\\\’,然后我们把\\换成\,你看到了什么,\\\’变成了\\’,反斜杠被转义了,双引号逃出来了。
然后因为有一个$$key覆盖变量,所以我们就可以把后面的$type在这里覆盖掉。
不过前面还有一个小判断:
foreach($keyarr as $k)
{
if(!isset($_FILES[$_key][$k]))
{
exit('Request Error!');
}
}
$_FILE[$_key][$k]必须在$keyarr数组中,这个数组是array('name', 'type', 'tmp_name', 'size'),所以我们还需要传递这些变量。
33eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3I4G2j5$3q4D9K9r3!0K6N6q4)9J5c8Y4m8D9N6i4y4Q4x3V1k6J5k6h3y4G2L8h3#2W2L8X3c8Q4x3X3g2H3K9s2m8Q4x3@1k6S2K9h3c8Q4x3@1b7I4i4K6t1$3i4K6g2X3c8V1W2x3c8g2y4Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6g2n7L8X3q4E0k6g2)9#2c8q4)9J5y4W2)9#2k6V1k6u0e0p5g2e0i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9#2b7Y4y4A6P5X3g2Q4y4f1c8Q4x3U0k6Q4y4h3k6r3d9f1I4q4f1#2)9#2b7Y4c8&6M7r3g2Q4y4f1c8Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6t1$3i4K6g2X3c8V1W2x3c8g2y4Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6g2n7N6r3#2H3i4K6g2X3L8X3q4E0k6g2)9#2c8q4)9K6c8q4!0q4y4W2!0n7x3#2!0m8z5q4!0q4y4g2)9^5y4g2!0m8y4g2!0q4y4#2)9^5x3W2!0n7z5b7`.`.
有了注入点,后面就简单了。绕过80sec防注入,网上的文章很多,我就不再赘述。
直接给出exp:
09fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6e0R3H3z5e0m8K6k6h3y4Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8s2g2K6i4K6u0r3M7X3g2U0L8$3#2E0k6h3&6V1i4K6u0W2M7r3S2H3i4K6y4r3j5h3W2V1i4K6y4p5x3g2)9J5y4W2)9#2k6V1k6u0e0p5g2e0i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9#2b7X3&6S2L8h3g2Q4y4f1c8Q4x3U0k6Q4y4h3k6r3d9f1I4q4f1#2)9#2b7Y4c8&6M7r3g2Q4y4f1c8Q4y4f1u0K6K9i4A6W2i4K6g2p5i4K6t1$3i4K6g2X3c8V1W2x3c8g2y4Q4y4f1u0@1P5i4m8W2i4K6g2p5i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9J5y4W2)9#2k6V1k6u0e0p5g2e0i4K6g2n7N6s2W2H3k6g2)9#2c8q4)9#2b7Y4c8E0M7q4)9#2k6X3&6S2L8h3g2Q4y4f1c8Q4x3@1c8S2j5g2)9#2b7#2)9J5y4$3q4F1k6q4)9J5b7X3y4Z5j5i4u0Q4x3U0S2Q4y4o6m8Q4y4U0m8Q4x3U0N6Q4y4U0m8Q4x3U0W2Q4x3V1u0Q4x3V1k6Q4x3V1q4Q4x3U0p5#2x3o6l9H3x3q4g2F1K9h3!0F1i4K6u0m8i4K6u0r3i4K6u0n7i4K6u0r3i4K6u0m8i4K6t1I4y4e0l9H3x3o6m8e0k6f1I4W2j5%4c8Q4x3V1q4Q4x3V1k6Q4x3V1t1I4i4K6u0o6x3W2)9J5b7K6y4Q4x3V1y4Y4M7X3!0#2M7q4)9#2k6X3y4G2L8X3y4S2N6q4)9J5z5s2g2K6k6i4u0A6k6q4)9J5b7K6m8^5x3U0y4Q4x3V1y4H3N6$3c8Q4x3U0W2Q4x3V1x3#2i4K6u0o6y4W2)9J5b7K6N6Q4x3V1x3^5i4K6u0o6z5g2)9J5y4X3&6T1M7%4m8Q4x3@1u0X3M7X3!0E0i4K6t1$3L8X3u0K6M7q4)9K6b7W2)9$3x3q4)9J5y4e0t1K6i4K6b7H3i4K6g2X3i4K6g2X3j5h3c8E0K9h3&6Q4y4U0m8Q4x3U0f1J5x3H3`.`.
赞赏
赞赏
雪币:
留言: