Örnekler
SQL'de: select id, firstname, lastname from authors
Eğer biri şu şartları sağlarsa: Firstname: evil'exveLastname: Newman
Sorgu dizesi şu hale gelir:
select id, firstname, lastname from authors where firstname = 'evil'ex' and lastname ='newman'
Veritabanının çalıştırmaya çalıştığı şekil şudur:
Incorrect syntax near il' as the database tried to execute evil.
Yukarıdaki SQL sorgusunun güvenli bir versiyonu Java dilinde şu şekilde kodlanabilir:
Aşağıdaki C# kodu, belirtilen bir adla eşleşen öğeleri arayan bir SQL sorgusunu dinamik olarak oluşturur ve yürütür. Sorgu, görüntülenen öğeleri, sahibi şu anda kimliği doğrulanmış kullanıcının kullanıcı adıyla eşleşen öğelerle sınırlandırır.
Bu kodun çalıştırmayı amaçladığı sorgu şu şekildedir:
Ancak, sorgu, sabit bir temel sorgu dizesi ve kullanıcı giriş dizesinin birleştirilmesiyle dinamik olarak oluşturulduğu için, sorgu yalnızca itemNametek tırnak karakteri içermediği durumlarda doğru çalışır. Wiley kullanıcı adına sahip bir saldırgan, "name' OR'a'='a"için dizesini girerse itemName, sorgu şu hale gelir:
Koşulun eklenmesi, OR 'a'='a'WHERE koşulunun her zaman doğru olarak değerlendirilmesine neden olur, bu nedenle sorgu mantıksal olarak çok daha basit olan şu sorguya eşdeğer hale gelir:
Sorgunun bu şekilde basitleştirilmesi, saldırganın sorgunun yalnızca kimliği doğrulanmış kullanıcıya ait öğeleri döndürmesi gerekliliğini atlamasına olanak tanır; sorgu artık belirtilen sahibine bakılmaksızın öğeler tablosunda depolanan tüm girdileri döndürür.
Bu örnek, Örnek 1'de oluşturulan ve yürütülen sorguya farklı bir kötü amaçlı değerin iletilmesinin etkilerini inceler. Kullanıcı adı "hacker" olan bir saldırgan " "name');
Microsoft® SQL Server 2000 de dahil olmak üzere birçok veritabanı sunucusu, noktalı virgülle ayrılmış birden fazla SQL ifadesinin aynı anda yürütülmesine izin verir. Bu saldırı dizesi, noktalı virgülle ayrılmış ifadelerin toplu yürütülmesine izin vermeyen Oracle ve diğer veritabanı sunucularında hataya neden olurken, toplu yürütmeye izin veren veritabanlarında bu tür bir saldırı, saldırganın veritabanına karşı rastgele komutlar yürütmesine olanak tanır.
Sondaki tire çiftine ( --) dikkat edin; bu, çoğu veritabanı sunucusuna ifadenin geri kalanının yorum olarak ele alınması ve yürütülmemesi gerektiğini belirtir. Bu durumda, yorum karakteri, değiştirilmiş sorgudan kalan sondaki tek tırnak işaretini kaldırmaya yarar. Yorumların bu şekilde kullanılmasına izin verilmeyen bir veritabanında, genel saldırı, Örnek 1'de gösterilene benzer bir hile kullanılarak yine de etkili hale getirilebilir. Bir saldırgan "..." dizesini girerse "name'); DELETE FROM items;
SQL enjeksiyon saldırılarını önlemenin geleneksel bir yaklaşımı, bunları bir girdi doğrulama problemi olarak ele almak ve ya yalnızca güvenli değerlerin izin verilenler listesindeki karakterleri kabul etmek ya da potansiyel olarak kötü amaçlı değerlerin reddedilenler listesindeki karakterleri belirleyip bunlardan kaçınmaktır. İzin verilenler listesi, katı girdi doğrulama kurallarını uygulamak için çok etkili bir yöntem olabilir, ancak parametreli SQL ifadeleri daha az bakım gerektirir ve güvenlik açısından daha fazla garanti sunabilir. Neredeyse her zaman olduğu gibi, reddedilenler listesi, SQL enjeksiyon saldırılarını önlemede etkisiz hale getiren birçok açık içerir. Örneğin, saldırganlar şunları yapabilir:
Eğer biri şu şartları sağlarsa: Firstname: evil'exveLastname: Newman
Sorgu dizesi şu hale gelir:
select id, firstname, lastname from authors where firstname = 'evil'ex' and lastname ='newman'
Veritabanının çalıştırmaya çalıştığı şekil şudur:
Incorrect syntax near il' as the database tried to execute evil.
Yukarıdaki SQL sorgusunun güvenli bir versiyonu Java dilinde şu şekilde kodlanabilir:
String firstname = req.getParameter("firstname");<br>String lastname = req.getParameter("lastname");<br>// FIXME: do your own validation to detect attacks<br>String query = "SELECT id, firstname, lastname FROM authors WHERE firstname = ? and lastname = ?";<br>PreparedStatement pstmt = connection.prepareStatement( query );<br>pstmt.setString( 1, firstname );<br>pstmt.setString( 2, lastname );<br>try<br>{<br> ResultSet results = pstmt.execute( );<br>}<br>
Aşağıdaki C# kodu, belirtilen bir adla eşleşen öğeleri arayan bir SQL sorgusunu dinamik olarak oluşturur ve yürütür. Sorgu, görüntülenen öğeleri, sahibi şu anda kimliği doğrulanmış kullanıcının kullanıcı adıyla eşleşen öğelerle sınırlandırır.
...<br>string userName = ctx.getAuthenticatedUserName();<br>string query = "SELECT * FROM items WHERE owner = '"<br> + userName + "' AND itemname = '"<br> + ItemName.Text + "'";<br>sda = new SqlDataAdapter(query, conn);<br>DataTable dt = new DataTable();<br>sda.Fill(dt);<br>...<br>Bu kodun çalıştırmayı amaçladığı sorgu şu şekildedir:
[COLOR=rgb(250, 197, 28)]SELECT * FROM items<br>WHERE owner =<br>AND itemname = ;<br>[/COLOR]Ancak, sorgu, sabit bir temel sorgu dizesi ve kullanıcı giriş dizesinin birleştirilmesiyle dinamik olarak oluşturulduğu için, sorgu yalnızca itemNametek tırnak karakteri içermediği durumlarda doğru çalışır. Wiley kullanıcı adına sahip bir saldırgan, "name' OR'a'='a"için dizesini girerse itemName, sorgu şu hale gelir:
SELECT * FROM items<br>WHERE owner = 'wiley'<br>AND itemname = 'name' OR 'a'='a';<br>Koşulun eklenmesi, OR 'a'='a'WHERE koşulunun her zaman doğru olarak değerlendirilmesine neden olur, bu nedenle sorgu mantıksal olarak çok daha basit olan şu sorguya eşdeğer hale gelir:
SELECT * FROM items;Sorgunun bu şekilde basitleştirilmesi, saldırganın sorgunun yalnızca kimliği doğrulanmış kullanıcıya ait öğeleri döndürmesi gerekliliğini atlamasına olanak tanır; sorgu artık belirtilen sahibine bakılmaksızın öğeler tablosunda depolanan tüm girdileri döndürür.
Bu örnek, Örnek 1'de oluşturulan ve yürütülen sorguya farklı bir kötü amaçlı değerin iletilmesinin etkilerini inceler. Kullanıcı adı "hacker" olan bir saldırgan " "name');
DELETE FROM items; --" for" dizesini girerse itemName, sorgu aşağıdaki iki sorguya dönüşür:SELECT * FROM items<br>WHERE owner = 'hacker'<br>AND itemname = 'name';<br><br>DELETE FROM items;<br><br>--'<br>Microsoft® SQL Server 2000 de dahil olmak üzere birçok veritabanı sunucusu, noktalı virgülle ayrılmış birden fazla SQL ifadesinin aynı anda yürütülmesine izin verir. Bu saldırı dizesi, noktalı virgülle ayrılmış ifadelerin toplu yürütülmesine izin vermeyen Oracle ve diğer veritabanı sunucularında hataya neden olurken, toplu yürütmeye izin veren veritabanlarında bu tür bir saldırı, saldırganın veritabanına karşı rastgele komutlar yürütmesine olanak tanır.
Sondaki tire çiftine ( --) dikkat edin; bu, çoğu veritabanı sunucusuna ifadenin geri kalanının yorum olarak ele alınması ve yürütülmemesi gerektiğini belirtir. Bu durumda, yorum karakteri, değiştirilmiş sorgudan kalan sondaki tek tırnak işaretini kaldırmaya yarar. Yorumların bu şekilde kullanılmasına izin verilmeyen bir veritabanında, genel saldırı, Örnek 1'de gösterilene benzer bir hile kullanılarak yine de etkili hale getirilebilir. Bir saldırgan "..." dizesini girerse "name'); DELETE FROM items;
SELECT \* FROM items WHERE 'a'='a", aşağıdaki üç geçerli ifade oluşturulacaktır:SELECT * FROM items<br>WHERE owner = 'hacker'<br>AND itemname = 'name';<br><br>DELETE FROM items;<br><br>SELECT * FROM items WHERE 'a'='a';<br>SQL enjeksiyon saldırılarını önlemenin geleneksel bir yaklaşımı, bunları bir girdi doğrulama problemi olarak ele almak ve ya yalnızca güvenli değerlerin izin verilenler listesindeki karakterleri kabul etmek ya da potansiyel olarak kötü amaçlı değerlerin reddedilenler listesindeki karakterleri belirleyip bunlardan kaçınmaktır. İzin verilenler listesi, katı girdi doğrulama kurallarını uygulamak için çok etkili bir yöntem olabilir, ancak parametreli SQL ifadeleri daha az bakım gerektirir ve güvenlik açısından daha fazla garanti sunabilir. Neredeyse her zaman olduğu gibi, reddedilenler listesi, SQL enjeksiyon saldırılarını önlemede etkisiz hale getiren birçok açık içerir. Örneğin, saldırganlar şunları yapabilir:
- ]Tırnak içine alınmamış hedef alanlar
- Belirli kaçış meta-karakterlerine olan ihtiyacı ortadan kaldırmanın yollarını bulun.
- Eklenen meta karakterleri gizlemek için saklı prosedürler kullanın.
SQL sorgularına girilen metindeki karakterleri manuel olarak kaçırmak yardımcı olabilir, ancak uygulamanızı SQL enjeksiyon saldırılarına karşı güvenli hale getirmez.
SQL enjeksiyon saldırılarıyla başa çıkmak için yaygın olarak önerilen bir diğer çözüm ise saklı prosedürleri kullanmaktır. Saklı prosedürler bazı SQL enjeksiyon saldırısı türlerini önlese de, diğer birçok saldırıya karşı koruma sağlamazlar. Örneğin, aşağıdaki PL/SQL prosedürü, ilk örnekte gösterilen aynı SQL enjeksiyon saldırısına karşı savunmasızdır.
Saklı prosedürler, genellikle parametrelerine iletilebilecek ifade türlerini sınırlayarak SQL enjeksiyon saldırılarını önlemeye yardımcı olur. Bununla birlikte, sınırlamaların
etrafından dolaşmanın birçok yolu ve saklı prosedürlere iletilebilecek birçok ilginç ifade vardır. Tekrar belirtmek gerekirse, saklı prosedürler bazı güvenlik açıklarını önleyebilir, ancak uygulamanızı SQL enjeksiyon saldırılarına karşı tamamen güvenli hale getiremezler.
İLGİLİ VİDEO!!
SQL enjeksiyon saldırılarıyla başa çıkmak için yaygın olarak önerilen bir diğer çözüm ise saklı prosedürleri kullanmaktır. Saklı prosedürler bazı SQL enjeksiyon saldırısı türlerini önlese de, diğer birçok saldırıya karşı koruma sağlamazlar. Örneğin, aşağıdaki PL/SQL prosedürü, ilk örnekte gösterilen aynı SQL enjeksiyon saldırısına karşı savunmasızdır.
procedure get_item (<br> itm_cv IN OUT ItmCurTyp,<br> usr in varchar2,<br> itm in varchar2)<br>is<br> open itm_cv for ' SELECT * FROM items WHERE ' ||<br> 'owner = '''|| usr ||<br> ' AND itemname = ''' || itm || '''';<br>end get_item;<br>Saklı prosedürler, genellikle parametrelerine iletilebilecek ifade türlerini sınırlayarak SQL enjeksiyon saldırılarını önlemeye yardımcı olur. Bununla birlikte, sınırlamaların
etrafından dolaşmanın birçok yolu ve saklı prosedürlere iletilebilecek birçok ilginç ifade vardır. Tekrar belirtmek gerekirse, saklı prosedürler bazı güvenlik açıklarını önleyebilir, ancak uygulamanızı SQL enjeksiyon saldırılarına karşı tamamen güvenli hale getiremezler.
İLGİLİ VİDEO!!

