Calibre-Web Security Testing: Default Credentials, File Upload, OPDS Feed, and User Management

Calibre-Web is a widely deployed self-hosted e-book library management system that provides a web interface for the Calibre content server, enabling users to browse, download, and manage e-book collections. Its security assessment covers: Calibre-Web's default admin credentials are admin/admin123, documented in the official installation guide and widely shared in home lab tutorials — unchanged defaults give full admin access to user management, library settings, and all stored books; Calibre-Web's OPDS (Open Publication Distribution System) catalog at /opds provides access to the full e-book catalog — when OPDS authentication is not enforced (disabled in settings), the entire book collection is browsable and downloadable without credentials; Calibre-Web allows uploading e-book files (EPUB, MOBI, PDF, CBZ) via the upload interface which invokes Calibre conversion tools server-side — malformed or crafted e-book files targeting parsing vulnerabilities in Calibre can affect the server; the user management interface at /admin/user allows the admin to list all registered users and their email addresses; and Calibre-Web's SQLite database app.db stores user passwords as salted SHA256 hashes alongside user email addresses, reading history, and shelf contents. This guide covers systematic Calibre-Web security assessment.

Table of Contents

  1. Default Credential Testing
  2. OPDS Feed Unauthenticated Access
  3. File Upload Security
  4. Calibre-Web Security Hardening

Default Credential Testing

# Calibre-Web default credentials: admin / admin123
CALIBRE_URL="https://calibre.example.com"

# Test default credentials
RESPONSE=$(curl -s -X POST "${CALIBRE_URL}/login" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=admin&password=admin123&remember_me=on" \
  -c /tmp/calibre_cookies.txt \
  -L 2>/dev/null)

# Check if authenticated by trying to access admin area
ADMIN_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
  "${CALIBRE_URL}/admin" \
  -b /tmp/calibre_cookies.txt 2>/dev/null)

if [ "$ADMIN_STATUS" = "200" ]; then
  echo "DEFAULT CREDENTIALS WORK: admin/admin123"
  # List all users
  curl -s "${CALIBRE_URL}/admin/user" \
    -b /tmp/calibre_cookies.txt 2>/dev/null | \
    grep -oP '(?<=)[^<]+(?=)' | head -20
fi

# Test unauthenticated OPDS catalog access
OPDS_STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
  "${CALIBRE_URL}/opds" 2>/dev/null)
echo "OPDS catalog status (unauthenticated): ${OPDS_STATUS}"

OPDS Feed Unauthenticated Access

# Calibre-Web OPDS (Open Publication Distribution System) feed
# /opds provides catalog of all books — may be accessible without authentication

CALIBRE_URL="https://calibre.example.com"

# Test OPDS catalog access without credentials
curl -s "${CALIBRE_URL}/opds" 2>/dev/null | \
  python3 -c "
import sys, xml.etree.ElementTree as ET
try:
    root = ET.parse(sys.stdin).getroot()
    ns = {'atom': 'http://www.w3.org/2005/Atom'}
    entries = root.findall('atom:entry', ns)
    print(f'OPDS catalog accessible - {len(entries)} entries')
    for e in entries[:5]:
        title = e.find('atom:title', ns)
        if title is not None:
            print(f'  {title.text}')
except Exception as ex:
    print(f'Error: {ex}')
" 2>/dev/null

# Download a book via OPDS without authentication
# First get the catalog entries
curl -s "${CALIBRE_URL}/opds/new" 2>/dev/null | \
  grep -oP 'href="[^"]+\.epub"' | head -5

Calibre-Web Security Hardening

Calibre-Web Security Hardening Checklist:
Security TestMethodRisk
Default admin/admin123 credentialsPOST /login with admin/admin123 — session cookie grants full admin access to user management, library settings, and all stored e-booksCritical
OPDS unauthenticated catalog accessGET /opds without credentials — full e-book catalog browsable and downloadable; all books accessible including any private or sensitive documents stored in the libraryHigh
User enumeration via /admin/userAuthenticated GET /admin/user — lists all registered users with usernames, email addresses, and permission levelsMedium
Open user registration when Allow Registration enabledPOST /register — any visitor can create an account and gain access to the e-book library and any reader-level featuresHigh
Malicious e-book upload to Calibre conversion pipelinePOST /upload with crafted EPUB/MOBI file — file is processed by Calibre conversion tools server-side; malformed files can trigger vulnerabilities in parsing librariesMedium
Direct access to metadata.db or app.dbGET /metadata.db or /app.db if web server misconfigured — SQLite database containing all book metadata and user account hashes with email addressesHigh

Automate Calibre-Web Security Testing

Ironimo tests Calibre-Web deployments for default admin/admin123 credentials giving full admin access to user management and library settings, OPDS feed unauthenticated access at /opds allowing the full e-book catalog to be browsed and downloaded without credentials, open user self-registration, malicious e-book upload to the Calibre conversion pipeline, user account enumeration via the admin user list, and SQLite database file exposure when the web server misconfiguration makes app.db directly accessible.

Start free scan