LOGIN über SQL Injection?
Ich habe folgenden code auf meiner website und möchten, loggen Sie sich mit SQL-Injection. Ich habe versucht einige codes für die, die es aber nicht konnte, haben ein Ergebnis.
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 1";
$sql = mysql_query($query);
if( mysql_num_rows($sql) == 1 )
{
$row = mysql_fetch_array($sql);
$_SESSION['id'] = $row['id'];
}
else
{
echo $query;
}
Hier sind die codes, die ich ausprobiert habe. In die erste, die ich versuchte von Benutzername:
Markiere ich meine injizierte Teil als Kommentar, um es einfacher zu verstehen.
Benutzername eingegeben: admin' or id=1 ; --
SELECT * FROM users WHERE username='admin' or id=1 ; -- ' AND password='0' LIMIT 1"
Auch habe ich versucht zu geben, vorbei. Mit diesem code: 0' or '1'='1
SELECT * FROM users WHERE username='admin' AND password='0' or '1'='1' LIMIT 1"
Was mache ich falsch?
- Ich bin kein pen-testing noch PHP-Experte, aber würde
' or 1=1;--
Arbeit? - Es nicht 😀 ich weiß nicht, sah nur, dass ein Kerl thid, dass.
- Ich dont bekommen, kein Ergebnis für mysql_num_rows mit es
- Es werden automatisierte Test-tools wie SQLMap, die wissen, dass alle die tricks und wird Ihnen einen Bericht über Sicherheitslücken.
- Was Sie tun wahrscheinlich nicht so funktionieren, wie Ihr gehackt Abfrage erhalten jede Zeile, in welcher der Benutzername ist "admin" ODER der id 1. Wenn der admin hat eine andere id als 1 ist, dann wird die Abfrage bringen, wieder 2 Zeilen, die scheitern würden, den Scheck für die Anzahl der Zeilen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nur verwenden, dies ist in der Benutzername parameter.
ODER
Dies wird definitiv Pause der oben-Authentifizierung.
wenn diese Authentifizierung Seite aufgerufen wird, als wie dieser.
Mithilfe von POST-Parametern Benutzername und Passwort.(Eingegeben durch eine textfiled von einem HTTP-Formular oder nichts).
ODER
Lassen Sie uns sagen, in der Tabelle
users
enthält 3 Zeilen (BTW: ein Klartext-Passwort?!? Ich hoffe, dass nicht!!! Sehen Sie dies für die beste Praxis):Jede der Abfragen, die Sie geschafft haben, zu injizieren, wird nun jeder der Zeilen, die aufgrund Betreiber Vorrang:
bewertet als
Beachten Sie, dass die am weitesten rechts liegenden Begriff entsprechen jeder Zeile.
Also
if( mysql_num_rows($sql) == 1 )
ausgewertetif ( 3 == 1 )
, dieif (false)
. Also, das Programm funktioniert, aber nur durch Zufall.(Warum "durch Zufall"? Lassen Sie uns versuchen zu basteln eine andere Einspritzung:
Eingabe
0' or username='admin
würde unsDen ersten term (
username='admin' AND password='0'
) nicht übereinstimmen, aber die zweite wird match 1 Zeile genau, damit die Gewährung von Zugang ohne Passwort.)Wie man dieses Problem beheben:
mysql_query
ist veraltet und wird entfernt werden.Wenn Sie WIRKLICH, WIRKLICH nicht wollen, zu reparieren Ihren code, zumindest die Flucht der Eingänge. DIES IST NUR EINE NOT-NOTLÖSUNG, NICHT WIRKLICH EINE LÖSUNG - MAN SOLLTE NICHT SCHREIBEN NEUEN CODE WIE FOLGT:
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);