Uploaded by Mirjalol Bahromov

3 (2)

advertisement
3 – amaliy ish
Mavzu: OWASP WebGoat simulyatorida SQL ineksiya tahdidini amalga
oshirish
Ishdan maqsad: Ma’lumotlar ba’zalariga bo‘ladigan SQL – ineksiya tahdidi
haqidagi nazariy va amaliy bilim ko‘nikmalarni shakllantirish
Nazariy qism
SQL ineksiya tahdidi ma’lumotlar bazasiga tegishli bo‘lgan tahdid bo‘lib,
SQL so‘rovlarga taqiqlangan belgilarni kiritish va buning natijasida ma’lumotlar
bazasida boshqa natija olishga qaratilgan. Bu tahdid turi eng ko‘p uchraydigan
tahdid turi bo‘lib, uning hajmi yildan – yilga ortib bormoqda.
Sodda misol. Bu tahdidni tushunish uchun quyidagi sodda hayotiy misolni
keltiraylik. “Alining otasi onasiga Aliga 100$ pul berish kerakligini yozib maktub
qoldirdi.” Bu gapni SQL so‘rovi shaklida ifodalansa quyidagicha bo‘ladi:
“cho‘ntagimdan 100$ OL VA HAMMASINI BER ALIGA”.
Qoldirilgan maktubni Alining akasi Vali ko‘rib qoldi. Vali bo‘lg‘usi xaker
bo‘lganligi uchun, qoldirilgan maktubga “YoKI VALIGA” deb qo‘shib qo‘yadi.
Ona kelib maktubni oladi va kecha Aliga pul berganligi uchun pulni Valiga
beradi. Bu SQL ineksiya tahdidiga bir hayotiy misol. Ona qoldirilgan maktubni
filterlamaslik natijasida pulni Valiga berib yubordi.
SQL ineksiyaning 5 ta asosiy sinfi mavjud:
UNION query SQL injection. Ushbu tur ineksiyaning klassik ko‘rinish
bo‘lib, bundan so‘rov “UNION ALL SELECT” dan takshil topgan bo‘ladi. Bu
turdagi ineksiya SELECT dagi natija to‘g‘ridan – to‘g‘ri qaytarilganda yuzaga
keladi.
Error-based SQL injection. Bu holda skaner tekshirish davomida zaif
belgini almashtirish yoki qo‘shgan vaqtda yuzaga keladi va ma’lumotlarni
boshqarish tizimlarida xatolik yuz berganda foydalaniladi.
Stacked queries SQL injection. Bu turdagi ineksiyada SELECT
komandasidan tashqari buyruqlar (INSERT yoki DELETE) foydalanilgan holda va
HTTP so‘rovlarini tekshirish jarayonida nuqtali vergul (;) bilan almashtirish sodir
bo‘lganda yuzaga keladi.
Boolean-based blind SQL injection. Ushbu turdagi ineksiya “ko‘r” ineksiya
deb atalib, ma’lumotlar bazasidan zaiflik yaqqol ko‘rinmagan holda foydalaniladi.
Bunda sintaktik to‘g‘ri bo‘lgan so‘rovlarni kiritish orqali qaytarilgan mantiqiy
javobga asoslanib natija aniqlanadi.
Time-based blind SQL injection. Bu to‘liq “ko‘r” ineksiya bo‘lib, unda
so‘rovda quyi so‘rov kiritiladi va bu so‘rov ma’lumotlar ba’zasini boshqarish
tizimining ishini bir muncha to‘xtatib turadi (SLEEP() yoki BENCHMARK()).
Bu tahdid asosan taqiqlangan belgilarni tekshirmaslik natijasida kelib chiqadi.
Quyida ushbu zaiflikni o‘z ichiga olgan SQL so‘rovi keltirilgan:
statement = "SELECT * FROM users WHERE name = '" + userName + "';"
Bu so‘rovga asosan aynan kerakli foydalanuvchi nomi ma’lumotlar bazasidan
qidirilmoqda. Agar bu so‘rov buzg‘unchi tomonidan userName o‘rniga ' OR '1'='1
kiritilsa, quyidigi so‘rov hosil bo‘ladi:
SELECT * FROM users WHERE name = '' OR '1'='1';
Natijada ma’lumotlar bazasidan barcha foydalanuvchilar to‘g‘risidagi
ma’lumotlar chiqariladi. Bu yerda quyidagi taqiqlangan belgilar birikmasidan ham
foydalanish mumkin.
' OR '1'='1' -' OR '1'='1' ({
' OR '1'='1' /*
Bu tahdidlarni oldini olishda kiruvchi so‘rov maxsus belgilarga tekshirilishi
kerak. Ammo, bu so‘rovlarni kundan-kunga yangi turlari kelib chiqmoqda.
So‘rovlarni SQL ineksiyaga zaifligini tekshirish
1. Buning uchun ma’lumot bazasi yaratib, unda sodda jadvallar yaratamiz.
Masalan, “news” nomli jadval yaratib unga “id” nomli ustun qo‘shing. Quyidagi
sodda so‘rov jadvaldan berilgan id tegishli ma’lumotni qaytaradi.
$id = $_GET['id'];
$query = "SELECT * FROM news WHERE id=$id";
Ushbu so‘rov SQL ineksiyaga tekshirilmagan bo‘lib, uni tekshirish uchun
quyidagi so‘rovni kiritamiz:
sqlinj/index1.php?id=1'
agar ushbu buyruq kiritilganda xatolik yuz bersa demak zaiflik mavjud
bo‘ladi. Xatolik yuz bersa demak zaiflikga qarshi tekshirilgan yoki xatolikni
ko‘rsatish o‘chirib qo‘yilgan.
2. Qator kiritilganda mavjud xatolikni aniqlash uchun ham yuqoridagi kabi
so‘rovni qator tipidagi ustun uchun kiritish zarur.
$user = $_GET['user'];
$query = "SELECT * FROM news WHERE user='$user'";
Quyidagi so‘rovni kiritish orqali uni aniqlash mumkin:
sqlinj/index1.php?user=hacker'
3. SQL tilida kommentariyaga olish “--” belgisi bilan amalga oshiriladi.
Ushbu belgini oldidan va orqasidan probel bo‘lishi zarur. URL manzillarda probel
“%20” kabi ifodalanadi.
SELECT * FROM news WHERE user='hacker' -- blablabla
URL da ifodasi sqlinj/index1.php?user=hacker'%20--%20 blablabla
4. UNION buyrug‘idan foydalanish orqali maydonlar sonini bilish mumkin.
sqlinj/index1.php?id=1 UNION SELECT 1,2
xatolik
sqlinj/index1.php?id=1 UNION SELECT 1,2,3
xatolik yuq demak ustunlar soni 3 ga teng.
5. GROUP BY dan foydalangan holda ustunlar sonini aniqlash.
sqlinj/index1.php?id=1 GROUP BY 2
Amaliy qism
1.
Mantiqiy “ko‘r” ineksiyani yaratish. Buning uchun Owaspweb Goat
simulyatoridan foydalaniladi.
Dastlab siqilgan faylni oching (WebGoat-OWASP_Standard-5.2.zip)
4.1-rasm. WebGoat-OWASP_Standard-5.2.zip
–Run webgoat.bat (or webgoat_8080.bat) ishga tushuriladi
4.2-rasm. webgoat_8080.bat
–http://localhost/WebGoat/attack (ixtiyoriy brauzer orqali ko‘rsatilgan
linkga murojat qilinadi )
4.3-rasm. http://localhost/WebGoat/attack
Id = guest, pw = guest so‘zini kiritamiz va natijada quyidagi oyna paydo bo‘ ladi:
4.3-rasm. Umumiy oyna
Start WebGoat tugmasi orqali quyidagi oyna paydo bo‘ladi, bu yerda kirish,
umumiy qoidalar, ruhsatlarni boshqarish qoidalari, injection qoidalari va boshqa
qismlardan iborat. Injection Flaws tugmasini bosish orqali uning tarkibiy element
funksiyalarini ko‘rishimiz mumkin bo‘ladi.
4.4-rasm. Injection Flaws
4.1-jadval
Injection flaws tarkibiy element funksiyalari
Command Injection
Blind SQL Injection
Numeric SQL Injection
Log Spoofing
XPATH Injection
LAB: SQL Injection
Stage 1: String SQL Injection
Stage 2: Parameterized Query #1
Stage 3: Numeric SQL Injection
Stage 4: Parameterized Query #2
String SQL Injection
Database Backdoors
Blind SQL Injection quyidagi oyna hosil bo‘ladi va u yerga first_name
kattalining uzunligi 6 ga teng bo‘lga ismni toppish talab etiladi, toppish uchun 101
and ((select ascii(substr(first_name,1,1)) from user_data where userid = 15613) >=
74) and ((select ascii(substr(first_name,1,1)) from user_data where userid = 15613)
<= 74) so‘rovini kiritamiz qachonki shartni qanolatlantigunga qadar davom etadi.
4.4-rasm. So‘rov kiritish jarayoni
Yuqoridagi so‘rovdan foydalanib, 15613 raqamli foydalanuvchini first_name
ni toping (http://138.25.67.99/AsciiTable.html).
4.5-rasm. ASCII jadvali
2.
Qatorli SQL ineksiya. Bu vazifa uchun ham Owaspweb Goat
simulyatoriidan foydalaniladi.
- Fayl ochiladi
–Run webgoat.bat (or webgoat_8080.bat)
–http://localhost/WebGoat/attack
–Id = guest
–pw = guest
- “Tamper Data” plagini Mozilla Firefox uchun o‘rnatiladi va “Tools”
menyusi orqali sinab ko‘riladi.
- Shundan so‘ng “Injection flaws”→”Lab: SQL injection”→”Stage 1:String
SQL Injection” tanlanadi.
- Bu sahifadan vazani aniqlang va Mozilla Firefox ning “Tools” menyusidan
“Tamper Data” bandini tanlab “Start Tamper”tugmasini bosing.
- webgoat muhitidan “Neville Bartholomew (admin)” login sifatida tanlab,
parol bandigi ochiq qoldirib Login tugmasini bosing. Quyidagi oyna
ko‘rinadi.
4.6 – rasm. Tamper Data oynasi
- Bu oynadan siz parol sohasi bo‘shligini ko‘rishingiz mumkin va bu yerda SQL
ineksiyaga olib keluvchi kodni kiriting.
- Tahdidni amalga oshirish orqali ('Neville') qayd yozuviga to‘g‘ri parolni
bilmasdan kirib ko‘ring.
- Foydalangan SQL – so‘rovni hisobotga qayd eting.
Topshiriq
Yuqoridagi so‘rovdan foydalangan holda 15613 raqamli foydalanuvchini
first_name (ism)ni toping.
Nazorat savollari
1. SQL ineksiya nima va uning turlari.
2. Qanday qilib bu tahdiddan himoyalanish mumkin.
3. Bu turdagi tahddilar axborot xavfsizligiga zarar yetkazish imkoniyati qanday.
Download