Lek inlogscript
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.
Gewijzigd op 12/01/2011 10:37:53 door Tom C
PS: Let niet op mysql_real_escape_string(), en gooi de magic-quotes lekker uit.
Kijk eens in de script lib hier op phphulp. Het merendeel is zo lek als een mandje helaas.
- Aar - op 12/01/2011 10:38:35:
Wat houdt je tegen om er zelf eentje te maken?
PS: Let niet op mysql_real_escape_string(), en gooi de magic-quotes lekker uit.
PS: Let niet op mysql_real_escape_string(), en gooi de magic-quotes lekker uit.
Het feit dat er misschien al één bestaat, wat fouten van mijn kant voorkomt :)
Ik heb pas geleden zelf nog mijn eigen (proef)database zitten 'injectionen' :P
Toevoeging op 12/01/2011 10:46:45:
Tom C op 12/01/2011 10:39:37:
Het feit dat er misschien al één bestaat, wat fouten van mijn kant voorkomt :)
- Aar - op 12/01/2011 10:38:35:
Wat houdt je tegen om er zelf eentje te maken?
PS: Let niet op mysql_real_escape_string(), en gooi de magic-quotes lekker uit.
PS: Let niet op mysql_real_escape_string(), en gooi de magic-quotes lekker uit.
Het feit dat er misschien al één bestaat, wat fouten van mijn kant voorkomt :)
neem een goede editor like Netbeans, en een fout script (lees: syntax-fouten) behoren tot het verleden.
Code (php)
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
27
28
29
30
31
32
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
27
28
29
30
31
32
<?php
$connect = mysql_connect("localhost","**","**") or die (mysql_error());
mysql_select_db("**") or die (mysqlerror());
$username = $_POST['username'];
$password = stripslashes($_POST['password']);
if($username&&$password)
{
$query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");
if(mysql_num_rows($query))
die("Access granted");
else
die("Access denied");
}
?>
<form action='login.php' method='POST'>
<table>
<tr>
<td>Username:</td>
<td><input type="text" name='username'</td>
</tr>
<tr>
<td>Password:</td>
<td><input type="text" name='password'></td>
</tr>
</table>
<input type='submit' value='Login'>
</form>
$connect = mysql_connect("localhost","**","**") or die (mysql_error());
mysql_select_db("**") or die (mysqlerror());
$username = $_POST['username'];
$password = stripslashes($_POST['password']);
if($username&&$password)
{
$query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");
if(mysql_num_rows($query))
die("Access granted");
else
die("Access denied");
}
?>
<form action='login.php' method='POST'>
<table>
<tr>
<td>Username:</td>
<td><input type="text" name='username'</td>
</tr>
<tr>
<td>Password:</td>
<td><input type="text" name='password'></td>
</tr>
</table>
<input type='submit' value='Login'>
</form>
Kan iemand mij kort en bondig uitleggen hoe ik nu met SQL-injection wachtwoorden en usernames als plain text uit de database kan halen, en kan weergeven? Ze zijn allebei als plain text opgeslagen.
Gewijzigd op 18/01/2011 09:30:04 door Tom C
SQL injection tutorial == 250.000.000 hits?
Ik kan wel ingelogd raken met SQL injectie, maar vraag me af hoe ik de username en password op mijn scherm krijg.. Dat krijg ik niet gevonden.
Gewijzigd op 18/01/2011 10:55:36 door - Mark -
Ik ben ook niet van plan om andere websites te hacken. Ik leer het zelfs op school. Maar SQL Injection werd maar onduidelijk uitgelegd, vandaar dat ik d.m.v. zelfstudie er wat meer te weten over wilde komen. Aangezien ik daarmee vastloop, dacht ik dat jullie mij hier wel bij konden helpen.
normaal gezien kom je met mysql_real_escape_string()
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.
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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>';
}
?>
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.
Gewijzigd op 18/01/2011 12:59:50 door Kris Peeters
Of als dit niet werkt, deze code bovenaan je PHP-script:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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);
}
?>
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.
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.
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.
SQL injection kan op vrijwel elke soort database.... ;-)