XSS TEST CASE

4 months ago 52
BOOK THIS SPACE FOR AD
ARTICLE AD

Mehmet Faris Acar

Merhabalar, ben Mehmet Faris. Gallipoli Bug Bounty topluluğunun ilk task’i olarak bu blog yazısını hazırladım. Keyifli okumalar:)

1- VPS Deploy Etme

2-Reflected XSS, Stored XSS ve DOM XSS test caselerini VPS üzerinde çalıştırma.

VPS olarak Amazon’u kullandım.

Kayıt olduktan sonra Services->Compute->EC2 kısmına geliyoruz.

Launch instance butonuna basıyoruz.

Karşımıza gelen sayfada işletim sistemini seçiyoruz. Ubuntu işletim sistemini seçerek devam ediyorum.

İşletim sistemi seçiminden sonra kendimize ait bir Key pair oluşturuyoruz.

Key Pair Type:RSA

Private Key File Format: .pem

Create key pair butonuna bastıktan sonra (key pair).pem uzantılı dosya iniyor. Bu dosya ssh ile bağlantı yapılabilmesi için kullanılacak.

Allow SSH traffic from, Allow HTTPS traffic from the internet, Allow HTTP traffic from the internet butonlarını seçiyoruz.

Launch instance butonuna basıyoruz ve Instances kısmına gelerek kullanmaya başlayabiliriz.

Connect butonuna basarak bağlanıyoruz.

Ayrıca SSH bağlantısı da kurabiliriz.

ssh -i .\(key pair).pem (username)@IPADDRESS

Web sunucusu olarak apache’yi kullandım.

sudo apt update
sudo apt install apache2
sudo systemctl start apache2
sudo systemctl enable apache2

XSS(Cross-Site Scripting), bir saldırganın, bir web uygulamasına kötü amaçlı komut dosyaları eklemesine izin veren bir güvenlik açığıdır. Bu tür saldırılar, kullanıcıların tarayıcılarında zararlı JavaScript kodlarının çalıştırılmasına neden olabilir. XSS saldırıları, genellikle kullanıcı girdilerinin yeterince doğrulanmaması veya filtrelenmemesi sonucunda meydana gelir ve oturum bilgilerini çalma, sahte içerik gösterme, kimlik bilgilerini ele geçirme gibi güvenlik risklerine yol açabilir. XSS saldırıları üç türde sınıflandırılır:

Reflected XSS , Stored XSS ,DOM XSS.

Reflected XSS, saldırganın zararlı komut dosyalarını (genellikle JavaScript) bir web uygulamasına enjekte ettiği ve bu komut dosyalarının hemen kullanıcıya geri döndüğü bir tür XSS(Cross-Site Scripting) saldırısıdır. Bu tür saldırılar, genellikle URL parametreleri, form girişleri veya HTTP başlıkları aracılığıyla gerçekleştirilen ve web sunucusunun bu girdileri yetersiz doğrulama veya filtreleme ile yanıt olarak geri döndüğü durumlarda meydana gelir.

Nasıl Çalışır?

Saldırı Hazırlığı: Saldırgan, zararlı kodu içeren özel bir URL oluşturur.

Kurbanın Tetiklenmesi: Saldırgan, bu URL’yi kurbana e-posta, sosyal medya veya başka bir iletişim kanalı aracılığıyla gönderir. Kurban, URL’ye tıkladığında, zararlı kod web sunucusuna gönderilir.

Yansıma ve Çalıştırma: Web sunucusu, zararlı kodu yanıtın bir parçası olarak kullanıcıya geri gönderir. Kullanıcının tarayıcısı, bu yanıtı alır ve içindeki zararlı kodu çalıştırır.

PHP kurulumunu yapalım:

sudo apt install php<!DOCTYPE html>
<head>
<title>RXSS</title>
</head>
<body>
<h1>Reflected XSS GET</h1>

<form method="GET" action="">
<label for="name">Name:</label>
<input type="text" name="name">

<label for="surname">Surname:</label>
<input type="text" name="surname">

<input type="submit" value="Submit">
</form>
<?php

if(isset($_GET['name']) || isset($_GET['surname']))
{
$name= $_GET['name'];
$surname= $_GET['surname'];
echo "<p>Merhaba, " .$name . "" . $surname . ":)</p>";
}
?>
</body>
</html>

Burada kullanıcıdan “name” ve “surname” bilgileri alınmakta ve doğrudan sayfada görüntülenmektedir. Kullanıcı “name” ve “surname” alanlarına herhangi bir veri girdiğinde, bu veri URL üzerinden GET parametreleriyle gönderilir ve sayfada yansıtılır.

Payload : <script>alert(1)</script><!DOCTYPE html>
<head>
<title>RXSS</title>
</head>
<body>
<h1>Reflected XSS POST</h1>

<form method="POST" action="">
<label for="name">Name:</label>
<input type="text" name="name">

