Unencrypted DB Queries in Transit

از Secure Coding

آسیب پذیری "Unencrypted DB Queries in Transit" به وضعیتی اطلاق می‌شود که در آن اپلیکیشن دسکتاپ برای ارتباط با پایگاه داده از پروتکل‌های امنیتی استفاده نمی‌کند و داده‌هایی که بین برنامه دسکتاپ و پایگاه داده جابجا می‌شوند به صورت رمزنگاری نشده انتقال می‌یابند. به این ترتیب، مهاجمان می‌توانند به راحتی به داده‌های ارسالی و دریافتی دسترسی پیدا کنند.

برای مثال، فرض کنید یک برنامه دسکتاپ برای ارتباط با پایگاه داده از دستورات SQL استفاده می‌کند، اما برای ارتباط با پایگاه داده از SSL/TLS استفاده نمی‌کند و به جای آن، داده‌هایی که بین برنامه دسکتاپ و پایگاه داده جابجا می‌شوند به صورت رمزنگاری نشده انتقال می‌یابند. در این صورت، مهاجمان می‌توانند به راحتی داده‌های ارسالی و دریافتی را با استفاده از روش‌هایی مانند sniffing دسترسی پیدا کرده و از آن‌ها به نحوی سوء استفاده کنند.

برای پیشگیری از این نوع آسیب پذیری، برنامه‌های دسکتاپ باید از پروتکل‌های امنیتی مثل SSL/TLS برای رمزنگاری و امنیت داده‌های ارسالی استفاده کنند.

نمونه کد c آسیب پذیر:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>

int main(int argc, char *argv[]) {
   MYSQL *conn;
   char *server = "localhost";
   char *user = "root";
   char *password = "password";
   char *database = "test";
   char *query = "SELECT * FROM users";

   conn = mysql_init(NULL);
   if (conn == NULL) {
      fprintf(stderr, "%s\n", mysql_error(conn));
      exit(1);
   }

   if (mysql_real_connect(conn, server, user, password, database, 0, NULL, 0) == NULL) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

if (mysql_query(conn, query)) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

MYSQL_RES *result = mysql_store_result(conn);
if (result == NULL) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(1);
}

int num_fields = mysql_num_fields(result);
MYSQL_ROW row;

while ((row = mysql_fetch_row(result))) {
for(int i = 0; i < num_fields; i++) {
printf("%s ", row[i] ? row[i] : "NULL");
}
printf("\n");
}

mysql_free_result(result);
mysql_close(conn);

return 0;
}