URLScan 3.0 ve SQL Injection saldırıları

URLScan Nedir?

URLScan, IIS'in işleyeceği HTTP isteklerini kontrol edip gerektiğinde engellemeye yarayan bir güvenlik aracıdır. IIS üzerinde bir "ISAPI Filter" olarak çalışır ve filtreleme işini bizim belirlediğimiz kriterlere göre yapar. Biz bu kriterleri "urlscan.ini" isimli dosyada tanımlarız. Bu blogda URLScan'in teknik detaylarından bahsetmeyeceğim. Ancak aşağıdaki linklerde çok detaylı bilgi bulabilirsiniz:

https://learn.iis.net/page.aspx/473/using-urlscan/
https://learn.iis.net/page.aspx/475/urlscan-setup/

SQL Injection nedir?

SQL Injection, en basit tanımıyla, uygulamamızdaki SQL cümleciklerine dışarıdan müdahale edilmesidir diyebiliriz. Buna izin veren (ya da vermeyen) bizim yazdığımız uygulamanın kendisidir. Bilmeyenler olabilir diye kısaca saldırının nasıl işlediğini anlatalım:

Diyelim ki bir web uygulamanız var ve bunu kullanmak için kullanıcı adı ve şifre girilen bir sayfanız var. Anlatım kolaylığı açısından uygulamamız ASP uygulaması olsun. Şimdi, bir kullanıcı, kullanıcı adını ve şifresini girip "Giriş" butonuna tıkladığında, ASP sayfamızda şuna benzer bir kod çalışıyor olacaktır:

<%
conn=Server.CreateObject("ADODB.Connection");
connStr = "...";
conn.Open (connStr);

rs = Server.CreateObject("ADODB.Recordset");
sqlStr = "SELECT * FROM Users WHERE username='" + Request("kullaniciAdi") + "' AND password='" + Request("sifre") + "'";
rs = conn.Execute(sqlStr);
%>

sqlStr'nin tanımlandığı satırda, ilgili değişkenler yerine konduğunda veritabanına gönderilecek SQL cümleciği şöyle birşey olacaktır (kullanıcı adının CENK ve şifrenin de İRDEN olduğu bir senaryada):

SELECT * FROM Users WHERE username='CENK' AND password='İRDEN'

Kodun geri kalanında, eğer bu SQL cümleciği bir sonuç döndürmüşse kodumuz çalışmaya devam edecektir. Buraya kadar herşey normal görünüyor. Ancak eğer birisi kullanıcı adı yerine aşağıdaki gibi birşey girerse ne olur:

' OR 1=1 --

Bu durumda SQL cümleciğimiz şöyle bir hal alır:

SELECT * FROM Users WHERE username='' OR 1=1 --' AND password=''

Bilmeyenler olabilir diye açıklamakta fayda var: "--" işareti, SQL'da, "satırın geri kalanını dikkate alma" demektir. Dolayısıyla yukarıdaki cümlenin çalıştırılacak kısmı

SELECT * FROM Users WHERE username='' OR 1=1

olacaktır. Yani, kullanıcı adı boş olan VEYA 1=1 olan durumlarda sonuç dönecektir. 1=1 her koşulda doğru bir önerme olduğuna göre, veritabanımız bize tüm kullanıcıların listesini dönecektir. İşte tam da bu noktada, kullanıcı adı ve şifre olmadan da uygulamamıza girilmiş olur. Buradan sonrası kodumuzla neler yapılabildiğine ve saldırganın insafına kalmıştır.

Sadece kullanıcı girişinde değil, kullanıcıdan girdi aldığımız her yerde buna benzer sıkıntılarla karşılaşabiliriz. Yani sisteme bir girişle sonuçlanmsa da, bazı durumlarda bu saldırı bir hataya neden olur. Bu hatanın içerisinde bizim için kritik bazı bilgileri de (örneğin veritabanı veya tablo adı, hatta veritabanı erişim şifresi gibi) saldırganla paylaşıyor olabiliriz.

SQL Injection saldırılarından korunmak aslında çok kolaydır. Tek yapmamız gereken, kullanıcıdan aldığımız her türlü veriyi (bizim örneğimizde kullanıcı adı ve şifreyi) veritabanına göndermeden önce kontrol etmektir. İçinde tek tırnak geçenleri engellemek bile aslında yeterli olabilir ama yine de daha detaylı bir kontrolden geçirmek daha doğru olacaktır.

URLScan kullanarak SQL Injection saldırılarını nasıl önleriz?

URLScan kullanarak, saldırganların uygulamamıza belirli kelime ve karakter öbeklerini göndermelerini engelleyebiliriz. Bunun için, urlscan.ini dosyasında aşağıdaki gibi bir tanım yapmamız yeterli olacaktir:

[Options]
RuleList=SQL Injection

[SQL Injection]
AppliesTo=.asp,.aspx
DenyDataSection=SQL Injection Strings
ScanUrl=0
ScanAllRaw=0
ScanQueryString=1
ScanHeaders=

[SQL Injection Strings]
--
%3b
/*
@
char
alter
begin
cast
convert
create
cursor
declare
delete
drop
end
exec
fetch
insert
kill
open
select
sys
table
update

Yukarıdaki tanım, sadece "query string"leri tarayacağından, POST metodunu kullandığımız sayfalarda işe yaramacaktır. İstersek "ScanAllRaw=1"tanımını yaparak isteğin tamamının taranmasını sağlayabiliriz. Ancak bu noktada da, güvenlikle ilgili her konuda olduğu, denge sorunu devreye giriyor. Eğer tüm "header"ları taratacak olursak, muhtemelen hiç kimse uygulamamıza erişemeyecektir. Çünkü pek çok isteğin "header"ları arasında yukarıdaki listedeki en az bir öbek geçiyordur. Güvenlikle kullanılabilirlik arasındaki hassas dengeyi doğru kurmaya dikkat etmemiz gerekir.

NOT: Yukarıdaki tanımı aşağıdaki blogdan aldım. Burada URLScan'in kullanımıyla ilgili başka örnekler de bulabilirsiniz. Hatta URLScan loglarının LogParser kullanarak incelenmesine dair örnekler de bulunuyor:

https://learn.iis.net/themes/iis/pages/page.aspx/476/common-urlscan-scenarios/

SONUÇ:

  1. SQL Injection saldırıları, günümüzde web sitelerinin en çok maruz kaldığı saldırı türüdür demek yanlış olmaz. Aslında bunlardan korunmak oldukça kolaydır. Asıl yapılması gereken kodlarımızda kullanıcı girdilerini kontrol etmek olmalıdır. URLScan de bize bu noktada bir korunma katmanı daha sağlayabilir.
  2. URLScan, SQL Injection saldırılarının ötesinde, pek çok açıdan ciddi bir güvenlik katmanıdır. Neler yapabildiğini detaylı olarak incelemekte fayda olacaktır.

CENK ISCAN