Blootgestelde .env-, .git- en back-upbestanden: zo lekken geheimen van websites
Sommige van de schadelijkste websitelekken ontstaan zonder enige hack. Een bestand dat nooit voor iedereen bedoeld was, staat in de webroot, de server stuurt het zonder morren naar iedereen die erom vraagt, en dat bestand bevat een databasewachtwoord, een API-sleutel of de volledige broncode van de site.
De 3 vaste verdachten zijn .env-bestanden met configuratiegeheimen, .git-mappen met de volledige geschiedenis van de repository, en back-upkopieën zoals site.zip, db.sql of config.php.bak. De OWASP Web Security Testing Guide noemt ze allemaal als typische bron van blootgestelde inloggegevens en broncode.
Met curl controleert u uw eigen site er in enkele minuten op.
Hoe deze bestanden zichtbaar worden
.env-bestanden. Veel frameworks lezen geheimen uit een.env-bestand in de projectmap. Is de document root van de webserver de projectmap in plaats van de submappublic, dan wordt het bestand geserveerd zoals elk ander bestand..git-mappen. Wie uitrolt doorgit cloneofgit pullrechtstreeks in de webroot uit te voeren, laat de map.gitnaast de site staan. Daarmee kan iemand de broncode en elke eerdere commit reconstrueren, inclusief geheimen die lang geleden "verwijderd" zijn.- Back-ups en dumps. Een snelle
zipvoor een update, eendb.sql-export voor een migratie, een editorkopie zoalsindex.php~ofconfig.php.old. OWASP merkt op dat een back-up van een script als platte tekst kan worden geserveerd in plaats van te worden uitgevoerd, waardoor de broncode zichtbaar wordt. - Restanten van tools.
phpinfo.php,.htpasswd,.DS_Store, Terraform-statebestanden en logbestanden duiken op dezelfde manier op.
De rode draad is bewerken of uitrollen rechtstreeks op de productieserver, zonder een stap die bepaalt wat in de webroot thuishoort.
Zo controleert u uw eigen site
Vraag de meest voorkomende paden op en kijk naar de statuscode en de grootte van elk antwoord:
for p in .env .git/HEAD .git/config backup.zip site.zip db.sql \
dump.sql config.php.bak wp-config.php.bak phpinfo.php .DS_Store; do
printf '%-22s ' "$p"
curl -s -o /dev/null -w '%{http_code} %{size_download}\n' "https://yourcompany.com/$p"
done
Wat de resultaten betekenen:
404of403voor elk pad is wat u wilt zien.200met echte inhoud is een bevinding. Bij.git/HEADziet echte inhoud eruit alsref: refs/heads/main. Bij.envziet u regels alsNAME=value.200met uw gewone startpagina of een eigen foutpagina is meestal een "soft 404". OWASP waarschuwt dat een treffer op zich nog geen bevinding is: open het antwoord en ga na wat het werkelijk bevat.
Herhaal de controle op elke hostnaam die u gebruikt, ook staging en oude subdomeinen. Daar overleven zulke bestanden het langst, zoals we beschrijven in ons artikel over vergeten staging- en testservers. Webarchieven kunnen bovendien kopieën bewaren van bestanden die vroeger zichtbaar waren, dus een bestand dat u net hebt verwijderd, kan al door anderen gezien zijn.
Is een geheim uitgelekt, vervang het dan eerst
Het bestand verwijderen stopt nieuwe downloads, maar u kunt niet weten wie het al heeft gekopieerd. Beschouw elk geheim in een blootgesteld bestand als gecompromitteerd:
- Vervang of trek in elk wachtwoord, elke API-sleutel en elk token uit het bestand. De richtlijn van GitHub over het verwijderen van gevoelige gegevens hanteert dezelfde volgorde: eerst het geheim intrekken of vervangen, daarna de geschiedenis opschonen.
- Verwijder het bestand van de server en uit elke back-upmap binnen de webroot.
- Bekijk de toegangslogs op verzoeken naar dat pad, zodat u weet of en wanneer het is gedownload.
- Ga na waar de sleutel bij kon: cloudconsoles, betaalproviders, maildiensten, en zoek naar activiteit die u niet kunt verklaren.
Zijn geheimen in een repository gecommit, dan helpt het herschrijven van de geschiedenis (GitHub raadt git-filter-repo aan) pas als het geheim zelf niet meer geldig is.
Zo voorkomt u het
- Laat de document root alleen naar de publieke map wijzen, nooit naar de projectroot.
- Rol build-artefacten uit, geen werkkopieën. Een CI-pipeline die alleen de bestanden kopieert die de site nodig heeft, houdt
.giten.enver per definitie buiten. - Blokkeer dotfiles op de webserver, zoals hieronder.
- Houd geheimen waar mogelijk buiten bestanden: gebruik de omgevingsvariabelen van uw platform of een secrets manager.
- Bewaar nooit back-ups of dumps in de webroot. OWASP raadt aan gegevens, logs en configuratiebestanden op te slaan waar de webserver ze niet kan serveren.
- Controleer opnieuw na elke wijziging in de infrastructuur, ook bij nieuwe servers achter een load balancer.
Dotfiles blokkeren (met behoud van /.well-known/, dat nodig is voor het vernieuwen van certificaten) ziet er in nginx zo uit:
location ~ /\.(?!well-known) {
deny all;
}
En zo in een Apache-siteconfiguratie:
RedirectMatch 404 /\.(?!well-known)
Korte checklist
- Voer de
curl-lus hierboven uit op elke hostnaam die u bezit. - Bevestig elke
200door de inhoud te lezen. - Vervang elk geheim dat ooit bereikbaar was.
- Blokkeer dotfiles en back-upextensies in de configuratie van de webserver.
- Laat uitrollen via een pipeline verlopen die alleen gebouwde bestanden levert.
Nu u toch in de serverconfiguratie zit, is het een goed moment om de HTTP security headers toe te voegen die elke zakelijke website hoort te sturen.
Hoe Datahorses helpt
Datahorses bewaakt uw website van buitenaf, zoals een aanvaller ernaar zou kijken, en signaleert blootgestelde .git-, .env-, back-up- en configuratiebestanden die webarchieven op uw domeinen hebben vastgelegd. We gaan uw systemen niet binnen en hebben geen toegang nodig; uw ontwikkelaar krijgt de precieze stappen om het bestand te verwijderen en te vervangen wat uitlekte. Bekijk hoe wij bewaken en waarom geen toegang nodig is.
Meer artikelen
Vergeten staging- en testservers: het deel waar niemand naar kijkt
Staging- en testservers zijn bedoeld als tijdelijk en overleven dan stilletjes het project. Zo vindt u de uwe en beslist u wat u houdt, beveiligt of uitzet.
Eisen van Outlook voor afzenders sinds mei 2025 en de weigering 550 5.7.515
Komt mail aan hotmail.com of outlook.com terug met 550 5.7.515, dan zegt Microsoft dat uw domein niet aan de authenticatieregels voldoet. Dit eisen ze en zo lost u het op.
Zo leest u een DMARC-aggregaatrapport (rua) en wat u ermee doet
DMARC-aggregaatrapporten tonen elke server die mail onder uw domein verstuurde en of die slaagde. Zo leest u de XML en maakt u er een lijst met verbeteringen van.