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.
# 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}"
# 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
| Security Test | Method | Risk |
|---|---|---|
| Default admin/admin123 credentials | POST /login with admin/admin123 — session cookie grants full admin access to user management, library settings, and all stored e-books | Critical |
| OPDS unauthenticated catalog access | GET /opds without credentials — full e-book catalog browsable and downloadable; all books accessible including any private or sensitive documents stored in the library | High |
| User enumeration via /admin/user | Authenticated GET /admin/user — lists all registered users with usernames, email addresses, and permission levels | Medium |
| Open user registration when Allow Registration enabled | POST /register — any visitor can create an account and gain access to the e-book library and any reader-level features | High |
| Malicious e-book upload to Calibre conversion pipeline | POST /upload with crafted EPUB/MOBI file — file is processed by Calibre conversion tools server-side; malformed files can trigger vulnerabilities in parsing libraries | Medium |
| Direct access to metadata.db or app.db | GET /metadata.db or /app.db if web server misconfigured — SQLite database containing all book metadata and user account hashes with email addresses | High |
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