<label for="surname">Surname:</label>
<input type="text" name="surname">

<input type="submit" value="Submit">
</form>

<?php

if (isset($_POST['name']) || isset($_POST['surname']))
{

$name = $_POST['name'];
$surname = $_POST['surname'];
echo "<p>Welcome My World, " . $name . " " . $surname . ":)</p>";
}
?>
</body>
</html>

Kullanıcı “name” ve “surname” alanlarına herhangi bir veri girdiğinde, bu veriler POST yöntemiyle gönderilir. POST yöntemi ile gönderilen bu veriler, sunucu tarafından işlenir ve sayfaya yansıtılır.

Payload : <script>alert(1)</script><?php
// Kullanıcının User-Agent bilgisini al
$user_agent = $_SERVER['HTTP_USER_AGENT'];

// HTTP yanıt başlığına User-Agent bilgisini ekle
header("X-Custom-Header: $user_agent");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RXSS HEADER INJECTION</title>
</head>
<body>
<h1>RXSS HEADER INJECTION</h1>
<p>Your User-Agent is: <?php echo $user_agent; ?></p>
</body>
</html>

Burada kullanıcının tarayıcısının User-Agent bilgisini alır ve bu bilgiyi hem HTTP yanıt başlığına hem de HTML içeriğine ekler.

Payload: User-Agent:<script>alert(1)</script>

Stored XSS, saldırganın zararlı komut dosyalarını (genellikle JavaScript) doğrudan bir web uygulamasının veritabanına veya başka bir kalıcı depolama alanına enjekte ettiği bir tür XSS(Cross-Site Scripting) saldırısıdır. Bu zararlı kod, daha sonra uygulamanın diğer kullanıcıları tarafından erişildiğinde çalıştırılır. Stored XSS saldırıları, forumlar, yorum bölümleri veya kullanıcı profilleri gibi kullanıcıların içerik girebildiği ve bu içeriklerin başkalarına gösterildiği yerlerde sıklıkla görülür. Bu saldırı türü, oturum çalma, kimlik avı ve veri hırsızlığı gibi ciddi güvenlik risklerine yol açabilir.

Burada öncelikle veritabanı ile uğraşacağımız için mysql kurulumunu yapalım:

sudo apt update
sudo apt install mysql-server
sudo systemctl start mysql
<?php
$servername = "";//Burayı kendinize göre doldurun.
$username = "";//Burayı kendinize göre doldurun.
$password = "";//Burayı kendinize göre doldurun.
$dbname = "";//Burayı kendinize göre doldurun.

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
?>

<?php
include '';//Database bağlantılarını yaptığınız php sayfasını yazın.

$sql = "TRUNCATE TABLE (Table Name)";

if ($conn->query($sql) === TRUE) {
echo "Kullanıcılar başarıyla silindi.";
} else {
echo "Hata: " . $conn->error;
}

$conn->close();
header("Location:");//Input alanının bulunduğu php sayfasını yazın.
exit();
?>

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

include '';//Database bağlantılarını yaptığınız php sayfasını yazın.

if ($_SERVER["REQUEST_METHOD"] == "GET" && isset($_GET['name'])) {
$name = $_GET['name'];

$sql = "INSERT INTO (Table Name) (name) VALUES ('$name')";

if ($conn->query($sql) === TRUE) {
echo "Yeni kayıt başarıyla oluşturuldu.";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SXSS GET</title>
</head>
<body>
<h1>STORED XSS GET</h1>
<form action="" method="GET">
<label for="name">İsim:</label>
<input type="text" id="name" name="name" required>
<button type="submit">Ekle</button>
</form>

<table border="1">
<tr>
<th>ID</th>
<th>İsim</th>
</tr>
<?php
$sql = "SELECT id, name FROM (Table Name)";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id"]. "</td><td>" . $row["name"]. "</td></tr>";
}
} else {
echo "<tr><td colspan='2'>Kayıt yok</td></tr>";
}
?>
</table>

<form action="" method="POST"> //action kısmına kullanıcıların silinmesi için oluşturulmuş php sayfasını yazın.
<input type="hidden" name="sil" value="1">
<button type="submit">Kullanıcıları Sil</button>
</form>
</body>
</html>
<?php
$conn->close();
?>

Payload: <script>alert(1)</script><?php
$servername = "";//Burayı kendinize göre doldurun.
$username = ""; //Burayı kendinize göre doldurun.
$password = ""; //Burayı kendinize göre doldurun.
$dbname = ""; //Burayı kendinize göre doldurun.

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
die("Bağlantı hatası: " . $conn->connect_error);
}
?>

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>

<?php
include '';//Database bağlantılarını yaptığınız php sayfasını yazın

if ($_SERVER["REQUEST_METHOD"] == "POST") {
$sql = "TRUNCATE TABLE (Table Name)";

if ($conn->query($sql) === TRUE) {
echo "Kullanıcılar başarıyla silindi.";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}

$conn->close();
header("Location: ");//Input alanının bulunduğu php sayfasını yazın.
exit();
} else {
echo "Bu sayfaya doğrudan erişim mümkün değil.";
}
?>

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

