Manual Union Based SQL Injection! (Non-Oracle)

Bunjo

Uzman üye
14 Ara 2020
1,581
1,878
HTTParty

oqk18ir.png



c0sawob.png


lbn20fm.png
2q250vr.png


Merhabalar ben saldırı timlerinden Bunjo, bu yazıda konumuz "Union Based SQL Injection" olacaktır.
Daha önceden bununla alakalı bir yazım var fakat bu konu da daha ayrıntıya gireceğim.


Union Based SQL Injection

iwxqmay.png


"Union-Based SQL Injection," web uygulamalarındaki güvenlik açıklarını sömürerek veritabanlarına erişmeye çalışan bir saldırı türüdür.
Bu saldırı, kullanıcı tarafından sağlanan verilerin güvenli bir şekilde işlenmediği veya doğrulanmadığı durumlarda ortaya çıkar.

Web uygulamaları genellikle kullanıcı girişlerini veya form verilerini kullanarak veritabanı sorguları oluşturur. SQL enjeksiyonu, bu girişlerin kötü niyetli şekilde manipüle edilmesiyle gerçekleştirilir.
Union-Based SQL Injection saldırısı, UNION SQL operatörünün kullanılması ile gerçekleşir.

UNION operatörü, iki sorgunun sonuç kümesini birleştirmek için kullanılır. Saldırgan, hedef uygulamanın SQL sorgusunu manipüle ederek,
UNION operatörünü kullanarak kendi sorgusunu ekler ve veritabanından hassas bilgileri çekmeye çalışır.

Veritabanı İçin Kurulum

İnternette bulunan diğer yazılarda olduğu gibi zafiyeti anlatıp bırakmayacağım.
Sizin de uygulayarak öğrenebilmeniz adında ufak bir "MYSQL" sunucusu
içine kullanacağımız verileri ekleyelim.

Daha önce anlattığımda yapamayanlar olmuş onun için tekrardan daha detaylı şekilde anlatıyorum.

Kurulum esnasında eğer "root" kullanıcısı değilseniz, paylaştığım komutların başına "sudo" ekleyerek çalıştırabilirsiniz.

Ben Parrot OS işletim sistemini kullanacağım. Siz de büyük ihtimalle "Kali Linux"
kullanıyorsunuzdur.
Bu gibi debian tabanlı sistemlerde "mysql" kurulu olarak gelir, bu sebepten dolayı herhangi bir işlem yapma zorunluluğunuz bulunmuyor.

Şimdi mysql için bilgisayar servisini başlatacağız.

Bash:
service mysql start

5rgbnlo.png


"root" kullanıcısı içerisindeyseniz, "mysql" sunucunuza kolaylıkla giriş sağlayabilirsiniz.

Ben daha önceden bir anlatım yaptığım için root kullanıcıma tanımlı bir şifre var.
Eğer siz ilk defa bu sunucunuzu oluşturuyorsanız tanımlı bir şifre olmayacaktır.


Bash:
mysql -u root -h localhost

komutu ile "localhost" içerisinde çalışan bir sunucuda olduğunuzu ve buna "root" kullanıcı adı ile giriş yapacağınızı söylüyorsunuz.

Eğer daha önce bir şifreniz varsa ve şifreniz ile giriş yapmak istiyorsanız;


Bash:
mysql -u root -h localhost -p

Ben daha önceden bir şifre tanımladığım için bu komutu tercih edeceğim.

h488hwa.png


SQL:
SHOW DATABASES;

Bu komut ile MySQL sunucunuz içerisinde bulunan veritabanlarını listeleyebilirsiniz.

97czvc8.png


Burada yazan veritabaları default olarak kurulu gelen veritabanlarıdır. Biz bu veritabanlarına ellemeden kendi veritabanımızı oluşturalım.

SQL:
CREATE DATABASE bunjotht;

1p3ubi9.png


Oluşturduğumuz veritabanını kullanalım.

SQL:
USE bunjotht;

Şimdi ise tablomuzu oluşturalım.

SQL:
CREATE TABLE pages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    type VARCHAR(20),
    content TEXT
);

qpjkr5k.png


id, type, content kolonlarına sahip "pages" isimli bir tablo oluşturduk.
İçerisine veri dahil edelim.

SQL:
INSERT INTO pages (id,type,content) VALUES (1,"PROGRAMLAMA DILLERI","Ruby, Python, C, C++, C#, PHP");

SQL:
INSERT INTO pages (id,type,content) VALUES (2,"ULKELER","TURKIYE, KAZAKISTAN, TURKMENISTAN, AZERBAYCAN, OZBERKISTAN");

Şeklinde örnek olarak çeşitli eklemeler yaptım.

tgctncr.png


Verileri kontrol etmek isterseniz;

SQL:
SELECT * FROM pages;

pe4kv2x.png


admin içeriklerini eklemek için burada bulunan konumu kullanabilirsiniz.

Evet burada işimiz bitti komut satırını kapatabilirsiniz.


Web Sayfasının Kodlanması

Ufak görsel tasarım ile bir sayfa kodlayalım.

Dosya Ağacım:


2vtmhof.png


Diğer konular için kullandığım klasörler mevcut fakat burada "sqli" adlı bir klasör oluşturdum içine de "index.php" adlı bir php dosyası ekledim.

Şimdi sitemizi kodlayalım.


HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sayfalar</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Extrem Site</h1>
    
    </div>
</body>
</html>

Site görüntüsü:

nfg30hv.png


HTML ve CSS kodlarını açıklamıyorum. Bizim için önemli olan PHP kodları.


Veritabanı Sorgu İşlemi Yapılması

Şimdi de arkada işlem yapacak PHP kodumuzu yazalım.

PHP:
<?php
    $id = $_GET["id"];
?>

Sayfa içeriği görüntülenmesi için GET ile "id" değerini alıyoruz.

"index.php?id=1"

şeklinde girilecektir.


PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
            
    }
?>

Eğer "id" değeri girilmiş ise yapılacaklar için bir if bloğu açtım.

MYSQL sunucusu için bilgilerimi tanımlıyorum.


PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "bunjobunjo";
        $database_name = "bunjotht";
    }
?>

Sunucuya bağlantımızı kuralım.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "bunjobunjo";
        $database_name = "bunjotht";

        $conn = new mysqli($servername, $username, $password, $database_name);
    }
?>

Bağlantı kontrolü ekliyoruz ve eğer sunucuya bağlanıp komutu çalıştırıyoruz, dönen çıktı $result değişkenine atanıyor.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);
    }
?>

Şimdi de çıktıyı ekrana yazdıralım.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                echo "Tür: " . $row["type"] . "<br>" . "İçerik: " . $row["content"];
            }
        }
    }
?>

Site için bütün kod:

PHP:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sayfalar</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Extrem Site</h1>
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                echo "Tür: " . $row["type"] . "<br>" . "İçerik: " . $row["content"];
            }
        }
    }
?>
    </div>
</body>
</html>

Site testi:

c5curhi.png


Evet artık kurulumlarımız bittiğine göre zafiyeti sömürmeye başlayalım.

Zafiyetin Tespiti Ve Sömürülmesi

Bu kısımda sitenin içeriği ile alakalı bir bilgimiz olmadan hareket edeceğiz.

Siteye giriş yapalım.


uh4rjg0.png


URL kısmına baktığımız zaman bir id değeri alınıyor ve alınan değer ile alakalı veriler aşağıya yansıtılıyor.

c5curhi.png


Şimdi ise id değerini değiştirip bir üstünü yazalım.

eg8l7c3.png


2ekpr3m.png


Evet id değeri ile oynadığımız zaman gelen verilerin değiştiğini gördük.

Burada GET ile alınan bu id değerinin çeşitli verileri temsil etmek için kullanıldığını anlayabilirsiniz.

Şimdi id değerinin sonuna ' işareti koyalım ve arkada dönen sorguyu inceleyip bozmaya çalışalım.

Arkada dönen sorgu:

SQL:
SELECT * FROM pages WHERE id = 2

burada ' koyduğunuz zaman id değeri içn 2' değeri alınıyor ve bu database içerisinde sorgulanıyor fakat bir eşleşme bulunamadığı için NULL değeri döndürülüyor.

NULL verisi de sayfaya yazdırılmadığı için sayfa içerisinde herhangi bir veri olmuyor.

Genellikle okuduğunuz diğer makalelerde ' koyup açık bulabileceğiniz anlatılıyor.

Fakat id değeri burada integer(tam sayı) olarak alınıyor, eğer bir metin yani string olarak alınsaydı sorgu şöyle olacaktı:

SQL:
SELECT * FROM pages WHERE id = '2'

Ve bu sorgu dönerken id=2' değeri koyduğunuz zaman:

SQL:
SELECT * FROM pages WHERE id = '2''

Sorgu bu şekilde olacak ve "SYNTAX ERROR" gibi bir hata alacaksınız bu hata size

normalde olması gereken sorgunun '2' olduğunu fakat sizin '2'' girdiğinizden dolayı bir adet ' işareti arttığını ve bunun sorguyu bozduğunu anlatacak.

Fakat burada ben bu türden anlatmak istemedim zaten bunun gibi birçok anlatım mevcut ve aynı konuyu benim de açmışlığım var.

Konu:

CoffeeScript:
https://www.turkhackteam.org/konular/uygulamali-manual-sql-injection-1-in-band-sql-hacking.2053707/

Biz değerimizi tam sayı tipinde aldık. Şimdi temel mantığı anlattığıma göre sayfa da açık aramaya devam edelim.

OR ifadesi bir bağlaçtır ve kullanıldığı durumda bir ader TRUE değeri dönerse bütün sorguyu TRUE olarak döndürür.

id=5 OR 1=1 yaptığımız zaman:

Veritabanı içerisinde id değeri için 5 verisi varsa TRUE döner yoksa FALSE döner.

Test edelim:


qwlvczj.png


ajeanud.png


Bakın hiçbir veri sayfaya yansıtılmadı bu da bize id için 5 değerinin olmadığını gösteriyor. Şimdi OR kullanarak sorguya müdahele etmeye çalışalım.

kavzhi8.png


89cjrh2.png


Bütün içerik ekrana yansıtıldı gördüğünüz gibi.

id için 5 değeri sunucuda arandı ve bulunamayıp false döndü yani şuan:

fasle OR 1=1

ifadesi var 1 sayısı 1 sayısına eşit olduğu için buradan da true değeri döndğ:

false OR true

OR bağlacında bir adet true olması bütün sorguyu ture yapar diye söylemiştim ve sonuç:

true

olarak döndü ve bütün veriler bu sebepten dolayı ekrana yazdırıldı.

Database
Tablo
Kolon
Satır (Veri)

Şeklinde bir düzenimiz vardı veritabanımız içerisinde.

Database bağlantıda zaten kullanılıyor şuan o tabase içerisindeyiz.

Bu bağlantıda da tablo içerisinden bir sorgu yapılıyor yani tablonunda içerisindeyiz.

Ama kolon sayısını bilmiyoruz, "Tür" ve "İçerik" başlıkları altında veriler yansıtılsa bile belki de içeri de başka kolonlarda olabilir.

Şimdi kolon sayısını öğrenelim.

SQL:
ORDER BY

bu komut tipik SQL dilinde kolon sayılarını sıralamak için kullanılır.

order by 1 yazdığınız zaman 1. kolonu seçersiniz. 2,3,....n için de aynı şekilde geçerli.

hedefte OR komutunu çalıştırıp tüm sayfayı dökebildiğimize göre SQL sorguları çalıştırabiliyoruz.

Şimdi ise order by komutu ile kolon sayısını öğrenelim.



