Əsas səhifə > MySQL > Excessive privilege injection in MySQL (sql injection read/write directory)

Excessive privilege injection in MySQL (sql injection read/write directory)

/* Xahiş olunur php developerlər php kodda səhv tutub mənasız mübahisə aparmasın. Yazı məqsədi php tərəfdən injection-un qarşısı alınması deyil nə də ki, php best practice məqalə deyil */

MySQL user-ləri yaradarkən həddindən artıq verilən grant-ların nəticəsi olaraq bir çox təhlükəsizlik problemi yaşanır ki, onlardan mənim üçün ən diqqətə layiqi FİLE privilege-dir.
İlk öncə simple PHP search yaratmağımız lazımdır.
index.php-də form yerləşəcək search2.php-də isə db connection və select yerləşəcək:
index.php:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <form method="get" action="search2.php">
            
            <input type="text" name="title" />
            <input type="submit" name="search" />
            
        </form>
    </body>
</html>

search2.php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', True);


$db = new mysqli('localhost', 'root', '12345', 'test');

if($db->connect_errno > 0){
    die('Unable to connect to database [' . $db->connect_error . ']');
}


$find=$_GET['title'];

$sql="SELECT * FROM book WHERE title like '$find'";

// var_dump($sql);

if(!$result = $db->query($sql)){
    die('There was an error running the query [' . $db->error . ']');
}

while($row = $result->fetch_assoc()){
    echo $row['id'].'<br />';
    echo $row['title'] . '<br />';
    echo $row['content'];
}

$db->close();

?>

Gördüyünüz kimi root user-dən istifadə olunur və həqiqətən də bir çox production server-də bunu müşahidə etmək olur. Təbii ki biz ümumi ziyanları haqqında yox məhz FİLE privilege-dən danışacıq. İlk öncə root user nədir? və hansı privilege-ləri var?:

mysql> show grants for 'root'@'localhost';
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' WITH GRANT OPTION
+----------------------------------------------------------------------------------------------------------------------------------------+

ALL PRIVILEGES ON *.* = bütün database object-ləri üzərində istənilən əməliyyatı yerinə yetir.
ALL PRIVILEGES= Read about ALL
Burda diqqətimizi FİLE privilege çəkir. From documentation:
The FILE privilege gives you permission to read and write files on the server host using the LOAD DATA INFILE and SELECT … INTO OUTFILE statements and the LOAD_FILE() function. A user who has the FILE privilege can read any file on the server host that is either world-readable or readable by the MySQL server. (This implies the user can read any file in any database directory, because the server can access any of those files.) The FILE privilege also enables the user to create new files in any directory where the MySQL server has write access. This includes the server’s data directory containing the files that implement the privilege tables. As a security measure, the server will not overwrite existing files.

search2.php-ni işlədək:

Daha sonra SQL injection pattern-imizi yazaq:

Bəli gördüyünüz kimi Union-based SQLi aşkar olundu. /etc/passwd file-nı bu yolla çəkmək olar mı?:

Və bu üsuldan istifadə edib biz hər hansı cədvəldə olan məlumatı bir .txt fayla yazıb daha sonra da onu yuxarıdakı şəkildə oxuya bilərik. information_schema-dan istifadə edib eyni şəkildə cədvəl məlumatlarını çəkmək olar. Lakin dediyim kimi mövzumuz FİLE privilege-dir.

mysql.user yəni grant cədvəlində(mysql server-in user-lərinin qeyd olunduğu cədvəl) olan username və pass-i götürmək istəsək:

bizim /tmp directory-mizdə həqiqətən də nnc8.txt faylının yarandığının şahidi oluruq:

root@shrzs:~# ls -l /tmp | grep nnc8.txt
-rw-rw-rw- 1 mysql     mysql      350 İyl  7 12:47 nnc8.txt

və .txt faylın içindəki məlumatları oxuyaq:

Bəli gördüyünüz kimi istənilən cədvəlin məlumatlarını bu şəkildə dump edib daha sonra da oxuya bilərik.
Qarşısının alınması- müvafiq grant-ın verilməsi:
User yaradırıq və grant veririk:

mysql> create user 'testing'@'localhost' identified by '12345';
Query OK, 0 rows affected (0.04 sec)

mysql> grant select,insert,delete,update on test.* to 'testing'@'localhost';
Query OK, 0 rows affected (0.05 sec)

Məhz bu user-lə connect olub select verdikdə:

mysql> SELECT load_file('/tmp/nnc8.txt');
+----------------------------+
| load_file('/tmp/nnc8.txt') |
+----------------------------+
| NULL                       |
+----------------------------+
1 row in set (0.00 sec)

mysql> select user,password from mysql.user into outfile '/tmp/nnc9.txt';
ERROR 1045 (28000): Access denied for user 'testing'@'localhost' (using password: YES)

Bəli gördüyümüz kimi, yeni user-imiz directory-dən məlumat oxuyub və yaza bilmir.
3-cü video tutorialı security mövzusunda hazırlamaq fikrindəyəm. video-da mövzunu genişləndirəcik.

Təşəkkürlər😉

Kateqoriyalar: MySQL Etiketlər: ,
  1. Hələlik heç bir şərh yoxdur
  1. No trackbacks yet.

Bir cavab yazın

Sistemə daxil olmaq üçün məlumatlarınızı daxil edin və ya ikonlardan birinə tıklayın:

WordPress.com Loqosu

WordPress.com hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Twitter rəsmi

Twitter hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Facebook fotosu

Facebook hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

Google+ foto

Google+ hesabınızdan istifadə edərək şərh edirsinz. Çıxış / Dəyişdir )

%s qoşulma

%d bloqqer bunu bəyənir: