Kort gezegd: Een PHP-bestand in de uploadmap is een ernstig waarschuwingssignaal, want daar horen alleen afbeeldingen en documenten te staan. Open het bestand nooit in de browser, maar lees het als tekst, controleer tijdstempel en eigenaar en zoek de bestandsnaam in de toegangslogs. Onschuldig zijn meestal alleen lege plaatshouders zoals een index.php zonder inhoud; al het andere behandelt u als mogelijke inbraak.
Waarom PHP in de uploadmap niets te zoeken heeft
Uploadmappen zijn bedoeld voor inhoud die bezoekers of redacteuren uploaden: afbeeldingen, pdf's, video's. De webservergebruiker mag daar schrijven, anders werken uploads niet. Juist dat maakt deze mappen aantrekkelijk voor aanvallers. Wie via een lek bestanden kan schrijven, plaatst ze waar schrijven is toegestaan.
Nieuwe PHP-bestanden in upload- of cachemappen behoren volgens de ons beschikbare berichten tot de algemene waarschuwingssignalen na een inbraak. Voor PHP2Shell bestaan geen bevestigde Indicators of Compromise; een vondst zegt dus niets over via welk lek het bestand kwam. Hoe uploadfuncties veilig worden gebouwd, beschrijft Bestandsuploads in PHP veilig implementeren.
Of zo'n bestand schade kan aanrichten, bepaalt de configuratie van de webserver. Voert hij PHP-bestanden in de uploadmap uit, dan wordt elk daar geplaatst bestand een mogelijke afstandsbediening. Is de uitvoering daar geblokkeerd, dan blijft het bestand een vreemd element, maar aanvankelijk zonder werking. Veel installaties hebben deze blokkade nooit ingesteld.
Hoe komt een PHP-bestand in de uploadmap?
Voor de beoordeling helpt het de mogelijke wegen te kennen. Elke leidt tot andere vervolgvragen.
| Weg | Typische achtergrond | Vervolgvraag |
|---|---|---|
| Onveilig uploadformulier | Controle alleen van de extensie of het door de browser gemelde type | Welke formulieren accepteren bestanden? |
| Lek in een plug-in of thema | bekende kwetsbaarheid in een verouderde extensie | Welke extensies zijn verouderd? |
| Gestolen toegangsgegevens | beheerders-, FTP- of hostingaccount | Welke aanmeldingen waren er recent? |
| Code-uitvoering via een lek | bijvoorbeeld in de interpreter, zoals bij PHP2Shell mogelijk | Was PHP in die periode kwetsbaar? |
| Legitieme plug-in | plaatshouder, zelden cachebestanden | Hoort het bestand bij het oorspronkelijke pakket? |
Meerdere wegen kunnen samenkomen. Een aanvaller die via een lek code uitvoert, plaatst het bestand misschien alleen om later gemakkelijker terug te keren.
Vindplaatsen systematisch opsommen
Voordat u een afzonderlijk bestand beoordeelt, verschaft u zich een overzicht. De opdrachten lezen alleen. Paden zijn voorbeelden voor WordPress; bij andere systemen past u het uploadpad aan.
# PHP-achtige bestanden in de uploadmap met grootte, eigenaar, mtime en ctime
find /var/www/html/wp-content/uploads -type f \
\( -iname "*.php*" -o -iname "*.phtml" -o -iname "*.phar" -o -iname ".htaccess" -o -iname ".user.ini" \) \
-printf '%s Bytes %u m:%T+ c:%C+ %p\n'
# Bestandstype bepalen op basis van inhoud in plaats van extensie (afbeeldingen met PHP-inhoud vallen op)
find /var/www/html/wp-content/uploads -type f -newermt "2026-10-17" -exec file {} + | grep -viE "image|pdf|video|audio"
Andere systemen gebruiken andere schrijfmappen, zoals fileadmin bij TYPO3, images bij Joomla of de mediamap onder public bij Shopware 6. Daarbij komen cache- en temp-mappen van de toepassing. Bij multisite-installaties en meerdere websites op één server zijn er overeenkomstig veel uploadmappen; elk daarvan hoort in de zoekopdracht.
Ook .htaccess- en .user.ini-bestanden in de uploadmap zijn verdacht. Daarmee kan de uitvoering van PHP in deze map weer worden ingeschakeld of de configuratie worden gewijzigd.
PHP-bestand in de uploadmap: de vondst juist duiden
Niet elke treffer is even ernstig. De volgende indeling helpt bij de eerste beoordeling. Ze vervangt geen nauwkeurig onderzoek.
| Bevinding | Eerste indeling |
|---|---|
index.php met nul bytes of alleen een opmerking |
meestal plaatshouder tegen maplijsten, met plug-in vergelijken |
| PHP-bestand met inhoud in een maandmap | hoge verdenking |
Dubbele extensie zoals bild.jpg.php of .php.png |
hoge verdenking, typische camouflage |
Afbeelding die volgens file PHP-code bevat |
hoge verdenking, kan via insluiting worden uitgevoerd |
.htaccess of .user.ini in de uploadmap |
verdenking, configuratie controleren |
| Bestand behoort aan de webservergebruiker, ctime na 17 oktober | past bij een inbraak via de website |
Lees verdachte bestanden alleen als tekst, bijvoorbeeld met head -c 2000 datei.php of less. Opvallend zijn zeer lange regels, gecodeerde tekenreeksen en functienamen zoals eval of base64_decode. Waaraan u versluierde code herkent, toont Versluierde PHP-code herkennen.
Is het bestand aangeroepen? Een blik in het log
De belangrijkste vraag na de vondst luidt: heeft iemand het bestand gebruikt? Het antwoord staat in de toegangslogs van de webserver. Zoek op de bestandsnaam, ook in gearchiveerde logs.
# Aanroepen van het verdachte bestand in actuele en ingepakte logs (naam als voorbeeld)
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* 2>/dev/null
zgrep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log*.gz 2>/dev/null
# Alleen geslaagde aanroepen met IP-adres en tijdstip
grep -h "uploads/2026/10/thumb.php" /var/log/nginx/access.log* | awk '$9 == 200 {print $1, $4, $6, $7}'
Veel geslaagde POST-verzoeken van enkele adressen wijzen op actief gebruik als webshell. Geen treffers betekent niet automatisch ontwarring, want logs kunnen geroteerd, gewist of onvolledig zijn. Draait de website achter een CDN of proxy, dan staan daar verdere logs; bij shared hosting stelt de hoster de toegangslogs meestal beschikbaar in het klantenpaneel. Let bovendien op verzoeken naar andere nieuwe bestanden vanaf dezelfde adressen, want die leiden vaak naar verdere onderdelen. Bewaar logs vanaf 20 oktober. Hoe u logs grondig analyseert, staat in de gids Webserverlogs na een aanval analyseren.
Toont het log geslaagde aanroepen van een onbekend PHP-bestand, ga dan uit van een inbraak. Stel bestand en logs veilig, beperk de toegang tot de server en controleer of persoonsgegevens getroffen kunnen zijn.
Na de beoordeling: de juiste volgorde
- Veiligstellen: Bestand met controlesom en tijdstempels kopiëren, logs veiligstellen.
- Herkomst vaststellen: Uploadformulieren, plug-ins en de periode vóór de vondst controleren.
- Verdere onderdelen zoeken: extra bestanden, cronjobs, nieuwe beheerdersaccounts.
- Uitvoering blokkeren: PHP in de uploadmap op webserverniveau verbieden, zoals beschreven in het artikel PHP-uitvoering in uploadmappen verbieden.
- Opschonen en toegangen wijzigen: pas dan het bestand verwijderen en alle wachtwoorden vernieuwen.
Hoe helpt PHP SOS concreet?
- Vondst beoordelen: Wij controleren het bestand zonder het uit te voeren en plaatsen het.
- Gebruik vaststellen: Wij analyseren de logs en reconstrueren wie het bestand wanneer heeft aangeroepen.
- Volledig opschonen: Met de malwareverwijdering zoeken wij alle onderdelen, dichten wij de oorzaak en wijzigen wij de toegangen.
- Herhaling voorkomen: Wij blokkeren de PHP-uitvoering in schrijfmappen en bewaken nieuwe bestanden.
Veelgestelde vragen
Is elk PHP-bestand in de uploadmap gevaarlijk?
Niet elk. Sommige plug-ins plaatsen een leeg index.php zodat de mapinhoud niet wordt getoond. Al het andere, vooral bestanden met inhoud, ongewone naam of dubbele extensie, moet u als verdacht geval behandelen.
Mag ik het verdachte bestand in de browser openen?
Nee. Een aanroep via de website voert de code uit. Lees het bestand alleen als tekst op de server of in een kopie, bijvoorbeeld met less of head.
Hoe achterhaal ik of het bestand is gebruikt?
Zoek de bestandsnaam in de toegangslogs van de webserver. Verzoeken met status 200 en POST-methode tonen dat het bestand is aangeroepen. De bijbehorende IP-adressen en tijdstippen helpen bij het verdere onderzoek.
Volstaat het het bestand te wissen en PHP in de uploadmap te blokkeren?
Beide is nodig, maar niet voldoende. Stel bovendien vast hoe het bestand daar kwam, zoek naar verdere onderdelen en wijzig de toegangsgegevens. Anders komt de aanvaller langs dezelfde weg terug.