BOOK THIS SPACE FOR AD
ARTICLE ADsudo apt install mysql
sudo apt install php-mysqli
1.1 Reflected XSS via Get Request
<!DOCTYPE html><html>
<head>
<title>Reflected XSS - GET Request</title>
</head>
<body>
<h1>Search Page</h1>
<form method="get" action="reflected-xss-get.php">
<label for="q">Search:</label>
<input type="text" id="q" name="q">
<button type="submit">Search</button>
</form>
<?php
if (isset($_GET['q'])) {
$q = $_GET['q'];
echo "<p>You searched for: " . $q . "</p>";
}
?>
</body>
</html>
Burada input olarak GET request ile girdiğimiz değerin response olarak bize yansıdığını fark ediyoruz. Girdiğimiz verileri sadece URL üzerinden kurbana gönderebiliriz.
Payload — <script>alert(‘xss’)</script>
1.2 Reflected XSS via Post Request
<!DOCTYPE html><html>
<head>
<title>Reflected XSS - POST Request</title>
</head>
<body>
<h1>Login Page</h1>
<form method="post" action="reflected-xss-post.php">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<br>
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<br>
<button type="submit">Login</button>
</form>
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['username'])) {
$username = $_POST['username'];
echo "<p>Welcome, " . $username . "!</p>";
}
?>
</body>
</html>
Burada direk URL üzerinden bir gönderim olmamakla beraber dolaylı olarak buradaki post isteğini tetikletmemiz gerekiyor.
Payload — <script>alert(‘xss’)</script>
1.3 Reflected XSS via Request Header
<!DOCTYPE html><html>
<head>
<title>Reflected XSS - HTTP Header</title>
</head>
<body>
<h1>Referer Header Example</h1>
<?php
if (isset($_SERVER['HTTP_REFERER'])) {
$referer = $_SERVER['HTTP_REFERER'];
echo "<p>You came from: " . $referer . "</p>";
}
?>
</body>
</html>
Bu örneği tespit edebilmemiz için herhangi bir header bilgisinin dönen response a eklenip eklenmediğini gözlemlememiz gerekir. Tespit ettiğimiz anda reflected olan header üzerinde payload çalıştırmaya çalışırız.
Payload — <script>alert(‘xss’)</script>
Bu caselerin çalışabilmesi için database üzerinde gerekli tabloları oluşturmanız gerek.
2.1 Stored XSS via Get Request
<!-- Yorum ekleme formu --><h2>Yorum Ekle</h2>
<form method="get" action="">
<input type="text" name="yorum" placeholder="Yorumunuzu yazın">
<input type="submit" value="Gönder">
</form>
<!-- Yorumları silme formu -->
<h2>Yorumları Sil</h2>
<form method="post" action="">
<input type="hidden" name="sil" value="1">
<input type="submit" value="Tüm Yorumları Sil">
</form>
<?php
// PHP hata ayıklama modunu etkinleştirme
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Veritabanı bağlantısı
$servername = ""; //bu kısımları kendiniz doldurmanız gerekiyor
$username = ""; //db bilgileri
$password = ""; //db bilgileri
$dbname = ""; //db bilgileri
// Bağlantıyı oluştur
$conn = new mysqli($servername, $username, $password, $dbname);
// Bağlantıyı kontrol et
if ($conn->connect_error) {
die("Bağlantı hatası: " . $conn->connect_error);
}
// GET isteğinden veri al ve veritabanına ekle
if (isset($_GET['yorum'])) {
$yorum = $_GET['yorum']; // XSS saldırılarına karşı hiçbir önlem alınmamış
// Veritabanına yorum ekle
$sql = "INSERT INTO comments (comment) VALUES ('$yorum')";
if ($conn->query($sql) === TRUE) {
echo "Yorum başarıyla kaydedildi!";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
// POST isteğinden veri al ve yorumları sil
if (isset($_POST['sil']) && $_POST['sil'] == 1) {
$sql = "DELETE FROM comments";
if ($conn->query($sql) === TRUE) {
echo " -- Tüm yorumlar silindi! -- ";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
// Kaydedilen yorumları getir ve göster
$sql = "SELECT comment FROM comments";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<h2>Kullanıcı Yorumları</h2>";
while($row = $result->fetch_assoc()) {
echo "<p>" . $row['comment'] . "</p>"; // XSS saldırılarına karşı hiçbir önlem alınmamış
}
} else {
echo "Henüz yorum yok.";
}
// Bağlantıyı kapat
$conn->close();
?>
Payload — <script>alert(‘xss’)</script>
2.2 Stored XSS via Post Request
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>Yorum Ekleme</title>
</head>
<body>
<!-- Yorum ekleme formu -->
<h2>Yorum Ekle</h2>
<form method="post" action="">
<input type="text" name="yorum" placeholder="Yorumunuzu yazın" required>
<input type="submit" value="Gönder">
</form>
<!-- Tüm yorumları silme formu -->
<h2>Tüm Yorumları Sil</h2>
<form method="post" action="">
<input type="hidden" name="delete_all" value="1">
<input type="submit" value="Tüm Yorumları Sil">
</form>
<?php
// PHP hata ayıklama modunu etkinleştirme
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Veritabanı bağlantısı
$servername = ""; //bu kısımları kendiniz doldurmanız gerekiyor
$username = ""; //db bilgileri
$password = ""; //db bilgileri
$dbname = ""; //db bilgileri
// Bağlantıyı oluştur
$conn = new mysqli($servername, $username, $password, $dbname);
// Bağlantıyı kontrol et
if ($conn->connect_error) {
die("Bağlantı hatası: " . $conn->connect_error);
}
// POST isteğinden veri al
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Yorum ekleme işlemi
if (isset($_POST['yorum'])) {
$yorum = $_POST['yorum']; // Burada XSS ve SQL Injection açıkları var
// Veritabanına yorum ekle
$sql = "INSERT INTO comments (comment) VALUES ('$yorum')";
if ($conn->query($sql) === TRUE) {
echo "Yorum başarıyla kaydedildi!";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
// Tüm yorumları silme işlemi
if (isset($_POST['delete_all']) && $_POST['delete_all'] == 1) {
$sql = "DELETE FROM comments";
if ($conn->query($sql) === TRUE) {
echo "Tüm yorumlar silindi!";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
}
// Kaydedilen yorumları getir ve göster
$sql = "SELECT comment FROM comments";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "<h2>Kullanıcı Yorumları</h2>";
while($row = $result->fetch_assoc()) {
echo "<p>" . $row['comment'] . "</p>"; // Burada XSS açığı var
}
} else {
echo "Henüz yorum yok.";
}
// Bağlantıyı kapat
$conn->close();
?>
</body>
</html>
Payload — <script>alert(‘xss’)</script>
2.3 Stored XSS via Request Header
<!DOCTYPE html><html lang="tr">
<head>
<meta charset="UTF-8">
<title>User-Agent Kaydetme ve Gösterme</title>
</head>
<body>
<h2>User-Agent Başlığını Kaydet</h2>
<form method="post" action="">
<input type="submit" name="kaydet" value="User-Agent Kaydet">
</form>
<h2>Tüm User-Agent Verilerini Sil</h2>
<form method="post" action="">
<input type="hidden" name="delete_all" value="1">
<input type="submit" value="Tüm User-Agent Verilerini Sil">
</form>
<h2>Kaydedilen User-Agent Başlıkları</h2>
<?php
// PHP hata ayıklama modunu etkinleştirme
ini_set('display_errors', 1);
error_reporting(E_ALL);
// Veritabanı bağlantısı
$servername = ""; //bu kısımları kendiniz doldurmanız gerekiyor
$username = ""; //db bilgileri
$password = ""; //db bilgileri
$dbname = ""; //db bilgileri
// Bağlantıyı oluştur
$conn = new mysqli($servername, $username, $password, $dbname);
// Bağlantıyı kontrol et
if ($conn->connect_error) {
die("Bağlantı hatası: " . $conn->connect_error);
}
// POST isteği kontrolü
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// User-Agent kaydetme işlemi
if (isset($_POST['kaydet'])) {
// User-Agent başlığını al
$userAgent = $_SERVER['HTTP_USER_AGENT']; // Güvenlik açığı var, kaçış işlemi yapılmıyor
// Veritabanına kaydet
$sql = "INSERT INTO user_agents (user_agent) VALUES ('$userAgent')";
if ($conn->query($sql) === TRUE) {
echo "User-Agent kaydedildi!";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
// Tüm User-Agent verilerini silme işlemi
if (isset($_POST['delete_all']) && $_POST['delete_all'] == 1) {
$sql = "DELETE FROM user_agents";
if ($conn->query($sql) === TRUE) {
echo "Tüm User-Agent verileri silindi!";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
}
// Kaydedilen User-Agent başlıklarını getir ve göster
$sql = "SELECT user_agent FROM user_agents";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<p>" . $row['user_agent'] . "</p>"; // Güvenlik açığı var, kaçış işlemi yapılmıyor
}
} else {
echo "Henüz User-Agent kaydı yok.";
}
// Bağlantıyı kapat
$conn->close();
?>
</body>
</html>
Payload — <script>alert(‘xss’)</script>
3.1 DOM-Based XSS via Get Request
<!DOCTYPE html><html>
<head>
<title>DOM XSS - GET Parametresi</title>
</head>
<body>
<h1>DOM XSS Örneği - GET Parametresi</h1>
<p id="output"></p>
<script>
// URL'den `param` değerini al
var params = new URLSearchParams(window.location.search);
var paramValue = params.get('param');
document.getElementById('output').innerHTML = "Girdiğiniz değer: " + paramValue;
</script>
</body>
</html>
Payload — <img src=x onerror=alert(‘xss’)>
3.2 DOM-Based XSS via Post Request
<!DOCTYPE html><html>
<head>
<title>DOM XSS - POST Parametresi</title>
</head>
<body>
<h1>DOM XSS Örneği - POST Parametresi</h1>
<form id="commentForm">
<input type="text" name="data" id="dataInput" placeholder="Bir şeyler yazın">
<input type="submit" value="Gönder">
</form>
<div id="output"></div>
<script>
// Form gönderildikten sonra JavaScript tarafından veri işleniyor
document.getElementById('commentForm').addEventListener('submit', function(event) {
event.preventDefault(); // Sayfanın yeniden yüklenmesini engelle
var inputData = document.getElementById('dataInput').value;
// Girdi doğrudan DOM'a ekleniyor ve çalıştırılıyor
document.getElementById('output').innerHTML = "Girdiğiniz değer: " + inputData;
// Değeri JavaScript olarak çalıştır
if (inputData) {
var script = document.createElement('script');
script.textContent = inputData;
document.body.appendChild(script);
}
});
</script>
</body>
</html>
Payload — <img src=x onerror=alert(‘xss’)>
3.3 DOM-Based XSS via Request Header
<?php// PHP hata ayıklama modunu etkinleştirme
ini_set('display_errors', 1);
error_reporting(E_ALL);
// User-Agent bilgisi alınıyor
$userAgent = $_SERVER['HTTP_USER_AGENT'];
?>
<!DOCTYPE html>
<html>
<head>
<title>DOM XSS - User-Agent Header</title>
</head>
<body>
<h1>DOM XSS Örneği - User-Agent Header</h1>
<p id="output"></p>
<script>
// PHP'den gelen User-Agent bilgisi
var userAgent = "<?php echo $userAgent; ?>";
// User-Agent bilgisi DOM'a ekleniyor
document.getElementById('output').innerHTML = "User-Agent: " + userAgent;
</script>
</body>
</html>
Payload — <img src=x onerror=alert(‘xss’)>