Web for Pentester -XSS Çözümleri

Bilge Güngör
10 min readAug 4, 2024

--

Yeni bir yazıma hoş geldiniz, umarım iyisinizdir :) Bu yazıda, “Web for Pentester” adlı popüler bir eğitim kaynağından faydalanarak XSS (Cross-Site Scripting) saldırılarını nasıl tespit edip önleyebileceğinizi ele alacağım. XSS saldırıları, web uygulamalarında sıkça karşılaşılan ve kullanıcıların kişisel bilgilerinin çalınmasına, oturumlarının ele geçirilmesine ve daha birçok kötü niyetli eyleme yol açabilen tehlikeli bir güvenlik açığıdır.

İlk olarak, “Web for Pentester” sanal makinesini VMware Workstation’a kurmanız gerekiyor. Bu makineyi indirmek için bu bağlantıya tıklayabilirsiniz. Ardından da Vmvare de File -> New Virtual Machine kısmına tıklayıp kurulumlarımızı tamamlayalım.

Kurulumlarımızı tamamladıktan sonra, “Web for Pentester” sanal makinesinin IP adresini öğrenmemiz gerekecek. Bu IP adresini internet tarayıcınıza girerek “Web for Pentester” ana sayfasına erişebilirsiniz. Ben bu aşamada Burp Suite kullandığım için, internet tarayıcısı olarak Burp Suite ile entegre çalışan Chromium tarayıcısını tercih ettim. Böylece XSS örneklerini çözerken, Burp Suite ile aktif kontroller de yapabildim. İsterseniz, sayfa kaynağını da inceleyerek daha detaylı analizler gerçekleştirebilirsiniz.

“Web for Pentester” ana sayfasına eriştiğinizde, birçok farklı güvenlik açığıyla ilgili uygulamalar yapabileceğiniz çeşitli senaryolar bulacaksınız. Bugünkü konumuz XSS (Cross-Site Scripting) saldırıları olduğundan, bu örnekleri çözeceğiz.

Uygulama kısmına geçmeden önce, buradan “Web for Pentester”ın kaynak kodlarına bakabilirsiniz.

Artık her şeyimiz tamam olduğuna göre başlayabiliriz.

Example 1

Adım 1: Kaynak Kodları İnceleyelim

İlk öncelikle GitHub’dan kaynak kodlarına bakıp inceleyelim.

Bu PHP kodu, URL’den “name” parametresini alır ve doğrudan sayfaya yansıtır.

Adım 2: Zafiyeti Tespit Edelim

http://192.168.100.6/xss/example1.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello hacker

Kod, kullanıcının URL’de “name” parametresine verdiği değeri doğrudan sayfaya yansıttığı için, XSS (Cross-Site Scripting) zafiyetine yol açabilir. Çünkü kullanıcı tarafından sağlanan veri hiçbir doğrulama veya temizleme yapılmadan doğrudan sayfaya dahil ediliyor.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan olarak zararlı bir JavaScript kodunu URL’ye ekleyerek sayfada çalıştırabiliriz:

http://192.168.100.6/xss/example1.php?name=<script>alert("bilge");</script>

Bu durumda sayfa şu şekilde görüntülenir:

Bu, zararlı JavaScript kodunun çalışmasına ve bir uyarı penceresi (alert) görüntülenmesine yol açar.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için kullanıcıdan gelen veriyi doğru bir şekilde temizlemek ve doğrulamak önemlidir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() fonksiyonunu kullanabiliriz.

<?php echo htmlspecialchars($_GET["name"], ENT_QUOTES, 'UTF-8'); ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, <script>alert("bilge");</script> girdisi, sayfada &lt;script&gt;alert("bilge");&lt;/script&gt; olarak görüntülenir ve tarayıcıda çalışmaz.

Example 2

Adım 1: Kaynak Kodları İnceleyelim

İlk öncelikle GitHub’dan kaynak kodlarına bakıp inceleyelim.

Bu PHP kodu, URL’den “name” parametresini alır ve preg_replace() fonksiyonları kullanarak <script> ve </script> etiketlerini temizler. Ardından temizlenmiş veriyi doğrudan sayfaya yansıtır.

Adım 2: Zafiyeti Tespit Edelim

Örneğin, URL şu şekilde olsun:

http://192.168.100.6/xss/example2.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello hacker

Kod, kullanıcıdan gelen veriyi <script> ve </script> etiketlerinden temizlemeye çalışsa da, bu yöntem XSS saldırılarına karşı tam koruma sağlamaz. Bir saldırgan zararlı JavaScript kodunu URL'ye ekleyebilir ve bazı XSS vektörleri hala çalışabilir.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi URL’ye ekleyebilir:

