Hallo :)

Ik ben op zoek naar een zo lek mogelijk inlogscript. Weten jullie misschien waar ik die één kan vinden? De meeste zijn namelijk goed beveiligd.

Het inlogscript moet wel verbinding maken met een database. Het inlogscript moet ook gevoelig zijn voor SQL-injectie.

Ik moet namelijk een demo maken voor SQL-injectie, en ik wil graag d.m.v. SQL-injectie onversleutelde gebruikersnamen en wachtwoorden uit de database halen.

Wie kan mij in de goede richting duwen?

Mvg,
Tom

Edit: even voor de duidelijkheid: dat inlogscript zal nooit in een productie-omgeving komen. Het is uitsluitend bedoeld voor demodoeleinden.
Met preventie van SQL Injection ja, met het uitvoeren daarvan denk ik niet. Dat je jezelf wat dieper in de stof verdiept is dan weer wel goed.
Vreemde vraag.
Het lijkt er een beetje op alsof we je nu moeten feliciteren voor elke fout in je script.

Wel, als het een troost mag zijn: je script is inderdaad lek.

Ik zal eens een onschuldig (allez ja, het zal de boel niet volledig doen crashen...) voorbeeld tonen van injection.

----------------------------------------------------------
Edit:

Bekijk dit eens:
<?php
session_start();
//$con = mysql_connect('localhost', 'root', '...');
//$db = mysql_select_db('phphulp', $con);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$sql = "SELECT id, naam FROM gebruikers WHERE naam='". $_POST['naam'] ."' AND pass='". $_POST['pass'] ."' ";
echo $sql;
}
else {
echo '<html><body>
<form action="" method="post">
<div><input name="naam"/> Naam</div>
<div><input name="pass" type="password"/> Paswoord</div>
<div><input type="submit"/></div>
</form>
</body></html>';
}
?>

Vul nu eens volgende gegevens in:
naam: foo
paswoord: bar' OR 1='1

Resultaat:
$sql wordt:
SELECT id, naam FROM gebruikers WHERE naam='foo' AND pass='bar' OR 1='1'
Resultaat: die OR 1='1' geeft altijd een true weer. Het eerste record van de tabel gebruikers zal worden gevonden (EDIT: een beetje ongelukkig geformuleerd; zie verdere posts). Indien je het ongeluk hebt dat dit net de Administrator is, kan deze gebruiker dus je hele site overnemen.
Ik zou wel in ieder geval de magic-quotes uitschakelen met dit in je .htaccess:


php_flag magic_quotes_gpc Off


Of als dit niet werkt, deze code bovenaan je PHP-script:

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}
?>

Kris Peeters op 18/01/2011 11:20:16

Resultaat: die OR 1='1' geeft altijd een true weer. Het eerste record van de tabel gebruikers zal worden gevonden.


Waarom de eerste?
Als dit in de WHERE een true oplevert zullen alle records worden gevonden.
Ja, ik heb het wat fout geformuleerd.

Ik zou verwachten dat er met php slechts 1 record wordt gefetcht, maar uiteraard heeft SanThe gelijk.
Kris Peeters op 18/01/2011 11:56:05

Ja, ik heb het wat fout geformuleerd.

Ik zou verwachten dat er met php slechts 1 record wordt gefetcht, maar uiteraard heeft SanThe gelijk.


Je fetched er waarschijnlijk inderdaad slechts één. En dat zal een willekeurig record zijn aangezien er geen ORDER BY op een inlogquery zal zitten.
Google heeft een lekke oefen-applicatie:
Gruyere

Ik weet alleen niet of SQL-injections kunnen, maar vast wel. Het is alleen niet in PHP.
SQL injection kan op vrijwel elke soort database.... ;-)

Reageren