Archief - php: Help met security bug (beveiligde pagina als afbeelding)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Smoerf

Legacy Member
Code:
[url]http://www.teletet.org/post/reactieedit.php?RID=1000&PID=500&mode=delete[/url]
Die RID, PID en mode zijn GET variabelen. Als die binnenkomen op de pagina maak je gewoon het volgende:
PHP:
<?
if (isset($_POST['actie'])){
   if ($_POST['actie'] == "verwijderen"){
      //code uitvoeren voor verwijderen maar ipv $_GET['RID'] is het nu $_POST['RID'] omdat je bevestigd hebt met een formulier. 
   }else{
      echo "Sorry, maar dit is een onbekende actie.\n";
   }
}else{
?>
<html>
<head>
<title>
Teletet : Verwijderen van uw reactie?
</title>
</lhead>
<body>
<form name="delete_reply" action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="RID" value="<? echo $_GET['RID']; ?>" />
<input type="hidden" name="PID" value="<? echo $_GET['PID']; ?>" />
<input type="hidden" name="actie" value="verwijderen" />
Weet u zeker dat u deze post wil verwijderen?
<input type="submit" value="JA" />&nbsp;&nbsp;<input type="button" value="NEE" onclick="javascript:history.back()" />
</form>
<?
}//einde van de if
?>

