Manuel Kaynak Kod Analizinde SQL Injection Zafiyetinin Tespit Edilmesi

kaleileriteknoloji
2 min readAug 12, 2021

--

İlk olarak SQL injection zafiyetini tespit edelim. Bunun için dvwa ‘da SQL injection sekmesine geliyoruz. User ID alanına ‘ or ‘1=1 payloadunu yazdığımız taktirde bütün kullanıcılar görüntülenmiştir.

SQL Injection zafiyetinin tespitinde kaynak analizinde php projede aşağıdaki fonksiyonlar aratılabilir:

mysql_query

query

mysqli_query

Dvwa makinasında yer alan SQL injection bölümündeki low sekmesinden kaynak kodu inceleyelim:

1.<?php

2.if(isset($_GET[‘Submit’])){

3. $id = $_GET[‘id’];

4. $getid = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’”;

5. $result = mysql_query($getid) or die(‘<pre>’ . mysql_error() . ‘</pre>’ );

6. $num = mysql_numrows($result);

7. $i = 0;

8. while ($i < $num) {

9. $first = mysql_result($result,$i,”first_name”);

10. $last = mysql_result($result,$i,”last_name”);

11. $html .= ‘<pre>’;

12. $html .= ‘ID: ‘ . $id . ‘<br>First name: ‘ . $first . ‘<br>Surname: ‘ . $last;

13. $html .= ‘</pre>’;

14. $i++;

15. }

16. }

17. ?>

Zafiyeti fonksiyon olarak tespit ettikten sonra fonksiyonda kullanılan değişkenden girdi ve çıktı noktasına kadar ilerliyoruz.

5.satırda mysql_query fonksiyonuyla 4.satırdaki SQL sorgusu çalıştırılmaktadır. SQL sorgusunda girdi ile çıktı arasında herhangi bir kontrol bulunmamaktadır.

Şimdi ise bunu bir ağaç yapısında gösterelim.

3.satırda id parametresi GET metodu ile kullanıcıdan alınıyor.

$id = $_GET[‘id’];

4.SQL sorgusu haline getiriliyor.

$getid = “SELECT first_name, last_name FROM users WHERE user_id = ‘$id’”;

5.satırda SQL sorgusu çalıştırılıyor. (SQL injection)

$result = mysql_query($getid) or die(‘<pre>’ . mysql_error() . ‘</pre>’ );

12.satırda ise bu veriler html değişkenine atanmaktadır.

$html .= ‘ID: ‘ . $id . ‘<br>First name: ‘ . $first . ‘<br>Surname: ‘ . $last;

Zafiyetin kapatılması için parametrik SQL sorgular yazılmalıdır.

Php 5 yerine Php 7 kullanılması daha efektif olduğu tercih edilmektedir.

Php 5' te aşağıdaki parametrik sorgu yapacak fonksiyon kullanılabilir:

function mysql_prepare ($query, $phs = array()) {

foreach ($phs as $ph) {

$ph = “‘“ . mysql_real_escape_string($ph) . “‘“;

$query = substr_replace(

$query, $ph, strpos($query, ‘?’), 1

);

}

return mysql_query($query);

}

Php 7 için kod aşağıdaki şekilde olacaktır:

$stmt = $mysqli->prepare(“SELECT first_name, last_name FROM users WHERE user_id = ?”);

$id = 1;

$stmt->bind_param(“s”, $id); -> 4 tipten biri olarak s kullanılmıştır. s -> string

$stmt->execute();

Sqlmap trafik analizine https://kaleileriteknoloji.medium.com/sqlmap-trafik-analizi-574ca8cc1705 ulaşabilirsiniz.

--

--