Gathering of Tweakers

Quicksearch
quote:
GuShe schreef op vrijdag 16 mei 2008 @ 17:46:
[...]


In de query staat:
code:
1
id=' . $id");

Nee, dat staat er dus niet. Ik las het verkeerd :P
quote:
.oisyn schreef op vrijdag 16 mei 2008 @ 17:48:
[...]

Nee, dat staat er dus niet. Ik las het verkeerd :P
Dan houd ik me er wel buiten voor de rest; ik blijk te veel onzin te verkopen. :X

' Knowledge Beats Power.

Ok, ik dan ook maar een
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

void eindFunctie()
{
    puts("doei!\n");
}

void eindFunctieVoorOisyn()
{
    puts("dag, oppergod!\n");
}

int main()
{
    char naam[256];
    void (*eindFunctiePtr)() = eindFunctie;

    puts("Geef je naam: ");
    gets(naam);
    if (!strcmp(naam".oisyn"))
        eindFunctiePtr = eindFunctieVoorOisyn;

    printf("Hallo, %s!\n"naam);

    eindFunctiePtr();
}

Heeft nu een APNG icon

Als je een naam invoert met meer dan 256 tekens heb je de mogelijkheid om kwaadaardige code uit te voeren (in MS termen).

Heb nu een Animated PNG icon. Werkt in alle moderne browsers (Firefox en Opera).

Es un Gringo!
Berichten: 490
Reg. datum: 07 november 2000

zou het zijn dat als je bij het vragen van de naam wat meer info intypt als 256 characters je de eindfunctiepointer over kunt schvrijven (vooral omdat je gets gebruikt) en wellicht 'eigengekozen' code kunt uitvoeren?
quote:
Sebazzz schreef op vrijdag 16 mei 2008 @ 18:03:
Als je een naam invoert met meer dan 256 tekens heb je de mogelijkheid om kwaadaardige code uit te voeren (in MS termen).
hee, dat wou ik ook zeggen :D

elTigro wijzigde dit bericht 16-05-2008 18:05 (37%)

Lazlo's Chinese Relativity Axiom:No matter how great your triumphs or how tragic your defeats --approximately one billion Chinese couldn't care less.

Ja maar hoe, dat is de vraag :P. En dan heb ik het nog makkelijk gemaakt ;)

@elTigro: idd. Je zou kunnen denken aan een system("format c:"), door na de 256 bytes van de naam 4 bytes te gebruiken om de eindFunctie pointer naar system() te wijzen, daarna nog wat ruimte reserveren voor de referentie naar en de string "format c:" zelf. Of gewoon simpelweg wat assembly code waar je 'eindFunctiePtr' weer naar laat wijzen.

.oisyn wijzigde dit bericht 16-05-2008 18:12 (75%)

Es un Gringo!
Berichten: 490
Reg. datum: 07 november 2000

ja, ik ben daar niet zo'n held in, maar je moet dus weten waar bepaalde code zich in het geheugen bevindt, en het adres daarvan dus na die 256 chars plaatsen. wellicht, moet je even zelf een programmatje maken, dat zo'n stuk code alvast definieert, daar het adres even van onthouden, en dit adres vervolgens gebruiken als char[256 +] zeg maar.

juist, spuit '0xb' dus :)

/edit2:
ik was naar een recent voorbeeld van hier gebruikte code met 'gaatjes' aan het zoeken, maar ik kan het niet meer vinden.
Als iemand al een goed voorbeeld weet, voel je vrij het alvast te posten, ik moet namelijk nodig ervandoor :)

elTigro wijzigde dit bericht 16-05-2008 18:22 (28%)

Lazlo's Chinese Relativity Axiom:No matter how great your triumphs or how tragic your defeats --approximately one billion Chinese couldn't care less.

status
Berichten: 480
Reg. datum: 16 januari 2002

Dan doe ik ook een poging, onderstaande functie wordt geinclude & aangeroepen op iedere php pagina om te controleren of de gebruiker de pagina mag bekijken onder de huidige credentials.
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function authenticate$user$passwd )
{
    // pagina's waar geen authenticatie nodig is
    ifstrpos$PHP_SELF"index.php" ) !== 0 ) return;

    // pagina's waar wel authenticatie vereist voor is, 
    // dus controleer gebruikersnaam/wachtwoord combinatie
    if( !checkCredentials$user$passwd ) )
    {
        header"Location: /login.php" );
    }
}
?>

Bovenstaande code bevat 2 fouten.
 
quote:
xos schreef op vrijdag 16 mei 2008 @ 20:10:
Dan doe ik ook een poging, onderstaande functie wordt geinclude & aangeroepen op iedere php pagina om te controleren of de gebruiker de pagina mag bekijken onder de huidige credentials.
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function authenticate$user$passwd )
{
    // pagina's waar geen authenticatie nodig is
    ifstrpos$PHP_SELF"index.php" ) !== 0 ) return;

    // pagina's waar wel authenticatie vereist voor is, 
    // dus controleer gebruikersnaam/wachtwoord combinatie
    if( !checkCredentials$user$passwd ) )
    {
        header"Location: /login.php" );
    }
}
?>

Bovenstaande code bevat 2 fouten.
Sorry, maar ze zijn misschien wel een beetje simpel... $PHP_SELF bewijst al gelijk dat je register_globals verkeerd hebt ingesteld, en verder hoor je een check op !== false te doen bij strpos.

Dan hebben we het natuurlijk verder even helemaal niet over het feit dat zo'n security check als deze überhaupt best omslachtig is :P maar verder zie ik nou niet zo 123 wat hier dan erg exploitable aan zou moeten zijn zoals gedefinieerd in de TS

SchizoDuckie wijzigde dit bericht 16-05-2008 20:20 (5%)

left part of the evil twins

Hoezo 2?
• PHP_SELF is een member van de $_SERVER superglobal, geen variabele.
• PHP_SELF bevat het volledige pad naar het huidige script relatief ten opzichte van de document root. Dit zal dus voor http://www.bier.com/index.php in principe /index.php zijn. Omdat je niet op de slash checkt failt je self-test in regel 4.
• PHP_SELF schijnt nogal wat eigenaardigheden te hebben onder verschillende omgevingen waardoor je beter af bent met intelligentere logica.
• Na een header 'Location' dien je processing van het script te stoppen om de redirect in te zetten.
• Een location header dient volgens de HTTP-specificaties een volledig URL inclusief protocol en FQDN te bevatten.
quote:
SchizoDuckie schreef op vrijdag 16 mei 2008 @ 20:18:
[...]

maar verder zie ik nou niet zo 123 wat hier dan erg exploitable aan zou moeten zijn zoals gedefinieerd in de TS
Door het vergeten van de 'die' na het zetten van de location header wordt de rest van het script volledig uitgevoerd alvorens de redirect wordt ingezet. Hierdoor kun je dus postbacks uitvoeren die je niet zou mogen uitvoeren, of data zien die je niet zou mogen zien (moet je wel een custom browser hebben die 3xx responses negeert of telnetten).

curry684 wijzigde dit bericht 16-05-2008 20:23 (30%)


Acties: [view][quote]


Door: dusty Global Moderator
En natuurlijk kan je gewoon "http://host.tld/mysecuredpage.php?test=index.php" doen waardoor de security een true terug geeft aangezien het index.php heeft en dus niet specifiek controleert of deze persoon wel toegang heeft tot de betreffende "beveiligde" pagina.

Curlio.com Music News For You!
Y! Celebrate Life!

Lol, volgens mij ga ik echt veel leren van dit topic :)

Edit:
@dusty:
Nee toch, want PHP_SELF bevat toch alleen de scriptnaam, en niet de GET vars?

stereohead wijzigde dit bericht 16-05-2008 20:34 (46%)

 
Ik sluit me aan bij de bovenstaande, leuk spelletje, en door uitleg ook erg leerzaam :)
 
status
Berichten: 480
Reg. datum: 16 januari 2002

Idd regel 4 is niet correct en na regel 10 hoort het verzoek gestopt te worden. In opera kan je bv aangeven "automatisch omleiden" te willen negeren. Dus curry684 & dusty hebben het beide het juiste eind, doch moet het http://server/private.php/login.php worden :)

xos wijzigde dit bericht 16-05-2008 20:45 (39%)

 

Acties: [view][quote]


Door: dusty Global Moderator
Klopt, mijn fout (tijdje geleden geweest dat ik echt met PHP bezig ben geweest.) Als ik het goed heb is er wel ooit een bug geweest in PHP_SELF waardoor je meer dan alleen de scriptnaam in die string kon krijgen..

edit:

Ah, afhangend van je webserver kan je http://domein.tld/secured.php/index.php?blaat doen.. de secured.php wordt uitgevoerd, en $PHP_SELF kan dan wel eens de "/secured.php/index.php" weergeven..

dusty wijzigde dit bericht 16-05-2008 20:49 (33%)

Curlio.com Music News For You!
Y! Celebrate Life!

Jouw kleur (IP: R.G.B.void)

Afgezien van de hierboven genoemde punten, als deze check overal wordt uitgevoerd, heb je een oneindige loop zodra je login.php benaderd. (of een willekeurige pagina zonder index.php in de naam, terwijl je niet ingelogd bent)
Het is lastig om zonder langere stukjes code toch kwetsbaarheden in te bouwen die niet gelijk zichtbaar zijn. Hier een scriptje om te voorkomen dat eenmaal sniffen volstaat om iemands wachtwoord af te pakken: js is ongetest
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
define('PASSWORD''henkpwnz');
session_start();

if(isset($_GET['login'])) {
    if(isset($_POST['password']) && $_SESSION['validlogin'] == $_POST['password']) {
        // glory
    } else {
        die('Henk gaat jou opeten!');
    }
else {
    $hash = md5microtime() . rand(1,10000) );
    $_SESSION['validlogin'] = md5($hash . PASSWORD);

    echo '<script language="JavaScript" src="js/md5.js">
        <form method="post" action="'
 . $_SERVER['PHP_SELF'] . '?login" onSubmit="javascript:password.value=md5(' . $hash . ' + password.value )">
        <input type="password" name="password">
        <input type="submit" value="ogog!">
        </form>'
;
}
?>

jij ook?

Jouw kleur (IP: R.G.B.void)

quote:
GlowMouse schreef op vrijdag 16 mei 2008 @ 21:15:
Het is lastig om zonder langere stukjes code toch kwetsbaarheden in te bouwen die niet gelijk zichtbaar zijn. Hier een scriptje om te voorkomen dat eenmaal sniffen volstaat om iemands wachtwoord af te pakken: js is ongetest
PHP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
define('PASSWORD''henkpwnz');
session_start();

if(isset($_GET['login'])) {
    if(isset($_POST['password']) && $_SESSION['validlogin'] == $_POST['password']) {
        // glory
    } else {
        die('Henk gaat jou opeten!');
    }
else {
    $hash = md5microtime() . rand(1,10000) );
    $_SESSION['validlogin'] = md5($hash . PASSWORD);

    echo '<script language="JavaScript" src="js/md5.js">
        <form method="post" action="'
 . $_SERVER['PHP_SELF'] . '?login" onSubmit="javascript:password.value=md5(' . $hash . ' + password.value )">
        <input type="password" name="password">
        <input type="submit" value="ogog!">
        </form>'
;
}
?>

Direct een post sturen (vanaf lokale pagina bijvoorbeeld) voordat een sessie gestart wordt. Op die manier is $_SESSION['validlogin'] undefined. Dit wordt bij de vergelijking gezien als een lege string.

De $_POST['password'] een lege string laten zijn is ook niet zo moeilijk.

// Ik ben bezig met iets in elkaar te zetten, mocht iemand anders een leuk stukje hebben, plaats die dan gerust.

EdwinG wijzigde dit bericht 16-05-2008 21:33 (4%)

quote:
EdwinG schreef op vrijdag 16 mei 2008 @ 21:30:
[...]

Direct een post sturen (vanaf lokale pagina bijvoorbeeld) voordat een sessie gestart wordt. Op die manier is $_SESSION['validlogin'] undefined. Dit wordt bij de vergelijking gezien als een lege string.

De $_POST['password'] een lege string laten zijn is ook niet zo moeilijk.
Correct! Volgende?

jij ook?

Nentindo Community

Je zou password moeten overschrijven ipv. de hash erbij vermelden. Overigens is language="JavaScript" niet de manier maar zou je type="text/javascript" moeten gebruiken.

edit: gewoon niet goed zitten kijken, dat was em niet en tevens is het goede antwoord al gepost =)

Nieuwe:
PHP:

1
2
3
4
5
6
7
<?php
$strSql = '
    INSERT INTO
        video
    SET
        filename = "'
 . $strFilename . '",
        hash = "'
 . sha1(time()) . '"
    '
;
?>

Lijkt me niet al te moeilijk wat hier verkeerd kan gaan maar toch zie ik collega's t weleens doen :X

Cartman! wijzigde dit bericht 16-05-2008 21:34 (10%)

 
Oke, na nog wat overpeinzingen :P

• Bij een insert doe je naar mijn weten geen set maar (.<fields>.) VALUES ( .<values>. ) (Of is dit weer een of ander vaag SQL dialect? )
• Is HASH() niet toevallig een interne mysql functie? ( backticks )
• Never trust user input, ik hoop dan ook dat een addslashes of escape oid al over je vars zit.

en $strThis, $strThat is ook best loos in een loose typed taal :P

SchizoDuckie wijzigde dit bericht 16-05-2008 23:16 (141%)

Jouw kleur (IP: R.G.B.void)

Eigenlijk wordt bij de bovengenoemde code helemaal niets uitgevoerd richting DB, addslashes heb je dus ook niet nodig. (sowieso zijn er betere alternatieven voor addslashes)
Volgende puzzel dan maar
PHP:

1
2
3
4
5
6
7
8
<?php
$gevraagd = isset($_GET['bestand']) ? $_GET['bestand'] : '';
if ( $gevraagd != ''
  && !preg_match('#\.\.#'$gevraagd)
  && !preg_match('#^/#'$gevraagd)
  && !preg_match('#\.php#'$gevraagd) ) {
    foutloze_functie_voor_de_headers($gevraagd);
    readfile($gevraagd);
}
?>

Dit script is geplaatst in een directory waarvan de bestanden (en die in subdirectory's) door iedereen bekeken mogen worden.

EdwinG wijzigde dit bericht 16-05-2008 22:13 (35%)

Nentindo Community

SchizoDuckie : nee, dat is niet alles waar ik op doelde, denk verder... en $str in een loosetyped taal is juist erg handig. zo weet je toch nog wat het is achteraf.

EdwinG: nee slimmert, dat er geen db call wordt gedaan boeit in het voorbeeld niet, zie je me wel connecten dan?

Cartman! wijzigde dit bericht 16-05-2008 22:23 (32%)

 
quote:
EdwinG schreef op vrijdag 16 mei 2008 @ 22:03:
PHP:

1
2
3
<?php
...
    readfile($gevraagd);
...
?>

Dit script is geplaatst in een directory waarvan de bestanden (en die in subdirectory's) door iedereen bekeken mogen worden.
readfile() accepteert URLs wanneer url_fopen_wrappers aanstaat. Op die manier kun je file:///etc/passwd (bijvoorbeeld) opgeven en op die manier elke willekeurige file op het systeem uitlezen. Dit pas vanaf PHP5, in PHP4 kon dit nog niet.

Gerco wijzigde dit bericht 16-05-2008 22:26 (4%)

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!"
- Steun Mepukori, gebruik geen DRM!

Jouw kleur (IP: R.G.B.void)

quote:
Cartman! schreef op vrijdag 16 mei 2008 @ 22:20:
SchizoDuckie : nee, dat is niet alles waar ik op doelde, denk verder... en $str in een loosetyped taal is juist erg handig. zo weet je toch nog wat het is achteraf.

EdwinG: nee slimmert, dat er geen db call wordt gedaan boeit in het voorbeeld niet, zie je me wel connecten dan?
Ok, even serieus dan:
1: Persoonlijk zou ik de " en ' omwisselen
2: Ik hoop dat de hash kolom geen unieke waarde hoeft te hebben, dan zou twee gelijktijdige inserts problemen op gaan leveren
3: Inderdaad escapen van de filename


© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Asclepius

© 1998-2008 Tweakers.net BV - Based on React - Hosted by True - Served by Asclepius

[RSS][XML]

Update Tracker

Active Topics
Active Topics
Frontpage Nieuws
Frontpage Nieuws