Tyvens liste
Hver dag spørger programmer Pyssly efter filer, vi aldrig har haft: adgangskoder, kildekode og sikkerhedskopier. Her er listen, hvor mange gange de har spurgt, hvorfor tyven vil have filerne, og hvordan du beskytter dit eget website.

Hvem er tyven?
Tyven er som regel ikke et menneske, der sidder og leder. Det er et program, der går fra website til website med den samme liste og spørger efter hver eneste fil.
Hvis et website svarer med filen, har tyven fået nøglen uden at bryde noget op. Pyssly har ingen af filerne, så tyven får en falsk side, og vi tæller spørgsmålet.
Har du en hjemmeside, et website eller en server: sørg for, at de her filer ikke kan hentes. Nederst står det, hvordan du tjekker.
Mest eftersøgt
Så mange gange har robotter spurgt Pyssly efter filerne.
Tæller …
Adgangskoder og nøgler
Den største skat: én enkelt fil med alt, der låser websitet op.
/.envTæller …Hvad er det? En lille tekstfil, hvor mange websites gemmer deres hemmeligheder: adgangskoden til databasen, nøgler til betalingstjenester og e-mail og den nøgle, der holder logins sikre. Også varianter som .env.production og env.js.
Hvorfor vil tyven have den? Med den kan tyven logge ind i databasen, sende e-mail i websitets navn eller bruge websitets konti hos andre tjenester.
/config.jsonTæller …Hvad er det? Indstillingsfiler: config.json, settings.py, web.config, docker-compose.yml, appsettings.json, credentials.json, en skykontos service-account.json og Terraforms terraform.tfvars.
Hvorfor vil tyven have den? De har ofte de samme hemmeligheder som .env, og desuden hvor databasen og serverne ligger. En service-account.json eller en tfvars-fil kan give hele skykontoen.
/id_rsaTæller …Hvad er det? En SSH-nøgle: den hemmelige halvdel af den nøgle, der lader nogen logge ind på en server uden adgangskode.
Hvorfor vil tyven have den? Den, der har filen, kan ofte logge direkte ind på serveren, ligesom ejeren selv.
/.htaccessTæller …Hvad er det? Andre filer, hvis navn starter med punktum, som .htaccess, .htpasswd, .DS_Store og .bash_history. Punktummet betyder skjult på computeren, men ikke på nettet.
Hvorfor vil tyven have den? De viser, hvordan serveren er sat op, og hvilke filer der findes, og nogle gange adgangskoder (.htpasswd) eller kommandoer, nogen har skrevet.
Sådan beskytter du dig
- Læg aldrig hemmeligheder i den mappe, som webserveren viser frem. Læs dem i stedet fra miljøvariabler eller en hemmelighedstjeneste (secrets i Kubernetes, GitHub Actions eller skyen).
- Spær alle filer og mapper, der starter med punktum, i webserveren, undtagen /.well-known/. Hvordan, står længere nede.
- Læg aldrig en privat nøgle i webmappen, og hold dine egne loginnøgler for dig selv, beskyttet med en adgangsfrase.
Kildekoden
Hele websitets kode, med hver eneste ændring, der nogensinde er lavet.
/.git/Tæller …Hvad er det? Mappen, hvor Git gemmer et projekts hele historie. Ligger den på serveren, kan hvem som helst hente al koden, fil for fil.
Hvorfor vil tyven have den? I koden leder tyven efter adgangskoder, som nogen engang har lagt ind og siden fjernet (de findes stadig i historikken), og efter fejl at udnytte.
/.svn/Tæller …Hvad er det? Det samme for ældre versionsstyringsprogrammer: Subversion (.svn), Mercurial (.hg), Bazaar og CVS.
Hvorfor vil tyven have den? Præcis som med .git: kildekode og gamle hemmeligheder.
Sådan beskytter du dig
- Upload aldrig .git-mappen. Byg websitet og send kun det byggede, eller hold mappen ude med en .dockerignore.
- Spær punktum-mapper i webserveren som en ekstra sikring.
- Har en adgangskode nogensinde ligget i koden: skift den. Det er ikke nok at fjerne den i en ny ændring, for den findes stadig i historikken.
Databaser og sikkerhedskopier
Kopier, som nogen lagde på serveren for en stund og så glemte.
*.sqlTæller …Hvad er det? Et databasedump: hele databasen som én fil, for eksempel backup.sql eller db.sql.gz.
Hvorfor vil tyven have den? Dér står alt, websitet ved: brugere, e-mailadresser, adgangskoder (forhåbentlig hashede) og bestillinger. Et datalæk på én gang.
*.bakTæller …Hvad er det? Sikkerhedskopier og gamle versioner: .bak, .old, .orig, .swp og arkiver som site.zip eller backup.tar.gz.
Hvorfor vil tyven have den? En wp-config.php.bak vises som tekst i stedet for at blive kørt, så adgangskoderne står der i klartekst. Et zip-arkiv kan være hele websitet.
Sådan beskytter du dig
- Gem sikkerhedskopier uden for webmappen, helst på en anden maskine.
- Spær .sql, .bak, .zip og lignende i webserveren.
- Redigér ikke filer direkte på serveren: editorer efterlader kopier som .swp og ~.
WordPress
WordPress driver en stor del af nettet, så tyven prøver altid dets døre, også hos websites uden WordPress, som Pyssly.
/wp-login.phpTæller …Hvad er det? WordPress' loginside.
Hvorfor vil tyven have den? Tyven prøver almindelige brugernavne og adgangskoder igen og igen i håb om, at noget passer.
/wp-admin/Tæller …Hvad er det? Mappen til WordPress' adminpanel, med installationssiden i.
Hvorfor vil tyven have den? En halvfærdig installation kan tyven gøre færdig selv og blive admin. Ellers er det den samme dør som loginsiden.
/xmlrpc.phpTæller …Hvad er det? En gammel grænseflade i WordPress til at udgive fra andre programmer.
Hvorfor vil tyven have den? I gamle versioner kunne tyven prøve hundredvis af adgangskoder i ét eneste kald. Den er stadig en dør til at gætte adgangskoder, og pingbacks kan få websitet til at sende trafik mod andre websites.
/wp-content/Tæller …Hvad er det? Mappen med tilføjelser, temaer og uploadede filer.
Hvorfor vil tyven have den? Tyven leder efter gamle tilføjelser med kendte sikkerhedshuller og efter sikkerhedskopier, som tilføjelser har lagt dér.
/wp-includes/Tæller …Hvad er det? WordPress' egne programfiler.
Hvorfor vil tyven have den? De viser, hvilken version websitet kører, og dermed hvilke kendte huller der kan være.
/wp-json/Tæller …Hvad er det? WordPress' REST-grænseflade.
Hvorfor vil tyven have den? Den kan vise websitets brugernavne, så tyven ved, hvilke konti det er værd at prøve adgangskoder på.
/wp-config.phpTæller …Hvad er det? WordPress' indstillingsfil, med databasens adgangskode og websitets hemmelige nøgler.
Hvorfor vil tyven have den? Kører PHP, som det skal, ser ingen indholdet, men en kopi (wp-config.php.bak, wp-config.php~) eller en brudt server viser det hele.
Sådan beskytter du dig
- Opdatér WordPress, temaer og tilføjelser, og fjern tilføjelser, du ikke bruger.
- Slå totrinslogin til, og luk xmlrpc.php, hvis du ikke har brug for den.
- WordPress leder også efter wp-config.php én mappe over installationen. Flyt den kun derhen, hvis den mappe ikke selv vises på nettet, og efterlad aldrig kopier af filen.
Databaseværktøjer
Programmer, der lader en styre databasen fra en webside.
/phpmyadmin/Tæller …Hvad er det? phpMyAdmin, et almindeligt værktøj til at styre MySQL-databaser i browseren.
Hvorfor vil tyven have den? Finder tyven det, prøver den adgangskoder eller kendte huller i gamle versioner. Kommer den ind, har den hele databasen.
/adminer.phpTæller …Hvad er det? Adminer, et lignende værktøj i én enkelt fil, som ofte lægges op for en stund og glemmes.
Hvorfor vil tyven have den? Det samme som phpMyAdmin: et login lige ind i databasen.
Sådan beskytter du dig
- Læg ikke databaseværktøjer på det offentlige website. Kør dem på din egen computer, og nå databasen gennem en SSH-tunnel eller et VPN.
- Skal de være der: lås dem bag et ekstra login eller en liste med tilladte adresser.
Fejlsøgningssider
Sider, som udviklere bruger til at kigge ind i et website, mens det kører. Gode på din egen computer, farlige på nettet.
/phpinfo.phpTæller …Hvad er det? En side, der viser alle PHP's indstillinger, også miljøvariablerne.
Hvorfor vil tyven have den? Dér står ofte adgangskoder og nøgler, stier og præcise versioner: et kort over serveren.
/vendor/phpunit/Tæller …Hvad er det? Et testværktøj til PHP, der nogle gange følger med op på serveren i mappen vendor.
Hvorfor vil tyven have den? Gamle versioner har et hul, der lader hvem som helst køre egen kode på serveren.
/actuator/Tæller …Hvad er det? Spring Boots driftssider til Java-apps.
Hvorfor vil tyven have den? Nogle af dem viser miljøvariabler, indstillinger eller et hukommelsesdump med adgangskoder i.
/server-statusTæller …Hvad er det? Apaches statusside, som viser, hvad serveren laver lige nu.
Hvorfor vil tyven have den? Den viser, hvilke adresser alle besøgende spørger efter, nogle gange med hemmelige links og nøgler i.
/_ignition/Tæller …Hvad er det? Ignition, fejlsøgningssiden i Laravel.
Hvorfor vil tyven have den? Gamle versioner har et hul, der lader tyven køre egen kode, og en fejlside viser ofte indstillingerne.
/_profiler/Tæller …Hvad er det? Symfonys profiler, som gemmer hvert kald med alt, der var i det.
Hvorfor vil tyven have den? Den viser logins, sessioner og indstillinger for hvert besøg, også andres.
Sådan beskytter du dig
- Kør aldrig et website i fejlsøgningstilstand på nettet: APP_DEBUG=false, og intet udviklingsmiljø i drift.
- Fjern phpinfo-filer og testværktøjer, før websitet går live (composer install --no-dev).
- Lås driftssider som Actuator og server-status til din egen adresse eller et internt netværk.
Gamle døre
Programmer og sider, som serveren kører, når nogen spørger efter dem.
/cgi-bin/Tæller …Hvad er det? En mappe til gamle scripts, som serveren kører, ofte i Perl eller shell.
Hvorfor vil tyven have den? Gamle scripts har kendte huller, som Shellshock, der lader tyven køre kommandoer på serveren.
/boaform/Tæller …Hvad er det? Indstillingssider på routere og kameraer (boaform, HNAP1).
Hvorfor vil tyven have den? Tyven leder efter apparater at overtage med gamle huller eller fabrikkens adgangskode for at bruge dem i et botnet.
*.phpTæller …Hvad er det? Hvilken som helst PHP-fil, for eksempel shell.php eller en fil med et mærkeligt navn.
Hvorfor vil tyven have den? Ofte leder tyven efter en bagdør (en webshell), som en anden allerede har lagt på websitet, for at overtage det.
*.aspTæller …Hvad er det? Programmer i andre sprog, som serveren kører: .asp, .aspx, .jsp og .cgi.
Hvorfor vil tyven have den? Det samme som med PHP: kendte huller i gamle sider eller en bagdør, der allerede findes.
Sådan beskytter du dig
- Fjern alt, serveren ikke behøver at køre: gamle scripts, testsider og mapper som cgi-bin.
- Skift fabrikkens adgangskode på routere og kameraer, opdatér dem, og vis aldrig deres indstillingssider mod internettet.
- Lad kun det køre, der skal køre: en uploadet fil må aldrig kunne køre som kode.
Butikker og phishingsider
To former for søgning, der ikke er et indbrud med det samme, men tæt på.
/cart.jsTæller …Hvad er det? Filer, som hver Shopify-butik har, som cart.js og products.json.
Hvorfor vil tyven have den? Med dem finder programmet butikker og aflæser varer og priser, ofte for at kopiere dem til falske butikker.
/lander/Tæller …Hvad er det? Rester af en phishing-pakke: landingssider og scripts, der efterligner en bank eller et pakkebud.
Hvorfor vil tyven have den? Den, der spørger, leder efter websites, hvor nogen allerede har lagt sådan en pakke: hackede websites, der kan bruges igen.
Sådan beskytter du dig
- Det, en butik viser for alle, kan alle læse. Læg intet hemmeligt i varer eller produktfelter.
- Ser du en mappe eller fil, du ikke kender, på din server, som lander/: nogen kan være brudt ind. Fjern den, skift alle adgangskoder, og opdatér alt.
Spær i webserveren
Den bedste beskyttelse er, at filerne aldrig findes på serveren. Spærringerne her er en ekstra sikring, hvis noget alligevel havner dér.
Alle lader /.well-known/ stå åben, for den skal bruges til for eksempel certifikater. Prøv på et testwebsite først.
# First in the server block: nginx takes the first regex location that matches,
# and a location ^~ (such as /static/) skips them, so repeat these inside it.
# Dotfiles (.env, .git, .htaccess) at any depth, but not /.well-known/
location ~ /\.(?!well-known/) {
return 404;
}
# Databases, backups and old copies
location ~* \.(sql|bak|old|orig|swp|zip|tar|gz|7z)$ {
return 404;
}# Dotfiles (.env, .git, .htaccess) at any depth, but not /.well-known/
RedirectMatch 404 "/\.(?!well-known/)"
# Databases, backups and old copies
<FilesMatch "\.(sql|bak|old|orig|swp|zip|tar|gz|7z)$">
Require all denied
</FilesMatch># Dotfiles (.env, .git, .htaccess) at any depth, but not /.well-known/
@hidden {
path_regexp /\.
not path_regexp ^/\.well-known/([^./][^/]*/?)*$
}
respond @hidden 404
# Databases, backups and old copies, /.well-known/ included
@copies path_regexp \.(sql|bak|old|orig|swp|zip|tar|gz|7z)$
respond @copies 404**/.git
**/.env*
**/*.sql
**/*.bak
**/*.zip
**/id_*
**/*.tfvarsSådan tjekker du
Fem minutter i en terminal. Skift example.com ud med din egen adresse.
Tjek kun dit eget website. At lede efter andres filer er præcis det, tyven gør.
Spørg efter .env
curl -sS -i https://example.com/.envKig på både svaret og indholdet. 404 eller 403 er godt. Kommer dine indstillinger med, er filen offentlig. (Svarer websitet 200 på alt, som mange apps gør, skal indholdet være din almindelige side.)
Spørg efter .git
curl -sS -i https://example.com/.git/HEADSer du en linje som ref: refs/heads/main, ligger hele kildekoden ude. En fejlside eller din almindelige side er godt.
Prøv under andre mapper
curl -sS -i https://example.com/static/.envEn spærring kan mangle i mapper, der vises direkte, som /static/ eller /assets/. Prøv der, og prøv flere filer fra listen, som en .sql eller en gammel kopi af en indstillingsfil. Det, der tæller, er om indholdet kan ses.
Kig i loggen
grep -E '\.env|\.git/|wp-login|phpinfo|\.sql' /var/log/nginx/access.logSpørgsmålene kommer hver dag, så det er ikke mærkeligt, at de kan ses. Et 200 i loggen beviser ikke et læk, for mange apps svarer 200 med deres almindelige side. Ser du 200 på .env eller .git/HEAD, så hent adressen som ovenfor og kig på indholdet.
Hvis en fil kom frem
- Fjern filen, og spær adressen.
- Skift hver adgangskode og nøgle, der stod i den: databasen, e-mailen, betalingstjenester og skykontoen. Gå ud fra, at tyven allerede har dem.
- Kig i loggen efter, hvem der hentede filen, og om der er sket noget med kontoerne siden.
Mere om tyve og andre slags robotter i Sådan virker robotterne.