Skip to content

Information Disclosure

Bron: PortSwigger Web Security Academy
Auteur: Johan Beysen


1. Wat is Information Disclosure?

Information Disclosure (ook: information leakage) treedt op wanneer een applicatie onbedoeld gevoelige informatie blootstelt aan gebruikers.

Wat kan gelekt worden:

  • Technische details: software, versies, frameworks, interne paden
  • Broncode, configuratiebestanden, back-upbestanden
  • Gebruikersdata: e-mails, API keys, wachtwoorden, tokens
  • Interne infrastructuur: IP-adressen, hostnamen, netwerktopologie
  • Business logic en interne processen

Waarom gevaarlijk:

Informatielekken zijn op zich soms low-severity, maar ze vormen de basis voor verdere aanvallen. Een versienummer leidt naar een specifieke CVE. Een interne hostname maakt phishing geloofwaardiger. Een API key geeft directe toegang.

Impact is context-afhankelijk

Een gelekt e-mailadres van een admin is trivialer dan een gelekte database-connectiestring. Beoordeel altijd in combinatie met de verdere exploitatiemogelijkheden.


2. Detectie

Locatie Wat je zoekt
robots.txt / sitemap.xml Verborgen paden, admin endpoints
HTML broncode Developer comments, hardcoded paden of keys
HTTP response headers Server, X-Powered-By, X-Generator, versies
Foutmeldingen Stack traces, bestandspaden, SQL queries
JS bestanden API endpoints, tokens, interne logica
Backup- en tijdelijke bestanden .bak, .old, .swp, ~, _backup
Directorylijstingen Open directory browsing
.git / .svn blootstelling Volledige broncode herstelbaar
Debug parameters Verborgen debug-pagina's

Burp Suite

  • Burp Scanner markeert automatisch informatielekken in responses
  • Burp Engagement Tools → Find comments — zoekt developer comments in alle responses
  • Burp Content Discovery — ontdekt verborgen bestanden en mappen

3. HTTP Response Headers

Standaard onthullen veel webservers en frameworks hun identiteit in headers:

HTTP/1.1 200 OK
Server: Apache/2.4.51 (Ubuntu)
X-Powered-By: PHP/8.0.13
X-Generator: Drupal 9
X-AspNet-Version: 4.0.30319

Elke versie is potentieel een CVE-zoekopdracht.

curl -I https://target.com

Interessante headers:

Header Wat het onthult
Server Webserver + versie
X-Powered-By Backend taal/framework + versie
X-Generator CMS of framework
X-AspNet-Version .NET versie
X-Debug-Token Symfony Profiler token
Via Proxy / loadbalancer info
X-Forwarded-Server Interne hostname

4. Foutmeldingen & Stack Traces

Verbose foutmeldingen zijn een van de rijkste bronnen van informatielekken.

Wat stack traces onthullen

Internal Server Error

java.sql.SQLException: Table 'prod_db.users' doesn't exist
    at com.example.UserDAO.getUser(UserDAO.java:47)
    at com.example.UserServlet.doGet(UserServlet.java:23)
    ...

Uit deze fout haal je: - Databasenaam: prod_db - Tabelnaam: users - Taal: Java - Klassenamen en bestandspaden - Intern versienummer indien aanwezig

Foutmeldingen triggeren

Parameter manipulation:     id=abc  (integer verwacht)
Type mismatch:              date=not-a-date
Ontbrekende parameters:     verwijder verplichte velden
Boundary testing:           extreem lange strings, null bytes, speciale tekens
' (apostrof)
'' (dubbel apostrof)
1/0
SLEEP(5)
../../../etc/passwd
/invalid/path/that/doesnt/exist
?id=abc         (verwacht integer)
?date=foobar    (verwacht datum)
?page=-1        (verwacht positief getal)

Verschil tussen productie en development

Development-omgevingen tonen vaak volledige stack traces. Productie zou dat niet mogen doen — maar doet het regelmatig toch. Altijd testen.


5. Developer Comments in Broncode

<!-- TODO: remove hardcoded admin password before deployment -->
<!-- Admin login: admin / S3cur3P@ss -->
<!-- DEBUG: bypass auth with ?debug=true -->
<!-- Internal API: http://internal-api.corp.local/v2 -->
// Tijdelijk: auth check uitgeschakeld voor testing
// if (!isAuthenticated()) return 403;

const API_KEY = "sk-prod-abc123xyz";   // ← hardcoded key
const INTERNAL_HOST = "10.0.0.5:8080";

Zoekpatronen in Burp / browser:

TODO   FIXME   HACK   password   secret   key   token
admin  debug   test   internal   temp     old   backup

6. Debug Pagina's & Parameters

Sommige applicaties hebben debug-functionaliteit die in productie actief is gebleven:

?debug=true
?debug=1
?test=true
?dev=1
?verbose=true
?trace=true

Frameworks met bekende debug endpoints:

Framework Debug URL
Laravel /_ignition/health-check
Symfony /_profiler
Django Stack trace pagina bij DEBUG=True
Spring Boot /actuator, /actuator/env, /actuator/heapdump
Flask Werkzeug debugger op port 5000

Spring Boot Actuator

/actuator/env onthult alle omgevingsvariabelen — inclusief database-credentials en API keys. /actuator/heapdump geeft een volledige memory dump terug.


7. Backup- en Tijdelijke Bestanden

Teksteditors en deployment-scripts laten soms bestanden achter:

config.php.bak       config.php.old       config.php~
index.php.swp        .DS_Store            Thumbs.db
web.config.bak       .env.bak             database.yml.old
# Ffuf met backup-extensie wordlist
ffuf -u https://target.com/FUZZ -w backup-files.txt

# Handmatig testen op bekende bestanden
curl https://target.com/config.php.bak
curl https://target.com/.env.bak
curl https://target.com/index.php~

.DS_Store onthult een directorystructuur van de Mac-ontwikkelaar:

# Tool: ds_store_exp
python ds_store_exp.py https://target.com/.DS_Store

8. Directory Listing

Als de webserver directory listing heeft ingestaan, zijn mappen volledig doorbladerbaar:

Index of /uploads/
../
2024-01-15-backup.zip    2.3M
database-dump.sql        450K
internal-docs/
config-old.tar.gz        1.1M
# Controleer mappen zonder index.html
curl https://target.com/uploads/
curl https://target.com/backup/
curl https://target.com/files/

9. Versiebeheer Blootstelling (.git / .svn)

Als de .git map publiek toegankelijk is, kan de volledige broncode gereconstrueerd worden — inclusief commit history met verwijderde bestanden.

# Controleer of .git toegankelijk is
curl https://target.com/.git/HEAD
# Verwacht: ref: refs/heads/main

# Tool: git-dumper
git-dumper https://target.com/.git ./output

# Tool: gittools / GitHack
python GitHack.py https://target.com/.git/
# Na dumpen: commit history doorzoeken op gevoelige data
git log --all --oneline
git show <commit-hash>
git diff HEAD~1

Commit history

Verwijderde bestanden en gecleande commits zijn nog steeds aanwezig in de git-objectstore. Een hardcoded wachtwoord dat "al verwijderd" is, is vaak nog gewoon opvraagbaar.

# Zoek naar gevoelige strings in volledige git history
git log -p --all | grep -i "password\|secret\|key\|token"

10. Cheat Sheet

Prioriteitenlijst

Prioriteit Check Reden
1 .git exposure Volledige broncode + history
2 /actuator/env Credentials en config
3 Stack traces DB-namen, paden, versies
4 .env / .env.bak API keys, DB-credentials
5 robots.txt Verborgen paden
6 JS broncode Endpoints, tokens, logica
7 Response headers Versies voor CVE-lookup
8 Backup bestanden Configs, broncode
9 Directory listing Bestandsstructuur
10 HTML comments Credentials, debug info

Snelle checks bij elke assessment

# Headers
curl -I https://target.com

# Robots en sitemap
curl https://target.com/robots.txt
curl https://target.com/sitemap.xml

# Git blootstelling
curl https://target.com/.git/HEAD

# Env bestanden
curl https://target.com/.env
curl https://target.com/.env.bak
curl https://target.com/.env.local

# Spring Boot actuator
curl https://target.com/actuator
curl https://target.com/actuator/env

# Backup bestanden op bekende locaties
curl https://target.com/config.php.bak
curl https://target.com/wp-config.php.bak

Interessante bestanden per technologie

config.php      wp-config.php     .env
config.php.bak  settings.php      database.php
application.properties    application.yml
/actuator/env             /actuator/heapdump
/WEB-INF/web.xml
settings.py     .env     local_settings.py
requirements.txt         manage.py
.env            package.json      config.js
.env.local      .env.production   app.js