3u2ifka.png


Bu şekilde 1. kolonu seçiyorum ve sayfada herhangi bir veri gitmedi.

43u0zm6.png


2 için denedim site hala duruyor.

43u0zm6.png


et6c3t0.png


3 için deniyorum. (hata alana kadar ya da sayfa gidene kadar devam edeceksiniz arkadaşlar.)

3 için bir hata almadım 4 için deniyorum.

svbvwl6.png


rr9uy6d.png


Evet site gitti. Bu bize 3 adet kolon olduğunu gösteriyor çünkü 4. için denediğimizde false döndü ve hiçbir çıktı gelmedi, ama 3 yazdığımız zaman site geliyordu.

şimdi UNION SELECT kullanacağız. Bu komut arkada

SQL:
SELECT * FROM pages WHERE id = 1

sorgusu dönerken bizim de araya istediğimiz sorguyu sıkıştırmamızı sağlıyor kısacası.

3 adet kolon olduğu için union sorgusunu 3'e kadar yazıyorum.
Kod:
http://localhost/sqli/index.php?id=1 union select 1,2,3
1,2,3 değeri kolon numaralarımızı ifade ediyor.
Bu sorguyu yollayıp siteye bakalım.
pogwuqy.png


3tv5uzq.png


Tür: 2 ve İçerik: 3 olmak üzere yeni çıktılar eklenmiş bunlar bizim 1,2,3 kolonları için kolon numaralarımı temsil ediyor.

Burada bu 2 ve 3 ifadeleri sizin union için sorgu yaptığınız zaman 2 ve 3 kısmındaki sorgunun yansıtılacağı yeri gösteriyor.

Daha iyi anlamanız için 2 ve 3 yerinde database() ve version() komutlarını çalıtşıralım.


ed4ywl7.png


2zewbzw.png


version ve database ismi bilgisini öğrendiniz hayırlara vesile olsun.

Veritabanı içerisinde bulunan information_schema databasesi veritabanının köküdür.
veritabanınızda bulunan tablolar burada depolanır.
information_schema.tables içerisinde table_name anahtar kelime ile saklanır.

Şimdi bizde union sorgusuna bunu dahil edelim.

group_concat() kullanmazsanız bazen tüm tablolar gelmeye biliyor amacının ne olduğunu da anladınız.

CoffeeScript:
http://localhost/sqli/index.php?id=1 union select 1,group_concat(table_name),3 FROM information_schema.tables

şeklinde bir sorgu yapabilirsiniz ama information_schema içerisinde başka tablolarda var biz kendi databasemiz içerisindekileri istiyoruz.

CoffeeScript:
http://localhost/sqli/index.php?id=1 union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()
5v2x7ct.png


mikb2oz.png


Evet admin,pages isimli tablolar olduğunu öğrendik şimdi burada ben admin tablosuna girip admin kullanıcı adını ve şifresini alacağım.

jvhel7q.png


8l6xmgt.png


admin isimli tablo içerisinde "username" ve "pass" adlı kolonlar varmış.

Bu kolonların içeriklerini getirelim.

keadwyw.png



s9jui0w.png


Username: admin123
Password: 12345

olacak şekilde bulundu.

Bu konu bu kadardı umarım okursunuz.

Arkada dönen olaylarla beraber anlatmaya çalıştım fakat SQL dilini bilmeden bu yapılanları uygulamanız size zor gelebilir, ben burada her şeyi de anlatamam

Okuyan herkese teşekkür ederim. Emeğe karşılık konuyu beğenip yorum atarsanız iyi olur :)
 

QuatrexDefacer

Black Hat Junior
15 Eki 2022
591
360
Baku

oqk18ir.png



c0sawob.png


lbn20fm.png
2q250vr.png


Merhabalar ben saldırı timlerinden Bunjo, bu yazıda konumuz "Union Based SQL Injection" olacaktır.
Daha önceden bununla alakalı bir yazım var fakat bu konu da daha ayrıntıya gireceğim.


Union Based SQL Injection

iwxqmay.png


"Union-Based SQL Injection," web uygulamalarındaki güvenlik açıklarını sömürerek veritabanlarına erişmeye çalışan bir saldırı türüdür.
Bu saldırı, kullanıcı tarafından sağlanan verilerin güvenli bir şekilde işlenmediği veya doğrulanmadığı durumlarda ortaya çıkar.

Web uygulamaları genellikle kullanıcı girişlerini veya form verilerini kullanarak veritabanı sorguları oluşturur. SQL enjeksiyonu, bu girişlerin kötü niyetli şekilde manipüle edilmesiyle gerçekleştirilir.
Union-Based SQL Injection saldırısı, UNION SQL operatörünün kullanılması ile gerçekleşir.

UNION operatörü, iki sorgunun sonuç kümesini birleştirmek için kullanılır. Saldırgan, hedef uygulamanın SQL sorgusunu manipüle ederek,
UNION operatörünü kullanarak kendi sorgusunu ekler ve veritabanından hassas bilgileri çekmeye çalışır.

Veritabanı İçin Kurulum

İnternette bulunan diğer yazılarda olduğu gibi zafiyeti anlatıp bırakmayacağım.
Sizin de uygulayarak öğrenebilmeniz adında ufak bir "MYSQL" sunucusu
içine kullanacağımız verileri ekleyelim.

Daha önce anlattığımda yapamayanlar olmuş onun için tekrardan daha detaylı şekilde anlatıyorum.

Kurulum esnasında eğer "root" kullanıcısı değilseniz, paylaştığım komutların başına "sudo" ekleyerek çalıştırabilirsiniz.

Ben Parrot OS işletim sistemini kullanacağım. Siz de büyük ihtimalle "Kali Linux"
kullanıyorsunuzdur.
Bu gibi debian tabanlı sistemlerde "mysql" kurulu olarak gelir, bu sebepten dolayı herhangi bir işlem yapma zorunluluğunuz bulunmuyor.