include '';//Database bağlantılarını yaptığınız php sayfasını yazın.

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['name'])) {
$name = $_POST['name'];

$sql = "INSERT INTO (Table Name)(name) VALUES ('$name')";

if ($conn->query($sql) === TRUE) {
echo "Yeni kayıt başarıyla oluşturuldu.";
} else {
echo "Hata: " . $sql . "<br>" . $conn->error;
}
}

?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>SXXS POST</title>
</head>
<body>

<form action="" method="POST">
<h1>STORED XSS POST</h1>
<label for="name">İsim:</label>
<input type="text" id="name" name="name" required>
<button type="submit">Ekle</button>
</form>

<table border="1">
<tr>
<th>ID</th>
<th>İsim</th>
</tr>
<?php
$sql = "SELECT id, name FROM (Table Name)";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id"]. "</td><td>" . $row["name"]. "</td></tr>";
}
} else {
echo "<tr><td colspan='2'>Kayıt yok</td></tr>";
}
?>
</table>

<form action="" method="POST">//action kısmına kullanıcıların silinmesi için oluşturulmuş php sayfasını yazın.
<input type="hidden" name="sil" value="1">
<button type="submit">Kullanıcıları Sil</button>
</form>
</body>
</html>
<?php
$conn->close();
?>

Payload: <script>alert(1)</script><?php
$servername = "";//Burayı kendinize göre doldurun.
$username = "";//Burayı kendinize göre doldurun.
$password = "";//Burayı kendinize göre doldurun.
$dbname = "";//Burayı kendinize göre doldurun.

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

if (isset($_POST['show'])) {
$referrer = $_SERVER['HTTP_REFERER'];
echo "Referrer Header: " . $referrer;
}

if (isset($_POST['save'])) {
$referrer = $_SERVER['HTTP_REFERER'];
$sql = "INSERT INTO (Table Name) (header_value) VALUES ('$referrer')";
if ($conn->query($sql) === TRUE) {
echo "Header saved successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}

if (isset($_POST['delete'])) {
$sql = "DELETE FROM (Table Name)";
if ($conn->query($sql) === TRUE) {
echo "Headers deleted successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
}

$conn->close();
?>
<!DOCTYPE html>
<html>
<head>
<title>SXSS HEADER INJECTION</title>
</head>
<body>
<form method="post">
<button type="submit" name="show">Show Referrer Header</button>
<button type="submit" name="save">Save Referrer Header to Database</button>
<button type="submit" name="delete">Delete Headers from Database</button>
</form>
</body>
</html>

DOM XSS, bir saldırganın zararlı komut dosyalarını web sayfasının Document Object Model’ine (DOM) enjekte ettiği bir tür XSS(Cross-Site Scripting) saldırısıdır. Bu saldırı, genellikle istemci tarafında (tarayıcıda) gerçekleşir ve zararlı kod, JavaScript ile doğrudan DOM üzerinde değişiklik yaparak çalıştırılır. Sunucu bu işlemde doğrudan yer almaz. DOM XSS saldırıları, özellikle JavaScript kodunun kullanıcı girdilerini doğru şekilde işlememesi durumunda ortaya çıkar ve oturum çalma, veri hırsızlığı gibi ciddi güvenlik açıklarına neden olabilir.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DXSS GET</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>DOM-XSS GET</h1>

<a id="backLink">:)</a>

<script>
$(function() {
const params = new URLSearchParams(window.location.search);
const returnPath = params.get('returnPath');
if (returnPath) {
$('#backLink').attr('href', returnPath);
}
});
</script>
</body>
</html>

Payload: returnPath=javascript:alert(1)<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOM XSS POST</title>
</head>
<body>
<h1>DOM XSS POST</h1>
<form id="form" method="POST">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<button type="submit">Submit</button>
</form>
<div id="output"></div>

<script>
document.getElementById('form').addEventListener('submit', function(event) {
event.preventDefault();

var name = document.getElementById('name').value;
document.getElementById('output').innerHTML = name;
});
</script>
</body>
</html>

Payload: <form><button formaction="javascript:alert(1)">Click me</button></form><!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DOM XSS HEADER</title>
</head>
<body>

<h1 id="user-agent-header"></h1>
<script>
// PHP ile user agent değerini JavaScript değişkenine aktar
var userAgent = '<?php echo $_SERVER['HTTP_USER_AGENT']; ?>';
// Değeri DOM'a yerleştir
document.getElementById('user-agent-header').innerHTML = 'User Agent: ' + userAgent;
</script>
</body>
</html>

Payload: User-Agent:</script><script>alert(1)</script>

Uygulamalara http://bugbountytask.xyz sitemden ulaşabilirsiniz.

Read Entire Article