Thans zoiets zou het dan moeten worden (ik weet wel niet of de code 100% juist is want het is nog morgen en ik heb ze rechtstreeks hier geplaatst.

Normaal zou je POST variabelen niet mogen kunnen "faken" wat je vroeger wel kon, maar dat moet je maar eens testen.

Succes!

servi

Legacy Member
dat is heel gemakkelijk te omzeilen, ik maak dan gewoon een formulier met post en ik verstuur dat formulier automatisch met javascript met document.formuliernaam.submit();

Smoerf

Legacy Member
Ja, maar dan moet je al een eigen php pagina maken die dat formulier verstuurt als je die pagina als prentje gebruikt. En anders kan je nog wel eens checken of de HTTP_REFERER wel klopt, maar dat kon je dan al ervoor eigenlijk ook al. Mjah, maar ik stel mezelf eigenlijk de vraag: "Wat in Godsnaam is de kans dat iemand je script als image gebruikt???"

Anders start je even een sessie op de pagina met het formulier voor de bevestiging en als je je formulier verstuurt check je die sessie en na het uitvoeren van het script beëindig je die sessie.

servi

Legacy Member
eventjes je code gebruiken om dit aan te passen :

<?
if (isset($_POST['actie'])){
if (
$_POST['actie'] == "verwijderen"){
//code uitvoeren voor verwijderen maar ipv $_GET['RID'] is het nu $_POST['RID'] omdat je bevestigd hebt met een formulier.
}else{
echo
"Sorry, maar dit is een onbekende actie.\n";
}
}else{
?>
<html>
<head>
<title>
Teletet : Verwijderen van uw reactie?
</title>
</head>
<script language="javascript">
<!--
document.delete_reply.submit();
//-->
</script>
<body>
<form name="delete_reply" action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="RID" value="<? echo $_GET['RID']; ?>" />
<input type="hidden" name="PID" value="<? echo $_GET['PID']; ?>" />
<input type="hidden" name="actie" value="verwijderen" />
Weet u zeker dat u deze post wil verwijderen?
<input type="submit" value="JA" />&nbsp;&nbsp;<input type="button" value="NEE" onclick="javascript:history.back()" />
</form>
<?
}//einde van de if
?>

en voila de gebruiker wordt niet eens om bevestiging gevraagd en het wordt toch verwijderd.

Smoerf

Legacy Member
Ja, maar jij hebt het bestand aangepast en moet het dus ook op een andere locatie opslaan hé
dus
PHP:
<? 
if ($_SERVER['HTTP_REFERER'] == "http://www.teletet.org/post/"){

if (isset($_POST['actie'])){ 
   if ($_POST['actie'] == "verwijderen"){ 
      //code uitvoeren voor verwijderen maar ipv $_GET['RID'] is het nu $_POST['RID'] omdat je bevestigd hebt met een formulier. 
   }else{ 
      echo "Sorry, maar dit is een onbekende actie.\n"; 
   } 
}else{ 
?> 
<html> 
<head> 
<title> 
Teletet : Verwijderen van uw reactie? 
</title> 
</lhead> 
<body> 
<form name="delete_reply" action="<? echo $_SERVER['PHP_SELF']; ?>" method="post"> 
<input type="hidden" name="RID" value="<? echo $_GET['RID']; ?>" /> 
<input type="hidden" name="PID" value="<? echo $_GET['PID']; ?>" /> 
<input type="hidden" name="actie" value="verwijderen" /> 
Weet u zeker dat u deze post wil verwijderen? 
<input type="submit" value="JA" />&nbsp;&nbsp;<input type="button" value="NEE" onclick="javascript:history.back()" /> 
</form> 
<? 
}//einde van de if 
}else{
  echo "U probeert om via een andere pagina deze reply te verwijderen!
  //eventueel ip loggen en wegschrijven in Database
}
?>

servi

Legacy Member
dan heb je referer nodig en blijkbaar geeft dat problemen met mensen die met proxy-servers surfen (ie : niet waterdicht )

Smoerf

Legacy Member
en met $_SERVER['REQUEST_URI'] ?

Alhoewel, als je je script dan krak hetzelfde noemt...
Het beste is nog altijd een sessie starten, maar als je dan de back knop gebruikt... :doh:


EDIT:
PHP:
<? 
if (isset($_POST['actie'])){ 
   if ($_POST['actie'] == "verwijderen"){ 
      //code om te controleren of de naam/pass kloppen
      //zo ja:
         //code uitvoeren voor verwijderen maar ipv $_GET['RID'] is het nu $_POST['RID'] omdat je bevestigd hebt met een formulier. 
      //zo nee:
         //fout weergeven
   }else{ 
      echo "Sorry, maar dit is een onbekende actie.\n"; 
   } 
}else{ 
?> 
<html> 
<head> 
<title> 
Teletet : Verwijderen van uw reactie? 
</title> 
</lhead> 
<body> 
<form name="delete_reply" action="<? echo $_SERVER['PHP_SELF']; ?>" method="post"> 
<input type="hidden" name="RID" value="<? echo $_GET['RID']; ?>" /> 
<input type="hidden" name="PID" value="<? echo $_GET['PID']; ?>" /> 
<input type="hidden" name="actie" value="verwijderen" /> 
Weet u zeker dat u deze post wil verwijderen? 
Naam:<input type="text" name="naam" value="" size="20" maxlength="32" /><br />
Pass:<input type="password" name="pass" value="" size="20" maxlength="32" /><br />
<input type="submit" value="JA" />&nbsp;&nbsp;<input type="button" value="NEE" onclick="javascript:history.back()" /> 
</form> 
<? 
}//einde van de if 
?>

Squealer

Legacy Member
kebbet nu al zo keer geprobeerd volgens /\quila zijn werkwijze, maar dan zonder cookies, zoals servi zei:

confirm pagina: records die een uur oud zijn verwijderen uit db; user id, random string, tijd in db steken;

klik op JA: confirm=1,random string en tijd meegeven in url naar verwerkingspagina

verwerkingspagina: check of user id, random string en tijd in db staan:
JA: deleten, posts aanpassen, whatever; Delete random string enz. uit db
NEE: error

klik op NEE: confirm=0,random string en tijd meegeven in url naar verwerkingspagina

verwerkingspagina: Delete random string enz. uit db


werkt goed opt eerste zicht, en is volgens mij niet te omzeilen.

Squealer

Legacy Member
killgore zei:
snap niet wrom je voor zoiets javascript nodig hebt hoor.

nee keb nie gezegd da ge daar javascript voor nodig hebt. Met javascript kunde mijn formulier omzeilen.....

Voorbeeld:

Peet maakt pagina met nagebouwd formulier (het formulier dat IK te zien zou krijgen moest IK mijn reactie/post willen wijzigen. Niemand anders kan dat te zien krijgen, omdat enkel de eigenaar van een bericht daar toegang heeft. Maar die peet kan gewoon als voorbeeld het formulier bezigen op een van ZIJN reactie/post edit pagina's. Hij moet dan enkel wat waarden aanpasen (reactie_id,...), zodat het formulier er exact hetzelfde zou uitzien als een van mijn reactie/post edit pagina's).

Peet vult het formulier in naar zijn goesting.

Peet zet in zijn body-tag onLoad="document.formname.submit();"

Peet geeft op een forum als avatar de url naar zijn nagemaakt formulier op. (Op pre phpBB 2.0.10 forum's is dit perfect mogelijk bijvoorbeeld, pas vanaf 2.0.10 worden enkel jpg/gif/... bestanden toegelaten).

Peet vraagt mij een bepaalde pagina te bekijken op dat forum (waar zijn avatar te zien is).

Mijn browser maakt request naar zijn formulier, (door die avatar op het forum).

Peet zijn formulier wordt automatisch gesubmit naar de pagina die voor de verwerking instaat op mijn site.

Aangezien IK die pagina, op de achtergrond, zonder dat ik het weet, bezoek, kloppen alle controles op user_id enzovoort.

Resultaat: mijn reactie of post wordt gedelete of aangepast naar Peet zijn goesting. En dat zonder dat ik er iets van weet. (enigste wat ik zie is een corrupte avatar)

DarkBone

Legacy Member
Kan toch nie zo moeilijk zijn om die code aan te passen zodat er WEL gechecked wordt of het wel degelijk om een image gaat?

Lijkt me de enige oplossing voorlopig.

Squealer

Legacy Member
DarkBone zei:
Kan toch nie zo moeilijk zijn om die code aan te passen zodat er WEL gechecked wordt of het wel degelijk om een image gaat?

ja da moede mij nie zeggen é, mijn site checkt dat, mijn forum is 2.0.10, dus das ok.

2e keer dak zet zeg: tzijn andere forums en sites die niet checken op jpg/gif/... die voor problemen kunnen zorgen bij mij bv

Ma kom: alles blijft marcheren, nog niemand die mij nen bug eeft komen melden, dus alles werkt en is bovendien 100% waterdicht :)

Thx to /\quila en servi :)

dJeez

Legacy Member
servi zei:
dan heb je referer nodig en blijkbaar geeft dat problemen met mensen die met proxy-servers surfen (ie : niet waterdicht )
Om maar te zwijgen over 't feit dat je een referrer header makkelijk kan faken : nooit beveiligen adhv HTTP_REFERER dus :p.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan