Biz ilgari tekshirgan PHP kodi asosida zaiflikni tahlil qilishni boshlashimiz mumkin:

<?php
$uname = $_POST['uname'];
$passwd = $_POST['password'];

$sql_query = "SELECT * FROM users WHERE user_name= '$uname' AND password='$passwd'";
$result = mysqli_query($con, $sql_query);
?>

Listing 13 - SQL injection zaifligiga ega PHP kodi

uname va password parametrlari foydalanuvchi tomonidan kiritilgan ma’lumotlar bo‘lgani sababli, biz $sql_query o‘zgaruvchisini nazorat qilishimiz va boshqacha SQL so‘rovini tuzishimiz mumkin.

Ba’zi hollarda, SQL injection autentifikatsiyani chetlab o‘tishga olib kelishi mumkin, bu esa biz o‘rganadigan birinchi ekspluatatsiya yo‘li bo‘ladi.

uname qiymatiga yopuvchi qo‘shtirnoq (') qo‘shish va OR 1=1 ifodasi bilan davom ettirib, undan keyin -- izoh ajratgichini va ikki qiyshi chiziqni (//) kiritish orqali SQL so‘rovini muddatidan oldin yakunlashimiz mumkin. Bu turdagi izoh uchun sintaksisda ikkita ketma-ket tire va kamida bitta bo‘sh joy bo‘lishi kerak.

Quyidagi misolda biz izohga ikki dona qiyshi chiziq (//) qo‘shganmiz. Bu bizga payload’ni ko‘rish imkonini beradi va web ilovada bo‘lishi mumkin bo‘lgan bo‘sh joyni kesib tashlashga qarshi qo‘shimcha himoya ham yaratadi.

offsec' OR 1=1 -- //

Listing 14 - SQLi autentifikatsiyani chetlab o‘tishni test qilish

Bu payload natijasida $sql_query o‘zgaruvchisiga quyidagi SQL so‘rovi tayinlanadi va PHP ilovasi orqali MySQL serverga uzatiladi:

SELECT * FROM users WHERE user_name= 'offsec' OR 1=1 --

Listing 15 - Injeksiyalangan SQL so‘rovi

Biz OR operatori orqali doim to‘g‘ri bo‘ladigan ifodani qo‘shganimiz sababli, WHERE sharti natijasida ma’lumotlar bazasidagi birinchi foydalanuvchi qaytariladi, foydalanuvchi haqiqatan mavjud bo‘lishidan qat’i nazar. Ilovada boshqa tekshiruvlar amalga oshirilmagani uchun, biz autentifikatsiya jarayonini chetlab o‘tib, administrator huquqlarini qo‘lga kiritishimiz mumkin.

Bu hujumni haqiqiy ilovada sinab ko‘rish uchun, lokal Kali mashinamizdan quyidagi manzilga o‘tamiz: http://192.168.50.16, va username va password maydonlariga mos ravishda “offsec” va “jam” so‘zlarini kiritib, Submit tugmasini bosamiz.

1-rasm: SQLi bilan autentifikatsiyani chetlab o‘tishni test qilish - 1

“offsec” foydalanuvchisining credential’lari noto‘g‘ri bo‘lgani uchun “Invalid Password” xatoligi chiqadi. Keyingi qadamda, Username maydoniga maxsus belgi — bitta qo‘shtirnoq — kiritib, server bilan qandaydir o‘zaro ta’sir yuz berishini tekshiramiz.

2-rasm: SQLi bilan autentifikatsiyani chetlab o‘tishni test qilish - 2

Bu safar SQL sintaksis xatoligini oldik, bu esa biz bazaga ta’sir qila olayotganimizni bildiradi.