Şimdi mysql için bilgisayar servisini başlatacağız.

Bash:
service mysql start

5rgbnlo.png


"root" kullanıcısı içerisindeyseniz, "mysql" sunucunuza kolaylıkla giriş sağlayabilirsiniz.

Ben daha önceden bir anlatım yaptığım için root kullanıcıma tanımlı bir şifre var.
Eğer siz ilk defa bu sunucunuzu oluşturuyorsanız tanımlı bir şifre olmayacaktır.


Bash:
mysql -u root -h localhost

komutu ile "localhost" içerisinde çalışan bir sunucuda olduğunuzu ve buna "root" kullanıcı adı ile giriş yapacağınızı söylüyorsunuz.

Eğer daha önce bir şifreniz varsa ve şifreniz ile giriş yapmak istiyorsanız;


Bash:
mysql -u root -h localhost -p

Ben daha önceden bir şifre tanımladığım için bu komutu tercih edeceğim.

h488hwa.png


SQL:
SHOW DATABASES;

Bu komut ile MySQL sunucunuz içerisinde bulunan veritabanlarını listeleyebilirsiniz.

97czvc8.png


Burada yazan veritabaları default olarak kurulu gelen veritabanlarıdır. Biz bu veritabanlarına ellemeden kendi veritabanımızı oluşturalım.

SQL:
CREATE DATABASE bunjotht;

1p3ubi9.png


Oluşturduğumuz veritabanını kullanalım.

SQL:
USE bunjotht;

Şimdi ise tablomuzu oluşturalım.

SQL:
CREATE TABLE pages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    type VARCHAR(20),
    content TEXT
);

qpjkr5k.png


id, type, content kolonlarına sahip "pages" isimli bir tablo oluşturduk.
İçerisine veri dahil edelim.

SQL:
INSERT INTO pages (id,type,content) VALUES (1,"PROGRAMLAMA DILLERI","Ruby, Python, C, C++, C#, PHP");

SQL:
INSERT INTO pages (id,type,content) VALUES (2,"ULKELER","TURKIYE, KAZAKISTAN, TURKMENISTAN, AZERBAYCAN, OZBERKISTAN");

Şeklinde örnek olarak çeşitli eklemeler yaptım.

tgctncr.png


Verileri kontrol etmek isterseniz;

SQL:
SELECT * FROM pages;

pe4kv2x.png


admin içeriklerini eklemek için burada bulunan konumu kullanabilirsiniz.

Evet burada işimiz bitti komut satırını kapatabilirsiniz.


Web Sayfasının Kodlanması

Ufak görsel tasarım ile bir sayfa kodlayalım.

Dosya Ağacım:


2vtmhof.png


Diğer konular için kullandığım klasörler mevcut fakat burada "sqli" adlı bir klasör oluşturdum içine de "index.php" adlı bir php dosyası ekledim.

Şimdi sitemizi kodlayalım.


HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sayfalar</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Extrem Site</h1>
   
    </div>
</body>
</html>

Site görüntüsü:

nfg30hv.png


HTML ve CSS kodlarını açıklamıyorum. Bizim için önemli olan PHP kodları.


Veritabanı Sorgu İşlemi Yapılması

Şimdi de arkada işlem yapacak PHP kodumuzu yazalım.

PHP:
<?php
    $id = $_GET["id"];
?>

Sayfa içeriği görüntülenmesi için GET ile "id" değerini alıyoruz.

"index.php?id=1"

şeklinde girilecektir.


PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
           
    }
?>

Eğer "id" değeri girilmiş ise yapılacaklar için bir if bloğu açtım.

MYSQL sunucusu için bilgilerimi tanımlıyorum.


PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "bunjobunjo";
        $database_name = "bunjotht";
    }
?>

Sunucuya bağlantımızı kuralım.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "bunjobunjo";
        $database_name = "bunjotht";

        $conn = new mysqli($servername, $username, $password, $database_name);
    }
?>

Bağlantı kontrolü ekliyoruz ve eğer sunucuya bağlanıp komutu çalıştırıyoruz, dönen çıktı $result değişkenine atanıyor.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);
    }
?>

Şimdi de çıktıyı ekrana yazdıralım.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                echo "Tür: " . $row["type"] . "<br>" . "İçerik: " . $row["content"];
            }
        }
    }
?>

Site için bütün kod:

PHP:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sayfalar</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Extrem Site</h1>
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                echo "Tür: " . $row["type"] . "<br>" . "İçerik: " . $row["content"];
            }
        }
    }
?>
    </div>
</body>
</html>

Site testi:

c5curhi.png


Evet artık kurulumlarımız bittiğine göre zafiyeti sömürmeye başlayalım.

Zafiyetin Tespiti Ve Sömürülmesi

Bu kısımda sitenin içeriği ile alakalı bir bilgimiz olmadan hareket edeceğiz.

Siteye giriş yapalım.


uh4rjg0.png


URL kısmına baktığımız zaman bir id değeri alınıyor ve alınan değer ile alakalı veriler aşağıya yansıtılıyor.

c5curhi.png


Şimdi ise id değerini değiştirip bir üstünü yazalım.

eg8l7c3.png


2ekpr3m.png


Evet id değeri ile oynadığımız zaman gelen verilerin değiştiğini gördük.

Burada GET ile alınan bu id değerinin çeşitli verileri temsil etmek için kullanıldığını anlayabilirsiniz.

Şimdi id değerinin sonuna ' işareti koyalım ve arkada dönen sorguyu inceleyip bozmaya çalışalım.

Arkada dönen sorgu:

SQL:
SELECT * FROM pages WHERE id = 2

burada ' koyduğunuz zaman id değeri içn 2' değeri alınıyor ve bu database içerisinde sorgulanıyor fakat bir eşleşme bulunamadığı için NULL değeri döndürülüyor.

