Instructeur: Laten we het hebben over hoe we
deze kwetsbaarheden nu kunnen voorkomen.
Ten eerste bestaan veel van deze kwetsbaarheden
vanwege de functionaliteit die ze bieden.
Bijvoorbeeld, het probleem met het uploaden
van bestanden, waarbij de gebruiker elke bestandsextensie
en elk bestandstype kan uploaden, dat
zou niet mogen gebeuren.
Misschien als je wilt dat ze een foto
uploaden, controleer dan de bestandstypen.
Als je verwacht dat ze een liedje uploaden, een MP# bestand, zorg
er dan voor dat het een mediabestand is, geen PHP
of een uitvoerbare code.
Normaal gesproken moet u gebruikers nooit
toestaan uitvoerbare bestanden te uploaden.
Met filters kan worden gecontroleerd
of het bestand dat wordt
geüpload een JPEG is of wat dan ook.
Maar dat is geen goede manier,
de beste manier is om het bestandstype te controleren en ervoor
te zorgen dat het bestandstype een afbeelding is, of een mediabestand, in plaats
van de extensie te controleren, want die
kan ook worden omzeild.
Het tweede type kwetsbaarheden dat we bekeken
waren de kwetsbaarheden voor code-uitvoering.
In deze exploits konden we elke gewenste code uitvoeren
op de doelcomputer.
Ook deze functionaliteit moet worden vermeden,
u moet voorkomen dat gebruikers enige vorm van code op uw server
kunnen uitvoeren.
Probeer al deze functies te vermijden,
zoals de var pass through, en
al deze functies waarmee een gebruiker code van het
besturingssysteem op de server kan uitvoeren.
Als je zoiets absoluut moest gebruiken, zorg
er dan voor dat je de invoer analyseert voordat je het uitvoert.
Bijvoorbeeld, in het voorbeeld dat we zagen
waar de code een ping deed en het zal alles pingen wat we in het
tekstvak zetten.
Dus ik zet hier /$textbox om te laten zien dat dit
de invoer is die we in het tekstvak stoppen.
Dit is hoe het programma er eigenlijk uitziet,
als het er te ingewikkeld uitziet, vergeet het, we
hebben het hier alleen over het concept.
Dus daar gaan we het hier over hebben.
Dus, zeg bijvoorbeeld dat je wat wij deden,
we zetten een normale IP, en dan
zetten we de puntkomma, en dan zetten we een commando dat
we wilden doen, dus bijvoorbeeld ls -la.
Het probleem hiermee is dat de webapplicatie
dit neemt zoals het is, het kopieert en het hier uitvoert.
Als je dit commando uitvoert,
doet het eerst de ping, en daarna de ls -la, het commando
dat we wilden.
Wat je moet doen is bijvoorbeeld, als je het moest doen, wat
ik adviseer is dat je deze functies gewoon niet gebruikt.
Als je een functie als deze moet gebruiken, dan moet
je controleren of de invoer is wat je verwacht, bijvoorbeeld,
je verwacht een IP-adres
en niets anders, dus je kunt regex gebruiken
om ervoor te zorgen, nu ga ik het niet hebben
over regex of wat regex is, regex is eigenlijk een regel die ervoor zorgt dat de invoer er als volgt
uitziet.
Dus het neemt een cijfer, cijfer
punt cijfer punt cijfer punt cijfer cijfer wat als ik
iets anders zet, dan moet de webapplicatie
het weigeren.
U kunt er ook voor zorgen dat er geen puntkomma's
en geen spaties zijn, zodat alles
als één ding binnenkomt en vervolgens wordt
uitgevoerd.
Nogmaals, dit is een manier om het veiliger te maken, maar
het beste is om deze functies gewoon te vermijden.
Het derde type kwetsbaarheid dat
we bekeken was de bestandsinsluiting en we
keken naar twee types.
De lokale bestandsopname,
waarmee we elk bestand op het systeem konden opnemen en
vervolgens bestanden konden
lezen, wat een kwetsbaarheid voor bestandsopenbaring veroorzaakt
en waarmee je elk bestand op de server zou kunnen lezen,
en vervolgens keken we naar de zeer gevaarlijke
bestandsopname op afstand,
waarmee we elk bestand van elke webserver konden opnemen, zodat
we PHP-shells konden opnemen en vervolgens verbinding konden krijgen
met de doelcomputer.
Om deze te voorkomen, zorgt u er allereerst
voor dat u de opname van bestanden op afstand verhindert.
Dus voor het geval er iets misgaat,
kunnen mensen geen bestanden van buiten uw server includen en u
kunt dat op dezelfde manier doen als we
het hebben ingeschakeld met
de PHP ini door de allow_url_fopen en allow_url-include
uit te schakelen.
En als we hier naar onze Metasploitable
gaan, zal ik je heel snel laten
zien, dus als we sudo nano doen, wat de teksteditor /etc/PHP/cgi/php
is. ini, hetzelfde bestand dat we
gebruikten, dit is het
bestand voor de PHP instellingen.
Als je dat bestand
opent, en nu doe ik Control +
W, en zoek naar allow_url.
En je moet ervoor zorgen dat
allow_url_fopen op Off staat
en allow_url_include ook op Off.
Control + X + Y en enter en dat slaat
het voor je op.
De andere manier om deze exploits
te voorkomen is het gebruik van statische bestandsopname,
dus in plaats van de dynamische bestandsopname
die we hebben gezien, kunt u de bestanden die u wilt opnemen hard
coderen in de code en ze niet krijgen
via GET of POST.
Bijvoorbeeld, wat er gebeurt in de voorbeelden die
we zien in de kwetsbaarheid is dat we een pagina
hebben genaamd page of index. php.
En dan deze index. php neemt een parameter genaamd pagina en
neemt dan een andere pagina,
bijvoorbeeld nieuws. php.
En het bevat dit nieuws. php in de code.
Hoe ziet de code eruit?
In de PHP code zie je iets als include.
Dus wat dit in principe
doet, en dat ziet er zo uit, geloof ik, wat dit
doet, omvat alles wat achter
de pagina-parameter komt.
Dus de code neemt dynamisch wat er binnenkomt na de pagina parameter
en neemt het op in de huidige pagina, dus dit komt
in de index. php pagina.
Oké, dit is erg slecht
want zelfs als het niet GET is, soms
gebruiken mensen POST
en in POST zie je dit niet dus
het wordt gepost, maar je kunt een proxy gebruiken
zoals Burp proxy en dit ziet
er dan zo uit en dan kun je
het aanpassen en het alles laten
bevatten wat je wilt en dan wordt het getoond op
de pagina.
Wat we eigenlijk willen is dat de gebruiker niet kan manipuleren
met wat er wordt opgenomen, dus als je een pagina
wilt opnemen die nieuws heet. php, gewoon hierin opnemen
zonder de gebruiker de mogelijkheid
te geven het te veranderen.
Ik weet dat je je code gaat programmeren
om het er zo uit te laten zien, maar de gebruikers, we weten, we hebben
gezien hoe gebruikers hiermee kunnen spelen
en er alles in kunnen stoppen wat ze willen.
De beste manier om het te doen is om het
gewoon op te nemen pagina. php zodat uw
code geen variabelen gebruikt.
Het is hard gecodeerd, het maakt je code misschien langer,
maar het is veel veiliger.