BOOK THIS SPACE FOR AD
ARTICLE ADMerhabalar ben Acar. Gallipoli bug bounty topluluğumuzun ilk taski ile karşınızdayım. Benim için önemli olan ve geçen her gün daha çok şey öğrendiğim bu tupluluğumuzun bana verdiği task olan XSS Test Case blogunu sizlere sunarım.
1-Bir Virtual Private Server ‘a kodlarımızı yükleyip test edebileceğimiz bir ortam hazırlamak.
2-Reflected , Stored ve Dom-Based olmak üzere 3 başlık ve hepsinin altında 3 er tane olmak üzere get , post ve header injection test caseleri hazırlayıp bunları VPS’e yüklemek.
3-Yaparken kullandıklarım , kullanma yöntemlerim veya nasıl yaptığımla alakalı bilgileri yaşadığım macerayla beraber buraya aktarmak.
Öncelikle VPS açabileceğim bir yer lazımdı fakat benim aklımda olan Digital Ocean ön plandaydı. Neredeyse hiç düşünmeden Digital Ocean üzerinden hesabımı açmaya başladım.
a)Digital Ocean Üzerinden Hesap Açma: Sanal kartımız ile kredi kartı bilgilerini dolduruyoruz. Yaklaşık olarak 12$ gibi bir para kesiyor fakat 10 dakika olmadan geri yatırıyorlar. Digital Ocean kullanmamın bir başka sebebi ise 2 ay geçerli olan 200$ credit.
b)Digital Ocean Üzerinden Droplet Açma: Hesabı kurduktan sonra yan tarafta Droplets yazan bir kısım var oraya basıp ardından create droplet diyoruz. Gelen ekran üzerinde en başta choose region kısmı var genel olarak Frankfurt veya Amsterdam seçildiğini gördüm yine de size kalmış bir şey. Ubuntu seçip 24.04 LTS versiyonu ile devam ettim. Bir ödeme planı seçtikten sonra hostnamemi ve şifremi ayarlayıp serverin açılmasını bekledim.
c)Droplet Ayarları: Digital ocean üzerinden de serverinize bağlanabilirsiniz ama biraz kasıyormuş gibi gözükmesini ben beğenmedim. Bu yüzden Windowsumdaki WSL üzerinden ssh ile bağlandım. Bunu;
ssh root@serveripRoot Digital Oceanın bize belirlediği isim root olduğu için direkt bu şekilde bağlanmaya çalışıyoruz. Bizden şifre isteyince şifremizi girip servera giriyoruz. Ben servera girer girmez bulunduğum yere ve dosyalara baktım bunları;
pwdls
la
komutlarını kullanarak yaptım ve asıl yapmam gereken işe başladım. Önce Apache indirdim web sunucusunun çalışıp çalışmadığını kontrol ettim. Apache için;
sudo apt updatesudo apt install apache2
sudo systemctl start apache2
Şimdi de sunucumda çalışması için php ve sql indirmem gerekliydi.
sudo apt install phpsudo apt install mysql
Artık sunucum için test caseler dışında her şey hazırdı. Hemen test caselerin hazırlanmasına geçtim.
Ne kadar web dillerinden azar azar bilsem de herhangi bir dili çok biliyorum diyemem buna html veya php de dahil. Bu yüzden ChatGPT’ den yardım alarak test caselerimi hazırlamaya başladım. İlk olarak az çok bilsem bile daha detaylı bir araştımanın ödevime daha fazla katkısı olacağını düşünüp XSS modellerini araştırdım.
Reflected XSS bir web uygulamasında kullanıcı girdilerinin doğrudan geri dönüş yapılan sayfalara yansıtıldığı ve kullanıcı tarafından sağlanan kötü niyetli kodların tarayıcıda çalıştırılmasına olanak tanıyan bir güvenlik açığıdır.
Reflected XSS Post İnjection Test Case
http://206.189.49.19/rxss_post_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>RXSS - POST Injection</title>
</head>
<body>
<h1>RXSS - POST Injection</h1>
<form method="post" action="">
<label for="input">Arama:</label>
<input type="text" id="input" name="search">
<button type="submit">Ara</button>
</form>
<hr>
<div>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$search = $_POST["search"];
echo "<p>Sonuçlar: $search</p>";
}
?>
</div>
</body>
</html>
Reflected XSS Get İnjection Test Case
http://206.189.49.19/rxss_get_injection.php
!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>RXSS - GET Injection</title>
</head>
<body>
<h1>RXSS - GET Injection</h1>
<?php
if (isset($_GET["search"])) {
$search = $_GET["search"];
echo "<p>Sonuçlar: " . htmlspecialchars($search) . "</p>";
}
?>
</body>
</html>
Reflected XSS Header İnjection Test Case
http://206.189.49.19/rxss_header_injection.php
<?php header("X-XSS-Protection: 0"); ?><!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<title>RXSS - Header Injection</title>
</head>
<body>
<h1>RXSS - Header Injection</h1>
<form method="get" action="">
<label for="input">Arama:</label>
<input type="text" id="input" name="search">
<button type="submit">Ara</button>
</form>
<hr>
<div>
<?php
if (isset($_GET["search"])) {
$search = $_GET["search"];
echo "<p>Sonuçlar: $search</p>";
}
?>
</div>
</body>
</html>
Yazılan kodlarda bir alert kodu çalıştırdığımızda çalışıyor. Kodlarda açık bulunmasının ana sebebi kodların kullanılma yöntemi. Daha farklı opsiyonlar olmasına rağmen seçilen güvensiz yollar yüzünden açık oluşabiliyor.
Stored XSS (Stored Cross-Site Scripting), web uygulamalarında kullanıcı tarafından sağlanan kötü niyetli kodların (genellikle JavaScript) sunucuya kaydedilip, daha sonra başka kullanıcılar tarafından görüntülendiğinde tarayıcıda çalıştırılmasına olanak tanıyan bir güvenlik açığıdır. Bu tür XSS saldırıları, kullanıcıların girdiği verilerin güvenli bir şekilde işlenmemesi veya filtrelenmemesi sonucunda ortaya çıkar. Bana göre en tehlikeli XSS açığıdır.
Stored XSS Post İnjection Test Case
http://206.189.49.19/sxss_post_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>Stored XSS Injection Test - POST</title>
</head>
<body>
<h1>Stored XSS Injection Test - POST</h1>
<!-- Yorum ekleme formu -->
<h2>Yorum Ekle</h2>
<form method="post" action="">
<label for="comment">Yorum:</label><br>
<textarea id="comment" name="comment" rows="4" cols="50"></textarea><br>
<button type="submit">Gönder</button>
</form>
<?php
// Formdan gelen yorumu kaydet
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Formdan gelen yorumu al
$newComment = $_POST["comment"];
// Yeni yorumu güvensiz bir şekilde doğrudan ekrana yazdır
echo "<p>Yeni yorum: " . $newComment . "</p>";
}
?>
</body>
</html>
Stored XSS Get İnjection Test Case
http://206.189.49.19/sxss_get_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>Stored XSS Injection Test - GET</title>
</head>
<body>
<h1>Stored XSS Injection Test - GET</h1>
<?php
// URL'den "search" parametresini al
$search = $_GET['search'] ?? '';
// "search" parametresini güvensiz bir şekilde doğrudan ekrana yazdır
echo "<p>Arama sonuçları: " . $search . "</p>";
?>
</body>
</html>
Stored XSS Header İnjection Test Case
http://206.189.49.19/sxss_header_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>SXSS - Header Injection</title>
</head>
<body>
<h1>SXSS - Header Injection</h1>
<form method="get" action="">
<label for="input">Arama:</label>
<input type="text" id="input" name="search">
<button type="submit">Ara</button>
</form>
<hr>
<div>
<?php
if (isset($_GET["search"])) {
$search = $_GET["search"];
// Burada genellikle veritabanına kaydedilecek, simüle etmek için ekrana yazdırıyoruz
echo "<p>Sonuçlar: " . htmlspecialchars($search) . "</p>";
}
?>
</div>
</body>
</html>
Stored XSS yazdığımız kodun orada kalmasını sağlayarak sayfaya giren her kişinin cihazında çalışmasına neden olur. Bu da Stored XSS’i tehlikeli yapar.
DOM-Based XSS (DOM-Based Cross-Site Scripting), tarayıcı tarafında çalışan JavaScript kodu aracılığıyla gerçekleştirilen bir XSS türüdür. Bu tür XSS saldırıları, kullanıcı girdilerinin tarayıcı içinde doğrudan çalıştırılmasına dayanır. Web uygulamaları genellikle tarayıcıya gönderilen HTML, CSS ve JavaScript kodları aracılığıyla çalışır. Kullanıcı girdileri, bu kodlara doğrudan dahil edildiğinde ve gerekli güvenlik önlemleri alınmadığında, tarayıcıda kötü amaçlı kodların çalıştırılmasına izin verebilir. DOM-Based XSS, özellikle JavaScript kodunun doğrudan DOM (Document Object Model) üzerinde manipülasyon yapılarak gerçekleştirilir.
Dom-Based XSS Post İnjection Test Case
http://206.189.49.19/domxss_post_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>DOM-Based XSS - POST</title>
</head>
<body>
<h1>DOM-Based XSS - POST</h1>
<!-- Yorum ekleme formu -->
<h2>Yorum Ekle</h2>
<form method="post" action="">
<label for="comment">Yorum:</label><br>
<textarea id="comment" name="comment" rows="4" cols="50"></textarea><br>
<button type="submit">Gönder</button>
</form>
<script>
// Formdan gelen yorumu al
var newComment = <?php echo json_encode($_POST["comment"] ?? ''); ?>;
// DOM üzerinde yeni yorumu doğrudan yazdır (güvensiz)
document.write("<p>Yeni yorum: " + newComment + "</p>");
</script>
</body>
</html>
Dom-Based XSS Get İnjection Test Case
http://206.189.49.19/rxss_get_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>DOM-Based XSS - GET</title>
</head>
<body>
<h1>DOM-Based XSS - GET</h1>
<script>
// URL'den "query" parametresini al
var query = new URLSearchParams(window.location.search).get('query');
// DOM üzerinde query parametresini doğrudan yazdır (güvensiz)
document.write("<p>Aranan kelime: " + query + "</p>");
</script>
</body>
</html>
Dom-Based XSS Header İnjection Test Case
http://206.189.49.19/domxss_header_injection.php
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>DOM-Based XSS ve Header Injection Test</title>
</head>
<body>
<h1>DOM-Based XSS ve Header Injection Test</h1>
<script>
// URL'den "query" parametresini al
var query = new URLSearchParams(window.location.search).get('query');
// DOM üzerinde query parametresini doğrudan yazdır (güvensiz)
document.write("<p>Aranan kelime: " + query + "</p>");
// Header injection riski taşıyan başlık
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "handle.php?query=" + query, true);
xhttp.send();
</script>
</body>
</html>
Genel olarak kodların içindeki yorum satırlarında ne yapılması gerektiği yazdığı için ekstra yazmaya gerek duymadım okuduğunuz için teşekkürler.