NULL verisi de sayfaya yazdırılmadığı için sayfa içerisinde herhangi bir veri olmuyor.

Genellikle okuduğunuz diğer makalelerde ' koyup açık bulabileceğiniz anlatılıyor.

Fakat id değeri burada integer(tam sayı) olarak alınıyor, eğer bir metin yani string olarak alınsaydı sorgu şöyle olacaktı:

SQL:
SELECT * FROM pages WHERE id = '2'

Ve bu sorgu dönerken id=2' değeri koyduğunuz zaman:

SQL:
SELECT * FROM pages WHERE id = '2''

Sorgu bu şekilde olacak ve "SYNTAX ERROR" gibi bir hata alacaksınız bu hata size

normalde olması gereken sorgunun '2' olduğunu fakat sizin '2'' girdiğinizden dolayı bir adet ' işareti arttığını ve bunun sorguyu bozduğunu anlatacak.

Fakat burada ben bu türden anlatmak istemedim zaten bunun gibi birçok anlatım mevcut ve aynı konuyu benim de açmışlığım var.

Konu:

CoffeeScript:
https://www.turkhackteam.org/konular/uygulamali-manual-sql-injection-1-in-band-sql-hacking.2053707/

Biz değerimizi tam sayı tipinde aldık. Şimdi temel mantığı anlattığıma göre sayfa da açık aramaya devam edelim.

OR ifadesi bir bağlaçtır ve kullanıldığı durumda bir ader TRUE değeri dönerse bütün sorguyu TRUE olarak döndürür.

id=5 OR 1=1 yaptığımız zaman:

Veritabanı içerisinde id değeri için 5 verisi varsa TRUE döner yoksa FALSE döner.

Test edelim:


qwlvczj.png


ajeanud.png


Bakın hiçbir veri sayfaya yansıtılmadı bu da bize id için 5 değerinin olmadığını gösteriyor. Şimdi OR kullanarak sorguya müdahele etmeye çalışalım.

kavzhi8.png


89cjrh2.png


Bütün içerik ekrana yansıtıldı gördüğünüz gibi.

id için 5 değeri sunucuda arandı ve bulunamayıp false döndü yani şuan:

fasle OR 1=1

ifadesi var 1 sayısı 1 sayısına eşit olduğu için buradan da true değeri döndğ:

false OR true

OR bağlacında bir adet true olması bütün sorguyu ture yapar diye söylemiştim ve sonuç:

true

olarak döndü ve bütün veriler bu sebepten dolayı ekrana yazdırıldı.

Database
Tablo
Kolon
Satır (Veri)

Şeklinde bir düzenimiz vardı veritabanımız içerisinde.

Database bağlantıda zaten kullanılıyor şuan o tabase içerisindeyiz.

Bu bağlantıda da tablo içerisinden bir sorgu yapılıyor yani tablonunda içerisindeyiz.

Ama kolon sayısını bilmiyoruz, "Tür" ve "İçerik" başlıkları altında veriler yansıtılsa bile belki de içeri de başka kolonlarda olabilir.

Şimdi kolon sayısını öğrenelim.

SQL:
ORDER BY

bu komut tipik SQL dilinde kolon sayılarını sıralamak için kullanılır.

order by 1 yazdığınız zaman 1. kolonu seçersiniz. 2,3,....n için de aynı şekilde geçerli.

hedefte OR komutunu çalıştırıp tüm sayfayı dökebildiğimize göre SQL sorguları çalıştırabiliyoruz.

Şimdi ise order by komutu ile kolon sayısını öğrenelim.



3u2ifka.png


Bu şekilde 1. kolonu seçiyorum ve sayfada herhangi bir veri gitmedi.

43u0zm6.png


2 için denedim site hala duruyor.

43u0zm6.png


et6c3t0.png


3 için deniyorum. (hata alana kadar ya da sayfa gidene kadar devam edeceksiniz arkadaşlar.)

3 için bir hata almadım 4 için deniyorum.

svbvwl6.png


rr9uy6d.png


Evet site gitti. Bu bize 3 adet kolon olduğunu gösteriyor çünkü 4. için denediğimizde false döndü ve hiçbir çıktı gelmedi, ama 3 yazdığımız zaman site geliyordu.

şimdi UNION SELECT kullanacağız. Bu komut arkada

SQL:
SELECT * FROM pages WHERE id = 1

sorgusu dönerken bizim de araya istediğimiz sorguyu sıkıştırmamızı sağlıyor kısacası.

3 adet kolon olduğu için union sorgusunu 3'e kadar yazıyorum.
Kod:
http://localhost/sqli/index.php?id=1 union select 1,2,3
1,2,3 değeri kolon numaralarımızı ifade ediyor.
Bu sorguyu yollayıp siteye bakalım.
pogwuqy.png


3tv5uzq.png


Tür: 2 ve İçerik: 3 olmak üzere yeni çıktılar eklenmiş bunlar bizim 1,2,3 kolonları için kolon numaralarımı temsil ediyor.

Burada bu 2 ve 3 ifadeleri sizin union için sorgu yaptığınız zaman 2 ve 3 kısmındaki sorgunun yansıtılacağı yeri gösteriyor.

Daha iyi anlamanız için 2 ve 3 yerinde database() ve version() komutlarını çalıtşıralım.


ed4ywl7.png


2zewbzw.png


version ve database ismi bilgisini öğrendiniz hayırlara vesile olsun.

Veritabanı içerisinde bulunan information_schema databasesi veritabanının köküdür.
veritabanınızda bulunan tablolar burada depolanır.
information_schema.tables içerisinde table_name anahtar kelime ile saklanır.

Şimdi bizde union sorgusuna bunu dahil edelim.

group_concat() kullanmazsanız bazen tüm tablolar gelmeye biliyor amacının ne olduğunu da anladınız.

CoffeeScript:
http://localhost/sqli/index.php?id=1 union select 1,group_concat(table_name),3 FROM information_schema.tables

şeklinde bir sorgu yapabilirsiniz ama information_schema içerisinde başka tablolarda var biz kendi databasemiz içerisindekileri istiyoruz.

CoffeeScript:
http://localhost/sqli/index.php?id=1 union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()
5v2x7ct.png


mikb2oz.png


Evet admin,pages isimli tablolar olduğunu öğrendik şimdi burada ben admin tablosuna girip admin kullanıcı adını ve şifresini alacağım.

jvhel7q.png


8l6xmgt.png


admin isimli tablo içerisinde "username" ve "pass" adlı kolonlar varmış.

Bu kolonların içeriklerini getirelim.

keadwyw.png



s9jui0w.png


Username: admin123
Password: 12345

olacak şekilde bulundu.

Bu konu bu kadardı umarım okursunuz.

Arkada dönen olaylarla beraber anlatmaya çalıştım fakat SQL dilini bilmeden bu yapılanları uygulamanız size zor gelebilir, ben burada her şeyi de anlatamam

Okuyan herkese teşekkür ederim. Emeğe karşılık konuyu beğenip yorum atarsanız iyi olur :)
Elinize kolnuza sağlık guzel anlatım ve ise yarar
 

teux

Katılımcı Üye
23 Ocak 2023
959
1,326
Eline sağlık bunjo, konularını okumaktan keyif alıyorum. Bir çok bilmediğim şey olduğunu fark ediyorum okudukça eline sağlık takipçinim :)
 

Butcherb3y

Uzman üye
1 Eyl 2022
1,533
1,140
Anıtkabir

oqk18ir.png



c0sawob.png


lbn20fm.png
2q250vr.png


Merhabalar ben saldırı timlerinden Bunjo, bu yazıda konumuz "Union Based SQL Injection" olacaktır.
Daha önceden bununla alakalı bir yazım var fakat bu konu da daha ayrıntıya gireceğim.


Union Based SQL Injection

iwxqmay.png


"Union-Based SQL Injection," web uygulamalarındaki güvenlik açıklarını sömürerek veritabanlarına erişmeye çalışan bir saldırı türüdür.
Bu saldırı, kullanıcı tarafından sağlanan verilerin güvenli bir şekilde işlenmediği veya doğrulanmadığı durumlarda ortaya çıkar.

Web uygulamaları genellikle kullanıcı girişlerini veya form verilerini kullanarak veritabanı sorguları oluşturur. SQL enjeksiyonu, bu girişlerin kötü niyetli şekilde manipüle edilmesiyle gerçekleştirilir.
Union-Based SQL Injection saldırısı, UNION SQL operatörünün kullanılması ile gerçekleşir.

UNION operatörü, iki sorgunun sonuç kümesini birleştirmek için kullanılır. Saldırgan, hedef uygulamanın SQL sorgusunu manipüle ederek,
UNION operatörünü kullanarak kendi sorgusunu ekler ve veritabanından hassas bilgileri çekmeye çalışır.

Veritabanı İçin Kurulum

İnternette bulunan diğer yazılarda olduğu gibi zafiyeti anlatıp bırakmayacağım.
Sizin de uygulayarak öğrenebilmeniz adında ufak bir "MYSQL" sunucusu
içine kullanacağımız verileri ekleyelim.

Daha önce anlattığımda yapamayanlar olmuş onun için tekrardan daha detaylı şekilde anlatıyorum.

Kurulum esnasında eğer "root" kullanıcısı değilseniz, paylaştığım komutların başına "sudo" ekleyerek çalıştırabilirsiniz.

Ben Parrot OS işletim sistemini kullanacağım. Siz de büyük ihtimalle "Kali Linux"
kullanıyorsunuzdur.
Bu gibi debian tabanlı sistemlerde "mysql" kurulu olarak gelir, bu sebepten dolayı herhangi bir işlem yapma zorunluluğunuz bulunmuyor.

Şimdi mysql için bilgisayar servisini başlatacağız.

Bash:
service mysql start

5rgbnlo.png


"root" kullanıcısı içerisindeyseniz, "mysql" sunucunuza kolaylıkla giriş sağlayabilirsiniz.

Ben daha önceden bir anlatım yaptığım için root kullanıcıma tanımlı bir şifre var.
Eğer siz ilk defa bu sunucunuzu oluşturuyorsanız tanımlı bir şifre olmayacaktır.


Bash:
mysql -u root -h localhost

komutu ile "localhost" içerisinde çalışan bir sunucuda olduğunuzu ve buna "root" kullanıcı adı ile giriş yapacağınızı söylüyorsunuz.

Eğer daha önce bir şifreniz varsa ve şifreniz ile giriş yapmak istiyorsanız;


Bash:
mysql -u root -h localhost -p

Ben daha önceden bir şifre tanımladığım için bu komutu tercih edeceğim.

h488hwa.png


SQL:
SHOW DATABASES;

Bu komut ile MySQL sunucunuz içerisinde bulunan veritabanlarını listeleyebilirsiniz.

97czvc8.png


Burada yazan veritabaları default olarak kurulu gelen veritabanlarıdır. Biz bu veritabanlarına ellemeden kendi veritabanımızı oluşturalım.

SQL:
CREATE DATABASE bunjotht;

1p3ubi9.png


Oluşturduğumuz veritabanını kullanalım.

SQL:
USE bunjotht;

Şimdi ise tablomuzu oluşturalım.

SQL:
CREATE TABLE pages (
    id INT AUTO_INCREMENT PRIMARY KEY,
    type VARCHAR(20),
    content TEXT
);

qpjkr5k.png


id, type, content kolonlarına sahip "pages" isimli bir tablo oluşturduk.
İçerisine veri dahil edelim.

SQL:
INSERT INTO pages (id,type,content) VALUES (1,"PROGRAMLAMA DILLERI","Ruby, Python, C, C++, C#, PHP");

SQL:
INSERT INTO pages (id,type,content) VALUES (2,"ULKELER","TURKIYE, KAZAKISTAN, TURKMENISTAN, AZERBAYCAN, OZBERKISTAN");

Şeklinde örnek olarak çeşitli eklemeler yaptım.

tgctncr.png


Verileri kontrol etmek isterseniz;

SQL:
SELECT * FROM pages;

pe4kv2x.png


admin içeriklerini eklemek için burada bulunan konumu kullanabilirsiniz.

Evet burada işimiz bitti komut satırını kapatabilirsiniz.


Web Sayfasının Kodlanması

Ufak görsel tasarım ile bir sayfa kodlayalım.

Dosya Ağacım:


2vtmhof.png


Diğer konular için kullandığım klasörler mevcut fakat burada "sqli" adlı bir klasör oluşturdum içine de "index.php" adlı bir php dosyası ekledim.

Şimdi sitemizi kodlayalım.


HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sayfalar</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Extrem Site</h1>
   
    </div>
</body>
</html>

Site görüntüsü:

nfg30hv.png


HTML ve CSS kodlarını açıklamıyorum. Bizim için önemli olan PHP kodları.


Veritabanı Sorgu İşlemi Yapılması

Şimdi de arkada işlem yapacak PHP kodumuzu yazalım.

PHP:
<?php
    $id = $_GET["id"];
?>

Sayfa içeriği görüntülenmesi için GET ile "id" değerini alıyoruz.

"index.php?id=1"

şeklinde girilecektir.


PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
           
    }
?>

Eğer "id" değeri girilmiş ise yapılacaklar için bir if bloğu açtım.

MYSQL sunucusu için bilgilerimi tanımlıyorum.


PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "bunjobunjo";
        $database_name = "bunjotht";
    }
?>

Sunucuya bağlantımızı kuralım.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "bunjobunjo";
        $database_name = "bunjotht";

        $conn = new mysqli($servername, $username, $password, $database_name);
    }
?>

Bağlantı kontrolü ekliyoruz ve eğer sunucuya bağlanıp komutu çalıştırıyoruz, dönen çıktı $result değişkenine atanıyor.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);
    }
?>

Şimdi de çıktıyı ekrana yazdıralım.

PHP:
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                echo "Tür: " . $row["type"] . "<br>" . "İçerik: " . $row["content"];
            }
        }
    }
?>

Site için bütün kod:

PHP:
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Sayfalar</title>
    <style>
        body {
            font-family: 'Arial', sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
        }

        .container {
            text-align: center;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }

        h1 {
            color: #333;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Extrem Site</h1>
<?php
    $id = $_GET["id"];

    if (isset($id)) {
        $servername = "localhost";
        $username = "root";
        $password = "";
        $database_name = "bunjotht";

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

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

        $sql = "SELECT * FROM pages WHERE id = $id";
        $result = $conn->query($sql);

        if ($result->num_rows > 0) {
            while ($row = $result->fetch_assoc()) {
                echo "Tür: " . $row["type"] . "<br>" . "İçerik: " . $row["content"];
            }
        }
    }
?>
    </div>
</body>
</html>

Site testi:

c5curhi.png


Evet artık kurulumlarımız bittiğine göre zafiyeti sömürmeye başlayalım.

Zafiyetin Tespiti Ve Sömürülmesi

Bu kısımda sitenin içeriği ile alakalı bir bilgimiz olmadan hareket edeceğiz.

Siteye giriş yapalım.


uh4rjg0.png


URL kısmına baktığımız zaman bir id değeri alınıyor ve alınan değer ile alakalı veriler aşağıya yansıtılıyor.

c5curhi.png


Şimdi ise id değerini değiştirip bir üstünü yazalım.

eg8l7c3.png


2ekpr3m.png


Evet id değeri ile oynadığımız zaman gelen verilerin değiştiğini gördük.

Burada GET ile alınan bu id değerinin çeşitli verileri temsil etmek için kullanıldığını anlayabilirsiniz.

Şimdi id değerinin sonuna ' işareti koyalım ve arkada dönen sorguyu inceleyip bozmaya çalışalım.

Arkada dönen sorgu:

SQL:
SELECT * FROM pages WHERE id = 2

burada ' koyduğunuz zaman id değeri içn 2' değeri alınıyor ve bu database içerisinde sorgulanıyor fakat bir eşleşme bulunamadığı için NULL değeri döndürülüyor.

NULL verisi de sayfaya yazdırılmadığı için sayfa içerisinde herhangi bir veri olmuyor.

Genellikle okuduğunuz diğer makalelerde ' koyup açık bulabileceğiniz anlatılıyor.

Fakat id değeri burada integer(tam sayı) olarak alınıyor, eğer bir metin yani string olarak alınsaydı sorgu şöyle olacaktı:

SQL:
SELECT * FROM pages WHERE id = '2'

Ve bu sorgu dönerken id=2' değeri koyduğunuz zaman:

SQL:
SELECT * FROM pages WHERE id = '2''

Sorgu bu şekilde olacak ve "SYNTAX ERROR" gibi bir hata alacaksınız bu hata size

normalde olması gereken sorgunun '2' olduğunu fakat sizin '2'' girdiğinizden dolayı bir adet ' işareti arttığını ve bunun sorguyu bozduğunu anlatacak.

Fakat burada ben bu türden anlatmak istemedim zaten bunun gibi birçok anlatım mevcut ve aynı konuyu benim de açmışlığım var.

Konu:

CoffeeScript:
https://www.turkhackteam.org/konular/uygulamali-manual-sql-injection-1-in-band-sql-hacking.2053707/

Biz değerimizi tam sayı tipinde aldık. Şimdi temel mantığı anlattığıma göre sayfa da açık aramaya devam edelim.

OR ifadesi bir bağlaçtır ve kullanıldığı durumda bir ader TRUE değeri dönerse bütün sorguyu TRUE olarak döndürür.

id=5 OR 1=1 yaptığımız zaman:

Veritabanı içerisinde id değeri için 5 verisi varsa TRUE döner yoksa FALSE döner.

Test edelim:


qwlvczj.png


ajeanud.png


Bakın hiçbir veri sayfaya yansıtılmadı bu da bize id için 5 değerinin olmadığını gösteriyor. Şimdi OR kullanarak sorguya müdahele etmeye çalışalım.

kavzhi8.png


89cjrh2.png


Bütün içerik ekrana yansıtıldı gördüğünüz gibi.

id için 5 değeri sunucuda arandı ve bulunamayıp false döndü yani şuan:

fasle OR 1=1

ifadesi var 1 sayısı 1 sayısına eşit olduğu için buradan da true değeri döndğ:

false OR true

OR bağlacında bir adet true olması bütün sorguyu ture yapar diye söylemiştim ve sonuç:

true

olarak döndü ve bütün veriler bu sebepten dolayı ekrana yazdırıldı.

Database
Tablo
Kolon
Satır (Veri)

Şeklinde bir düzenimiz vardı veritabanımız içerisinde.

Database bağlantıda zaten kullanılıyor şuan o tabase içerisindeyiz.

Bu bağlantıda da tablo içerisinden bir sorgu yapılıyor yani tablonunda içerisindeyiz.

Ama kolon sayısını bilmiyoruz, "Tür" ve "İçerik" başlıkları altında veriler yansıtılsa bile belki de içeri de başka kolonlarda olabilir.

Şimdi kolon sayısını öğrenelim.

SQL:
ORDER BY

bu komut tipik SQL dilinde kolon sayılarını sıralamak için kullanılır.

order by 1 yazdığınız zaman 1. kolonu seçersiniz. 2,3,....n için de aynı şekilde geçerli.

hedefte OR komutunu çalıştırıp tüm sayfayı dökebildiğimize göre SQL sorguları çalıştırabiliyoruz.

Şimdi ise order by komutu ile kolon sayısını öğrenelim.



3u2ifka.png


Bu şekilde 1. kolonu seçiyorum ve sayfada herhangi bir veri gitmedi.

43u0zm6.png


2 için denedim site hala duruyor.

43u0zm6.png


et6c3t0.png


3 için deniyorum. (hata alana kadar ya da sayfa gidene kadar devam edeceksiniz arkadaşlar.)

3 için bir hata almadım 4 için deniyorum.

svbvwl6.png


rr9uy6d.png


Evet site gitti. Bu bize 3 adet kolon olduğunu gösteriyor çünkü 4. için denediğimizde false döndü ve hiçbir çıktı gelmedi, ama 3 yazdığımız zaman site geliyordu.

şimdi UNION SELECT kullanacağız. Bu komut arkada

SQL:
SELECT * FROM pages WHERE id = 1

sorgusu dönerken bizim de araya istediğimiz sorguyu sıkıştırmamızı sağlıyor kısacası.

3 adet kolon olduğu için union sorgusunu 3'e kadar yazıyorum.
Kod:
http://localhost/sqli/index.php?id=1 union select 1,2,3
1,2,3 değeri kolon numaralarımızı ifade ediyor.
Bu sorguyu yollayıp siteye bakalım.
pogwuqy.png


3tv5uzq.png


Tür: 2 ve İçerik: 3 olmak üzere yeni çıktılar eklenmiş bunlar bizim 1,2,3 kolonları için kolon numaralarımı temsil ediyor.

Burada bu 2 ve 3 ifadeleri sizin union için sorgu yaptığınız zaman 2 ve 3 kısmındaki sorgunun yansıtılacağı yeri gösteriyor.

Daha iyi anlamanız için 2 ve 3 yerinde database() ve version() komutlarını çalıtşıralım.


ed4ywl7.png


2zewbzw.png


version ve database ismi bilgisini öğrendiniz hayırlara vesile olsun.

Veritabanı içerisinde bulunan information_schema databasesi veritabanının köküdür.
veritabanınızda bulunan tablolar burada depolanır.
information_schema.tables içerisinde table_name anahtar kelime ile saklanır.

Şimdi bizde union sorgusuna bunu dahil edelim.

group_concat() kullanmazsanız bazen tüm tablolar gelmeye biliyor amacının ne olduğunu da anladınız.

CoffeeScript:
http://localhost/sqli/index.php?id=1 union select 1,group_concat(table_name),3 FROM information_schema.tables

şeklinde bir sorgu yapabilirsiniz ama information_schema içerisinde başka tablolarda var biz kendi databasemiz içerisindekileri istiyoruz.

CoffeeScript:
http://localhost/sqli/index.php?id=1 union select 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()
5v2x7ct.png


mikb2oz.png


Evet admin,pages isimli tablolar olduğunu öğrendik şimdi burada ben admin tablosuna girip admin kullanıcı adını ve şifresini alacağım.

jvhel7q.png


8l6xmgt.png


admin isimli tablo içerisinde "username" ve "pass" adlı kolonlar varmış.

Bu kolonların içeriklerini getirelim.

keadwyw.png



s9jui0w.png


Username: admin123
Password: 12345

olacak şekilde bulundu.

Bu konu bu kadardı umarım okursunuz.

Arkada dönen olaylarla beraber anlatmaya çalıştım fakat SQL dilini bilmeden bu yapılanları uygulamanız size zor gelebilir, ben burada her şeyi de anlatamam

Okuyan herkese teşekkür ederim. Emeğe karşılık konuyu beğenip yorum atarsanız iyi olur :)
Eline sağlık bunjocum yine yapmışsın yapacağını
 

Lihtg

Moderatör
15 Mar 2022
1,845
761
lihtgTHT.php
Harika bir konu ufak tefek yazım yanlışları var fakat hem uygulamalı olması hem de çok güzel konulara değinmen konuyu müthiş yapmış eline sağlık.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.