http://192.168.100.6/xss/example2.php?name=<SCRIPT> alert("bilge")</SCRIPT>

Bu durumda sayfa şu şekilde görüntülenir:

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için sadece belirli etiketleri temizlemek yeterli değildir. Daha etkili bir çözüm olarak, tüm HTML özel karakterlerini güvenli bir şekilde işlemek gerekir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() fonksiyonunu kullanabiliriz.

<?php require_once '../header.php'; ?>
Hello
<?php
$name = $_GET["name"];
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
?>
<?php require_once '../footer.php'; ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, <SCRIPT> alert("bilge")</SCRIPT> girdisi, sayfada &lt;SCRIPT&gt; alert(&quot;bilge&quot;)&lt;/SCRIPT&gt; olarak görüntülenir ve tarayıcıda çalışmaz.

Example 3

Adım 1: Kaynak Kodları İnceleyelim

İlk olarak GitHub’dan kaynak kodlarına bakalım:

Bu PHP kodu, URL’den “name” parametresini alır ve preg_replace() fonksiyonları kullanarak <script> ve </script> etiketlerini (büyük/küçük harf farkı gözetmeksizin) temizler. Ardından temizlenmiş veriyi doğrudan sayfaya yansıtır.

Adım 2: Zafiyeti Tespit Edelim

Örneğin, URL şu şekilde olabilir:

http://192.168.100.6/xss/example3.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello hacker

Kod, kullanıcıdan gelen veriyi <script> ve </script> etiketlerinden temizlemeye çalışsa da, bu yöntem XSS saldırılarına karşı tam koruma sağlamaz. Bazı XSS vektörleri hala çalışabilir.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi URL’ye ekleyebilir:

http://192.168.100.6/xss/example3.php?name=<scr<script>ipt>alert("bilge")</scr</script>ipt>

Bu durumda sayfa şu şekilde görüntülenir:

Hello <script>alert("bilge")</script>

Kod, <script> etiketlerinin arasına eklenen metinlerle hala çalışabilir ve zararlı JavaScript kodu tarayıcıda çalışabilir.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için sadece belirli etiketleri temizlemek yeterli değildir. Daha kapsamlı bir yaklaşım kullanmak gerekir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() fonksiyonunu kullanabiliriz. İşte güncellenmiş kod şu şekildedir:

<?php require_once '../header.php'; ?>
Hello
<?php
$name = $_GET["name"];
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
?>
<?php require_once '../footer.php'; ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, <scr<script>ipt>alert("bilge")</scr</script>ipt> girdisi, sayfada &lt;scr&lt;script&gt;ipt&gt;alert(&quot;bilge&quot;)&lt;/scr&lt;/script&gt;ipt&gt; olarak görüntülenir ve tarayıcıda çalışmaz.

Example 4

Adım 1: Kaynak Kodları İnceleyelim

İlk olarak GitHub’dan kaynak kodlarına bakalım:

Bu PHP kodu, URL’den “name” parametresini alır ve preg_match() fonksiyonu kullanarak "script" kelimesinin büyük/küçük harf farkı gözetmeksizin var olup olmadığını kontrol eder. Eğer "script" kelimesi varsa, "error" mesajını gösterir ve çalışmayı durdurur. Aksi takdirde, "name" parametresinin değerini doğrudan sayfaya yansıtır.

Adım 2: Zafiyeti Tespit Edelim

Örneğin, URL şu şekilde olabilir:

http://192.168.100.6/xss/example4.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello hacker

Kod, “script” kelimesini kontrol etse de, XSS saldırılarına karşı tam koruma sağlamaz. Diğer zararlı içerikler hala çalışabilir.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi URL’ye ekleyebilir:

http://192.168.100.6/xss/example4.php?name=<svg onload=alert("bilge")>

Bu durumda sayfa şu şekilde görüntülenir:

Hello <svg onload=alert("bilge")>

Bu, bir <svg> etiketi kullanarak onload özelliği aracılığıyla zararlı JavaScript kodunun çalışmasına ve bir uyarı penceresi (alert) görüntülenmesine yol açar. "script" kelimesi içermeyen diğer zararlı kodlar hala çalışabilir.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için sadece belirli kelimeleri kontrol etmek yeterli değildir. Daha kapsamlı bir yaklaşım kullanmak gerekir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() fonksiyonunu kullanabiliriz. İşte güncellenmiş kod şu şekildedir:

<?php require_once '../header.php'; 

if (preg_match('/script/i', $_GET["name"])) {
die("error");
}
?>

Hello <?php echo htmlspecialchars($_GET["name"], ENT_QUOTES, 'UTF-8'); ?>
<?php require_once '../footer.php'; ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, <svg onload=alert("bilge")> girdisi, sayfada &lt;svg onload=alert(&quot;bilge&quot;)&gt; olarak görüntülenir ve tarayıcıda çalışmaz.

Example 5

Adım 1: Kaynak Kodları İnceleyelim

İlk olarak GitHub’dan kaynak kodlarına bakalım:

Bu PHP kodu, URL’den “name” parametresini alır ve preg_match() fonksiyonu kullanarak "alert" kelimesinin büyük/küçük harf farkı gözetmeksizin var olup olmadığını kontrol eder. Eğer "alert" kelimesi varsa, "error" mesajını gösterir ve çalışmayı durdurur. Aksi takdirde, "name" parametresinin değerini doğrudan sayfaya yansıtır.

Adım 2: Zafiyeti Tespit Edelim

Örneğin, URL şu şekilde olabilir:

http://192.168.100.6/xss/example5.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello hacker

Kod, “alert” kelimesini kontrol etse de, XSS saldırılarına karşı tam koruma sağlamaz. Diğer zararlı içerikler hala çalışabilir.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi URL’ye ekleyebilir:

http://192.168.100.6/xss/example5.php?name=<svg onload=prompt("bilge")>

Bu durumda sayfa şu şekilde görüntülenir:

Hello <svg onload=prompt("bilge")>

Bu, bir <svg> etiketi kullanarak onload özelliği aracılığıyla zararlı JavaScript kodunun çalışmasına ve bir uyarı penceresi (prompt) görüntülenmesine yol açar. "alert" kelimesi içermeyen diğer zararlı kodlar hala çalışabilir.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için sadece belirli kelimeleri kontrol etmek yeterli değildir. Daha kapsamlı bir yaklaşım kullanmak gerekir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() fonksiyonunu kullanabiliriz. İşte güncellenmiş kod şu şekildedir:

<?php require_once '../header.php'; 

if (preg_match('/alert/i', $_GET["name"])) {
die("error");
}
?>

Hello <?php echo htmlspecialchars($_GET["name"], ENT_QUOTES, 'UTF-8'); ?>
<?php require_once '../footer.php'; ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, <svg onload=prompt("bilge")> girdisi, sayfada &lt;svg onload=prompt(&quot;bilge&quot;)&gt; olarak görüntülenir ve tarayıcıda çalışmaz.

Example 6

Adım 1: Kaynak Kodları İnceleyelim

İlk olarak GitHub’dan kaynak kodlarına bakalım:

Bu PHP kodu, URL’den “name” parametresini alır ve bir JavaScript değişkenine ($a) atar. Kullanıcı tarafından sağlanan değer doğrudan JavaScript koduna yerleştirilir.

Adım 2: Zafiyeti Tespit Edelim

Örneğin, URL şu şekilde olabilir:

http://192.168.100.6/xss/example6.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello 
<script>
var $a= "hacker";
</script>

Kod, kullanıcıdan gelen veriyi doğrudan JavaScript koduna yerleştirir. Bu, XSS (Cross-Site Scripting) zafiyetine yol açabilir çünkü kullanıcı tarafından sağlanan veri hiçbir doğrulama veya temizleme yapılmadan doğrudan JavaScript içinde kullanılmaktadır.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi URL’ye ekleyebilir:

http://192.168.100.6/xss/example6.php?name=";alert("bilge");"

Bu durumda sayfa şu şekilde görüntülenir:

Hello 
<script>
var $a= "";alert("bilge");"";
</script>

Bu, zararlı JavaScript kodunun çalışmasına ve bir uyarı penceresi (alert) görüntülenmesine yol açar.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için kullanıcıdan gelen veriyi doğru bir şekilde temizlemek ve doğrulamak önemlidir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() ve json_encode() fonksiyonlarını birlikte kullanabiliriz. İşte güncellenmiş kod şu şekildedir:

<?php require_once '../header.php'; ?>
Hello
<script>
var $a= <?php echo json_encode(htmlspecialchars($_GET["name"], ENT_QUOTES, 'UTF-8')); ?>;
</script>
<?php require_once '../footer.php'; ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, JSON formatına dönüştürülerek ve HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, ";alert("bilge");" girdisi, sayfada "\";alert(\"bilge\");\"" olarak görüntülenir ve tarayıcıda çalışmaz.

Example 7

Adım 1: Kaynak Kodları İnceleyelim

İlk olarak GitHub’dan kaynak kodlarına bakalım:

Bu PHP kodu, URL’den “name” parametresini alır ve htmlentities() fonksiyonu kullanarak HTML karakterlerine dönüştürür. Ardından, bu değeri bir JavaScript değişkenine ($a) atar.

Adım 2: Zafiyeti Tespit Edelim

Örneğin, URL şu şekilde olabilir:

http://192.168.100.6/xss/example7.php?name=hacker

Bu durumda sayfa şu şekilde görüntülenir:

Hello 
<script>
var $a= 'hacker';
</script>

Kod, kullanıcıdan gelen veriyi HTML karakterlerine dönüştürse de, XSS saldırılarına karşı tam koruma sağlamayabilir. Özellikle tek tırnak (') ve çift tırnak (") karakterlerinin kaçırılması gereklidir.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi URL’ye ekleyebilir:

http://192.168.100.6/xss/example7.php?name=';alert(1);'

Bu durumda sayfa şu şekilde görüntülenir:

Hello 
<script>
var $a= '';alert(1);';
</script>

Bu, zararlı JavaScript kodunun çalışmasına ve bir uyarı penceresi (alert) görüntülenmesine yol açar.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için kullanıcıdan gelen veriyi doğru bir şekilde temizlemek ve doğrulamak önemlidir. PHP’de bu tür saldırılardan korunmak için htmlspecialchars() ve json_encode() fonksiyonlarını birlikte kullanabiliriz. İşte güncellenmiş kod şu şekildedir:

<?php require_once '../header.php'; ?>
Hello
<script>
var $a= <?php echo json_encode(htmlspecialchars($_GET["name"], ENT_QUOTES, 'UTF-8')); ?>;
</script>
<?php require_once '../footer.php'; ?>

Bu güncelleme ile kullanıcı tarafından girilen veri, JSON formatına dönüştürülerek ve HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, ';alert(1);' girdisi, sayfada '\";alert(1);\"' olarak görüntülenir ve tarayıcıda çalışmaz.

Example 8

Adım 1: Kaynak Kodları İnceleyelim

İlk olarak GitHub’dan kaynak kodlarına bakalım:

Bu PHP kodu, bir formdan name parametresini POST yöntemi ile alır ve htmlentities() fonksiyonu kullanarak HTML karakterlerine dönüştürür. Ardından, bu değeri "HELLO" metninin yanında ekrana basar.

Adım 2: Zafiyeti Tespit Edelim

Formu şu URL ile gönderebiliriz:

http://192.168.100.6/xss/example8.php

Formu şu şekilde doldurursak:

Your name: hacker

Ve formu gönderdiğimizde, sayfa şu şekilde görüntülenir:

HELLO hacker

Kod, kullanıcıdan gelen veriyi HTML karakterlerine dönüştürse de, XSS saldırılarına karşı tam koruma sağlamayabilir.

Adım 3: Saldırıyı Gerçekleştirelim

Bir saldırgan, XSS saldırısını gerçekleştirebilir ve zararlı bir JavaScript kodunu aşağıdaki gibi formu doldurarak gönderir:

http://192.168.100.6/xss/example8.php/" onmouseover="alert(1);

Bu durumda sayfa şu şekilde görüntülenir:

Kullanıcı, fareyi metnin üzerine getirdiğinde (onmouseover), zararlı JavaScript kodu çalışacak ve bir uyarı penceresi (alert) görüntülenecektir.

Adım 4: Zafiyeti Önleyelim

Bu tür saldırıları önlemek için, HTML karakterlerinin doğru bir şekilde temizlenmesi gereklidir. htmlspecialchars() fonksiyonunu kullanmak daha etkili bir çözüm olabilir, çünkü bu fonksiyon sadece belirli HTML karakterlerini dönüştürmekle kalmaz, aynı zamanda JavaScript enjeksiyonuna karşı da koruma sağlar. İşte güncellenmiş kod şu şekildedir:

<?php 
require_once '../header.php';

if (isset($_POST["name"])) {
echo "HELLO ".htmlspecialchars($_POST["name"], ENT_QUOTES, 'UTF-8');
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Your name:<input type="text" name="name" />
<input type="submit" name="submit"/>
</form>

<?php
require_once '../footer.php';
?>

Bu güncelleme ile kullanıcı tarafından girilen veri, HTML karakterlerine dönüştürülerek zararlı kodun çalışması engellenir. Örneğin, " onmouseover="alert(1); girdisi, sayfada &quot; onmouseover=&quot;alert(1); olarak görüntülenir ve tarayıcıda çalışmaz.

Evet, bir yazının daha sonuna gelmiş bulunmaktayız. Example 9'un çözümünü ne kadar uğraştıysam da yapamadığım için eğer sizler çözebildiyseniz bana geri dönüş yapmanızı çok isterim. Umarım içerik sizler için faydalı olmuş ve ilginizi çekmiştir. Bir sonraki yazılarda görüşmek üzere sağlıcakla kalın :)

--

--