Unencrypted DB Queries in Transit

از Secure Coding

نسخهٔ تاریخ ‏۹ آوریل ۲۰۲۳، ساعت ۰۸:۵۱ توسط Admin (بحث | مشارکت‌ها) (صفحه‌ای تازه حاوی «آسیب پذیری "Unencrypted DB Queries in Transit" به وضعیتی اطلاق می‌شود که در آن اپلیکیشن دسکت...» ایجاد کرد)
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)

آسیب پذیری "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;
}