SQL Update: Datensatz ergänzen mit einem Wert aus einer anderen Tabelle

Aufbau der Tabellen
Aufbau der Tabellen
In einer Datenbank sind 2 Tabellen vorhanden: Account und AccountOld. In der Tabelle Account wird mit einer neuen Struktur gearbeitet, die von der Tabelle AccountOld abweicht. In der alten Tabelle ist die Gruppenzugehörigkeit gespeichert, welche jetzt doch noch übernommen werden soll.

Inhalt der Tabelle Account
Inhalt der Tabelle AccountOld

Um nun den Wert der Gruppenzugehörigkeit aus der Tabelle AccountOld zu übernehmen, haben wir folgende Möglichkeiten für die verschiedenen Datenbanksysteme:

MS SQL-Server
Beim Microsoft SQL-Server können wir dies auf 2 verschiedene Arten erledigen. Mit Hilfe einer Unterabfrage (Sub-Select) oder mit einem INNER-JOIN. Aus meiner Sicht ist jedoch die Variante mit dem INNER-JOIN zu bevorzugen.

Mit einem Sub-Select:

UPDATE Account SET Account.GroupID = (SELECT AccountOld.GroupID 
FROM AccountOLD WHERE Account.Name = AccountOld.Name)

Mit einem INNER JOIN:

UPDATE ACCOUNT SET Account.GroupID = AccountOld.GroupID 
FROM Account INNER JOIN AccountOLD ON Account.Name = AccountOld.Name

SQLite
Bei der SQLite DB funktioniert es nur mit Hilfe eines Sub-Select, da in einem Update-Statement kein FROM oder INNER-JOIN erlaubt ist.

Mit einem Sub-Select:

UPDATE Account SET GroupID = (SELECT AccountOld.GroupID 
FROM AccountOLD WHERE Account.Name = AccountOld.Name)

Resultat des Update-Befehl

Die Tabelle Account nach dem Update-Befehl

Anfälligkeit von Webapplikationen durch SQL-Injection prüfen, mit Hilfe von sqlmap

Heutige Webapplikationen müssen gegen eine grosse Anzahl von Angriffen aus dem Web gesichert werden. Bei Webapplikationen die eine Datenbank im hintergrund haben, sind Steuerparameter eine häufige Schwachstelle. Dabei nutzt der Angreifer die Möglichkeit Parameter, welche die Webapplikation in der URL oder in einem Formular mitführt, zu ändern. Mehr zum Thema SQL-Injection bei Wikipedia.

Sqlmap ist eine Open-Source Applikation zum automatisierten Testen von Webapplikationen, auf Anfälligkeit durch SQL-Injection. Dadurch das sqlmap in Python geschrieben wurde, ist die Applikation Plattformunabhängig und läuft unter Windows sowie Unix/Linux. Vorausgesetzt ist ein installierter Python Interpreter ab Version 2.6.

Anzeigen der vorhandenen Parameter


>sqlmap.py -h

Liefert eine Liste mit den vorhandenen Parameter.

Bestimmen der verwendeten Datenbank (Database Fingerprinting)


>sqlmap.py -u "http://meine.url.info/page.asp?artid=1" -f

Output eines erfolgreichen Tests:


........
[INFO] testing Microsoft SQL Server
[INFO] confirming Microsoft SQL Server
[INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, ASP, Microsoft IIS 5.0
back-end DBMS: active fingerprint: Microsoft SQL Server 2008
               html error message fingerprint: Microsoft SQL Server

 

Prüfen ob ein bestimmter Parameter anfällig auf SQL-Injection ist


>sqlmap.py -u "http://meine.url.info/page.asp?artid=1" -p "artid"

Output eines erfolgreichen Tests:


......
GET parameter 'artid' is vulnerable.

sqlmap identified the following injection points with a total of 41 HTTP(s) requests:
---
Place: GET
Parameter: artid
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: artid=1' AND 9454=9454 AND 'WAlX'='WAlX
---

 

Nützliche Links:
sqlmap Dokumentation
SQL Injection Tutorial: Learn with Example
SQL Injection Cheat Sheet
SQL Injection Cheat Sheet für Oracle, MSSQL, MySQL, PostgreSQL, Ingres, DB2, Informix
Testseite für den Acunetix Web Vulnerability Scanner