Merhabalar ben saldırı timlerinden Bunjo, bu konuda bir mysql sunucusu kurup içine gerekli veirleri yerleştirip bir login bypass yapacağız.
Veritabanının ne olduğunu anlatmayı tercih etmiyorum. Burada hali hazırda anlattığım bir konu var inceleyebilirsiniz.
Konu için tıklayınız
MySQL Sunucusu Kurulması
Eğer Kali Linux veya Parrot OS gibi gibi sistemler kullanıyorsanız "mysql" kurulu olarak gelecektir.
İşlemleri yaparken root kullanıcı içerisinde olmanızı öneririm.
MySQL sunucumuzu başlatalım.
Bash:
sudo service mysql start
Şimdi ise sunucumuza giriş yapalım
Bash:
mysql -u root
databaseleri görüntüleyelim.
SQL:
SHOW DATABASES;
default olarak kurulu gelen databaseler;
CoffeeScript:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
bizim bunlarla işimiz kendi databasemizi oluşturalım.
SQL:
CREATE DATABASE bunjo;
Şimdi de kullanıcı verilerimizi bulunduracağımız tablomuzu oluşturalım.
SQL:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL
);
kontrol edelim.
SQL:
SHOW COLUMNS FROM users;
evet kolonlarımız ve tablolarımız başarılı bir şekilde oluşturuldu şimdi ise içerilerine admin kullanıcısını ekleyelim.
SQL:
INSERT INTO users (username,password) VALUES ("admin", "12345")
şuan işlem tamamlandı kapatabilirsiniz terminali fakat değerleri görüntülemek istiyorum derseniz;
SQL:
SELECT * FROM users;
Evet bu kısımlık her şey hazır şimdi ise herhangi bir websitesi kodlayalım.
Not:
SQL:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'yeni_şifre';
komutu ile root kullanıcı şifrenizi değiştirebilirsiniz.
Login Panel Kısmı
Dosya ağacı:
şimdi ise basit bir admin login paneli kodlayacağız.
admin.php
HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
form {
background-color: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 8px;
}
input {
width: 100%;
padding: 8px;
margin-bottom: 16px;
box-sizing: border-box;
}
input[type="submit"] {
background-color: #3498db;
color: #fff;
padding: 10px;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type="submit"]:hover {
background-color: #2980b9;
}
</style>
</head>
<body>
<form method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="Login" name="login">
</form>
</body>
</html>
Site:
evet böyle tatlı gözüken bir site yazdık. Şimdi php ile database içerisinde sorgu yapan kodu yazalım.
aklı yerinde olan bir admin sql sorgusu için root kullanıcısı kullanmaz, bunun farklı bir kullanıcı oluşturur ve yetkilerini ona göre ayarlar.
Mesela database oluşturma veya silme yetkisini eklemez ( umarım )
Ben örnek bir anlatım yaptığım için root kullanıcısı ile direkt oturumu sağlıyorum.
PHP:
PHP:
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$servername = "localhost";
$dbname = "bunjo";
$db_usr = "root";
$db_pass = "";
$conn = new mysqli($servername, $db_usr, $db_pass, $dbname);
if ($conn->connect_error) {
die("Error:" . $conn->connect_error);
}
$username = $_POST["username"];
$password = $_POST["password"];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "Logged in.";
exit();
} else {
$error = "Invalid username or password.";
}
$conn->close();
}
?>
Tüm Kod:
PHP:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Admin</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
form {
background-color: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
label {
display: block;
margin-bottom: 8px;
}
input {
width: 100%;
padding: 8px;
margin-bottom: 16px;
box-sizing: border-box;
}
input[type="submit"] {
background-color: #3498db;
color: #fff;
padding: 10px;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type="submit"]:hover {
background-color: #2980b9;
}
</style>
</head>
<body>
<form method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="Login" name="login">
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$servername = "localhost";
$dbname = "bunjo";
$db_usr = "root";
$db_pass = "";
$conn = new mysqli($servername, $db_usr, $db_pass, $dbname);
if ($conn->connect_error) {
die("Error:" . $conn->connect_error);
}
$username = $_POST["username"];
$password = $_POST["password"];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "Logged in.";
exit();
} else {
$error = "Invalid username or password.";
echo "<div style='color: red;'>$error</div>";
}
$conn->close();
}
?>
</form>
</body>
</html>
bu kodda form ile alınan username ve password değişkenleri oturum açılan sql sunucusunda sorgulanıyor, eşleşme bulunursa giriş yapıldı yazdırıyor.
Başka sitelerde admin panele yönlendirir sayfa ekle sil gibi birçok menü bulunur.
Şimdi kodumuzu test edelim.
bildiğimiz admin ve 12345 şifresi ile oturum açıyoruz.
Evet oturum açma işlemi başarıyla çalışıyor.
Evet artık database yazmayı ve üstüne de php ile sorgu yapmayı öğrendiğimize göre şimdi bu güvenlik açığı barındıran kodda nasıl bir enjeksiyon işlemi yapılıyor bunu görelim.
Admin Panel İçin Bypass
Burada kafanıza "admin paneli nasıl bulacağız?" gibi bir soru takılırsa hemen onunda cevabını vereyim.
piyasada çeşitli admin panel finderler var bunları kullanabilirsiniz ayrı olarak dizin bulma araçlarını da kullanabilirsiniz mesela dirsearch
bu komutla indirdikten sonra hedef siteyi -u parametresi ile veriyoruz.
buyurun efendim size admin panel.
evet şimdi hiçbir şey bilmiyormuş gibi sayfaya giriş yapalım.
giriş yapıp random bir şeyler denediniz ama çalışmadı elbette
şimdi siz bu random işlemleri yapınca arka da dönen php sorgusunu inceleyelim.
Başka sitelerde admin panele yönlendirir sayfa ekle sil gibi birçok menü bulunur.
Şimdi kodumuzu test edelim.
bildiğimiz admin ve 12345 şifresi ile oturum açıyoruz.
Evet oturum açma işlemi başarıyla çalışıyor.
Evet artık database yazmayı ve üstüne de php ile sorgu yapmayı öğrendiğimize göre şimdi bu güvenlik açığı barındıran kodda nasıl bir enjeksiyon işlemi yapılıyor bunu görelim.
Admin Panel İçin Bypass
Burada kafanıza "admin paneli nasıl bulacağız?" gibi bir soru takılırsa hemen onunda cevabını vereyim.
piyasada çeşitli admin panel finderler var bunları kullanabilirsiniz ayrı olarak dizin bulma araçlarını da kullanabilirsiniz mesela dirsearch
Bash:
apt install dirsearch
bu komutla indirdikten sonra hedef siteyi -u parametresi ile veriyoruz.
buyurun efendim size admin panel.
evet şimdi hiçbir şey bilmiyormuş gibi sayfaya giriş yapalım.
giriş yapıp random bir şeyler denediniz ama çalışmadı elbette
şimdi siz bu random işlemleri yapınca arka da dönen php sorgusunu inceleyelim.
PHP:
$username = $_POST["username"];
$password = $_POST["password"];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
bakın burada post input kutularından yani kullanıcı adı ve şifre girdiğiniz o kutucuklardan yazdığınız veri değişkene aktarılıyor örneğin
username: admin
password: roketatar
şeklinde yazarsanız arka da dönen php sorgusu şu olacaktır:
evet dönen sorgu bu.
Peki ya bu sorgu yapılırken saldırganın girebileceği AND OR ' gibi karakterler engellenmezse ne olur?
bakın burada yazdığım şey şu:
roketatar' OR 1=1-- -
' ile roketatarın başında bulunan tırnağı kapattım.
daha sonra eğer şifre yanlışsa false dönecek fakat OR operatöründe en az bir adet doğru bulunduğunda bile tüm sorguyu true yapar.
1 değeri de 1 e eşit olduğundan dolayı buradan true dönecek yani kod şöyle olacak:
fasle OR true-- -
burada -- - ifadesi de yorum satırı haline getirilir yani yorum satırları detleyici ya da yorumlayıcı tarafından çalıştırılmaz
bunu eklemeseydik
'roketatar' OR 1=1' şeklinde sorgu olacaktı ve bir adet ' fazla olduğu için hata alacaktık ama biz -- - ekleyerek bu tırnağı yorum satırına alıyoruz ve sorun çözülüyor.
şimdi bakalım password kısmına:
username: admin
password: roketatar' OR 1=1-- -
yazalım ve deneyelim.
artık siz de bir adminsiniz hemde şifreyi bilmeden
Okuduğunuz için teşekkür ederim.
emeğe karşılık konuyu beğenip yorum atınız.
username: admin
password: roketatar
şeklinde yazarsanız arka da dönen php sorgusu şu olacaktır:
SQL:
SELECT * FROM users WHEREN username='admin' AND password='roketatar'
evet dönen sorgu bu.
Peki ya bu sorgu yapılırken saldırganın girebileceği AND OR ' gibi karakterler engellenmezse ne olur?
SQL:
SELECT * FROM users WHEREN username='admin' AND password='roketatar' OR 1=1-- -
bakın burada yazdığım şey şu:
roketatar' OR 1=1-- -
' ile roketatarın başında bulunan tırnağı kapattım.
daha sonra eğer şifre yanlışsa false dönecek fakat OR operatöründe en az bir adet doğru bulunduğunda bile tüm sorguyu true yapar.
1 değeri de 1 e eşit olduğundan dolayı buradan true dönecek yani kod şöyle olacak:
fasle OR true-- -
burada -- - ifadesi de yorum satırı haline getirilir yani yorum satırları detleyici ya da yorumlayıcı tarafından çalıştırılmaz
bunu eklemeseydik
'roketatar' OR 1=1' şeklinde sorgu olacaktı ve bir adet ' fazla olduğu için hata alacaktık ama biz -- - ekleyerek bu tırnağı yorum satırına alıyoruz ve sorun çözülüyor.
şimdi bakalım password kısmına:
username: admin
password: roketatar' OR 1=1-- -
yazalım ve deneyelim.
artık siz de bir adminsiniz hemde şifreyi bilmeden
Okuduğunuz için teşekkür ederim.
emeğe karşılık konuyu beğenip yorum atınız.
Son düzenleme: