Cyber Security: เรียนรู้ Brute Force Attack
เรียนรู้เทคนิค Brute Force Attack และแนวทางป้องกันผ่านการฝึกปฏิบัติจริงด้วย DVWA และ Burp Suite
ยินดีต้อนรับสู่ ห้องปฏิบัติการ Brute Force Attack! บทความนี้จะพาไปเรียนรู้เทคนิคการโจมตี web application ที่พบบ่อยและถือเป็นพื้นฐานสำคัญของงานด้าน cybersecurity พร้อมแนวทางป้องกัน
เนื้อหาแบ่งเป็น 3 ส่วนที่ต่อยอดกัน:
- แนวคิด — Brute Force Attack คืออะไร มีกี่ประเภท และป้องกันได้อย่างไร
- การติดตั้ง Lab — ติดตั้ง DVWA (web application ที่จงใจเปิดช่องโหว่ไว้) และ Burp Suite บน Ubuntu VM
- ลงมือโจมตีและป้องกัน — intercept request, ทำ brute force อัตโนมัติด้วย Burp Intruder แล้วศึกษาแนวทางป้องกันที่หยุดการโจมตีนี้ได้
1. แนะนำ Brute Force Attack#
1.1 ข้อกำหนดเบื้องต้น#
ก่อนเริ่มห้องปฏิบัติการนี้ ควรเตรียมสิ่งต่อไปนี้:
- ✅ ติดตั้ง Ubuntu VM — ติดตั้ง Ubuntu บน VirtualBox เรียบร้อยแล้ว
- ✅ พื้นฐานคำสั่ง Linux — ใช้งาน terminal เบื้องต้นได้
- ✅ ความรู้เรื่อง SSH — เข้าใจการเชื่อมต่อเข้าสู่ VM จากระยะไกล
📚 หากยังใหม่กับ Linux: ศึกษาการติดตั้ง Ubuntu VM และพื้นฐาน command-line ได้จาก Linux Security Lab Tutorial ↗
1.2 Brute Force Attack คืออะไร?#
Brute Force Attack คือการโจมตีด้วยการลองค่าซ้ำไปมาเพื่อค้นหาข้อมูลสำคัญ เช่น รหัสผ่านหรือ PIN โดยไล่ทดลองค่าที่เป็นไปได้ทั้งหมดอย่างต่อเนื่องจนกว่าจะพบค่าที่ถูกต้อง
# Password attempts in a brute force attack
password1 -> Incorrect
password123 -> Incorrect
admin123 -> Incorrect
letmein -> Incorrect
password -> SUCCESSbash1.3 Brute Force Attack ทำงานอย่างไร#

ขั้นตอนหลักมี 4 ระยะตามภาพ: เตรียมรายการรหัสผ่าน (Password List) → ส่งเข้าสู่หน้า login (Submit to Login) → ตรวจสอบ response ที่ได้กลับมา (Check Response) → พบรหัสผ่านที่ถูกต้อง (Password Found)
ผู้โจมตีจะป้อนรายการรหัสผ่านที่เป็นไปได้ให้เครื่องมือส่งเข้าไปยัง login form ทีละค่า แล้วสังเกต response ที่ได้กลับมา โดยทั่วไป response ของการลองที่ผิดกับที่ถูกต้องจะต่างกัน ไม่ว่าจะเป็นข้อความที่แสดง ขนาดของหน้า หรือการ redirect ความแตกต่างนี้เองคือสัญญาณที่บอกว่ารหัสผ่านใดถูกต้อง
1.4 ตัวอย่างเวลาในการถอดรหัส#
| รหัสผ่าน | จำนวนตัวอักษร | เวลาในการถอดรหัส (1000 ครั้ง/วินาที) |
|---|---|---|
1234 | 4 ตัวเลข | ~10 วินาที |
password | 8 ตัวพิมพ์เล็ก | ~2 ชั่วโมง |
Password1 | 8 ผสม | ~3 วัน |
P@ssw0rd! | 8 พร้อมสัญลักษณ์ | ~5 เดือน |
MySecur3P@ss! | 14 พร้อมสัญลักษณ์ | ~400 ล้านปี |

ข้อควรรู้: ความยาวและความซับซ้อนของรหัสผ่านส่งผลอย่างมากต่อระยะเวลาในการถอดรหัส
2. ประเภทของ Brute Force Attack#

2.1 Simple Brute Force (แบบพื้นฐาน)#
ไล่ทดลองทุกความเป็นไปได้ของรหัสผ่านอย่างเป็นระบบ
a, b, c, ..., z
aa, ab, ac, ..., zz
aaa, aab, aac, ...bashข้อดี: พบรหัสผ่านได้แน่นอนหากให้เวลามากพอ ข้อเสีย: ใช้เวลานานมากเมื่อรหัสผ่านมีความซับซ้อนสูง
2.2 Dictionary Attack (โจมตีด้วยรายการรหัสผ่าน)#
ใช้รายการรหัสผ่านยอดนิยมหรือ wordlist สำเร็จรูปในการโจมตี
# Common password list examples
password
123456
admin
qwerty
letmein
welcomebashข้อดี: เร็วกว่า simple brute force ข้อเสีย: มีประสิทธิภาพเฉพาะกับรหัสผ่านที่คาดเดาได้ง่าย
2.3 Hybrid Attack (โจมตีแบบผสม)#
นำคำจาก dictionary มาผสมกับรูปแบบที่หลากหลาย เช่น เติมตัวเลขหรือสัญลักษณ์
password -> password1, password123, password!
admin -> admin1, Admin2024, admin@2024bashข้อดี: ได้ผลดีกับรหัสผ่านที่นิยมนำคำทั่วไปมาดัดแปลง ข้อเสีย: ยังต้องใช้เวลาและทรัพยากรในการประมวลผล
2.4 Credential Stuffing (นำข้อมูลที่รั่วไหลมาลองซ้ำ)#
ใช้ username/password ที่รั่วไหลจาก data breach มาทดลองเข้าสู่ระบบอื่น โดยอาศัยพฤติกรรมการตั้งรหัสผ่านซ้ำกันในหลายเว็บ
ข้อดี: มีโอกาสสำเร็จสูงหากผู้ใช้ตั้งรหัสผ่านซ้ำ ข้อเสีย: ต้องอาศัยข้อมูลจากฐานข้อมูลที่รั่วไหล
3. การป้องกัน Brute Force Attack#

ไม่มีมาตรการใดเพียงอย่างเดียวที่หยุด brute force attack ได้ การป้องกันที่ดีเกิดจากการใช้หลายเทคนิคด้านล่างร่วมกัน เพื่อหน่วง ตรวจจับ และล็อคผู้โจมตีในที่สุด
3.1 ใช้รหัสผ่านที่แข็งแกร่งและซับซ้อน (Strong Passwords)#
รหัสผ่านที่ดีควรมีลักษณะดังนี้:
- ยาว: อย่างน้อย 12–16 ตัวอักษร
- หลากหลาย: ผสมทั้งตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก ตัวเลข และสัญลักษณ์
- ไม่ซ้ำกัน: ใช้รหัสผ่านต่างกันในแต่ละบัญชี
- คาดเดายาก: เลี่ยงคำทั่วไปหรือรูปแบบที่เดาได้ง่าย
# Bad
password123
admin2024
qwerty123
# Good
Tr0ub4dor&3Horse!
# Better (passphrase)
correct-horse-battery-staple
# Best
Use a password manager!bash3.2 จำกัดจำนวนครั้งในการ Login (Rate Limiting)#
จำกัดจำนวนครั้งที่ login ผิดได้ภายในช่วงเวลาหนึ่ง
# Example rate limiting logic
if failed_attempts > 5:
block_ip_address()
wait_time = 2 ** failed_attempts # exponential backoffpythonแนวทางที่นิยมใช้:
- เพิ่มเวลาหน่วงระหว่างการ login แต่ละครั้ง
- บล็อก IP ชั่วคราวหลัง login ผิดหลายครั้ง
- แสดง CAPTCHA หลังลองผิดหลายครั้ง
- ใช้ exponential backoff เช่น 1s, 2s, 4s, 8s
3.3 เปิดใช้งาน Two-Factor Authentication (2FA)#
เพิ่มขั้นตอนยืนยันตัวตนอีกชั้นนอกเหนือจากรหัสผ่าน
Factor 1: Something you KNOW -> Password
Factor 2: Something you HAVE -> Phone / Token
Factor 3: Something you ARE -> Biometricbashตัวอย่างวิธีการ 2FA:
- SMS OTP (One-Time Password)
- Authentication App (Google Authenticator, Authy)
- Hardware Token (YubiKey)
- Biometric Verification
3.4 นโยบายการล็อคบัญชี (Account Lockout)#
ล็อคบัญชีชั่วคราวเมื่อ login ผิดซ้ำหลายครั้ง
| การพยายามล้มเหลว | การดำเนินการ |
|---|---|
| 3–5 | แจ้งเตือน + หน่วงเวลา |
| 5–10 | ล็อคชั่วคราว (15–30 นาที) |
| 10+ | ล็อคนานขึ้น + แจ้งผู้ดูแลระบบ |
คำเตือน: หากตั้งค่าระบบล็อคบัญชีไม่เหมาะสม อาจถูกใช้เป็นช่องทางทำ DoS ได้ จึงควรใช้ร่วมกับ rate limiting ตาม IP แทนการพึ่งการล็อคบัญชีเพียงอย่างเดียว
3.5 ตรวจสอบและแจ้งเตือน (Monitoring & Alerts)#
บันทึกกิจกรรมผิดปกติและแจ้งเตือนผู้ดูแลระบบ ตัวอย่างเหตุการณ์ที่ควรแจ้งเตือน:
- Login ล้มเหลวหลายครั้งจาก IP เดียวกัน
- Login จากตำแหน่งที่ผิดปกติ
- Login ในช่วงเวลาที่ไม่ปกติ
- Login พร้อมกันจากหลาย IPbash4. Lab Setup — DVWA Installation (ติดตั้งห้องปฏิบัติการ DVWA)#
ส่วนนี้จะตั้งค่าห้องปฏิบัติการด้วย DVWA (Damn Vulnerable Web Application) ซึ่งเป็น web application ที่ออกแบบมาสำหรับการฝึกด้าน cybersecurity โดยเฉพาะ
4.1 ข้อกำหนดเบื้องต้น#
- Ubuntu Linux VM จากบทก่อนหน้า
- Firefox browser บน Ubuntu
- การเชื่อมต่ออินเทอร์เน็ตภายใน VM
4.2 เริ่มต้น Ubuntu VM#
ใน VirtualBox ให้ดับเบิลคลิกที่ Ubuntu Linux VM เพื่อเริ่มต้นระบบ
4.3 ใช้ SSH เพื่อคัดลอกคำสั่งได้สะดวกขึ้น#
💡 Pro Tip: การเชื่อมต่อผ่าน SSH ช่วยให้ copy-paste คำสั่งจากบทความเข้าสู่ VM ได้สะดวกกว่าการพิมพ์เองทั้งหมด
ระหว่างอ่านบทความและใช้งาน terminal บน VM อาจต้องสลับหน้าต่างไปมาตลอดเวลา การใช้ SSH ช่วยให้เปิดบทความบน host machine และรันคำสั่งใน Ubuntu VM ได้โดยตรง

ข้อดีของ SSH
- ✅ คัดลอกคำสั่งจาก browser ได้โดยตรง
- ✅ อ่านบทความบนหน้าจอหลักได้สะดวกกว่า
- ✅ แยก browser และ terminal ออกจากกันชัดเจน
- ✅ ลดการสลับหน้าต่าง VM ไปมา
ตรวจสอบว่า SSH service ทำงานอยู่ (ได้ตั้งค่า SSH ไว้แล้วในบทก่อนหน้า):
sudo service ssh statusbashผลลัพธ์ที่คาดหวัง:
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/usr/systemd/system/ssh.service; enabled)
Active: active (running)bashหากยังไม่ทำงาน ให้สั่งเริ่มการทำงานและตั้งให้เริ่มอัตโนมัติหลัง reboot:
sudo service ssh start
sudo systemctl enable sshbashเชื่อมต่อจาก host machine ทั้งบน Windows (Command Prompt หรือ PowerShell), macOS และ Linux (Terminal) ใช้คำสั่งเดียวกัน:
ssh -p 2222 your_username@localhostbashแทนที่ your_username ด้วย username ของ Ubuntu (เช่น u6090059) แล้วใส่รหัสผ่านเมื่อระบบถาม เมื่อเชื่อมต่อสำเร็จ prompt จะเปลี่ยนไปเป็น:
your_username@your_hostname:~$bash
คำสั่ง SSH ที่ใช้บ่อย:
| Task | Command |
|---|---|
| Connect to VM | ssh -p 2222 user@localhost |
| Exit SSH session | exit หรือ Ctrl + D |
| Copy from browser | Highlight text + Ctrl + C |
| Paste in terminal | Ctrl + Shift + V หรือ right-click paste |
ทดสอบการเชื่อมต่อ เมื่อเชื่อมต่อผ่าน SSH แล้ว ให้ลองรันคำสั่งต่อไปนี้:
pwd
whoami
uname -abashผลลัพธ์ที่คาดหวัง:
/home/your_username
your_username
Linux your_hostname 6.5.0-... #ubuntu SMP ...bash
🎯 หลังจากนี้ คำสั่งทั้งหมดในบทความจะถือว่าเชื่อมต่อผ่าน SSH แล้ว จึงคัดลอกจาก browser ไปวางใน terminal ได้โดยตรง
4.4 ติดตั้ง Apache, MariaDB และ PHP#
อัปเดตระบบก่อน:
sudo apt update
sudo apt upgrade -ybashติดตั้ง dependencies ที่จำเป็น:
sudo apt install -y apache2 mariadb-server php php-mysql php-gd libapache2-mod-phpbashตรวจสอบว่า Apache ทำงานอยู่:
sudo systemctl status apache2bashผลลัพธ์ที่คาดหวัง:
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled)
Active: active (running) since ...bashเปิด Firefox ใน Ubuntu VM แล้วไปที่ http://localhost ↗ จะเห็น Apache2 Ubuntu Default Page ซึ่งยืนยันว่า Apache ทำงานได้ถูกต้อง

4.5 ทำความเข้าใจ Apache ด้วยหน้าเว็บแรก#
Apache เป็น web server software ที่ให้บริการไฟล์ผ่าน HTTP เมื่อมีการเข้าถึง http://localhost Apache จะมองหาไฟล์ใน /var/www/html/ แล้วส่งกลับไปยัง browser
Browser Request: http://localhost/test/
|
Apache receives request
|
Looks for: /var/www/html/test/index.html
|
Sends file back to browserbashลองสร้างหน้าเว็บอย่างง่ายเพื่อดูการทำงานนี้ โดยสร้าง test directory และไฟล์ HTML:
sudo mkdir -p /var/www/html/test
sudo nano /var/www/html/test/index.htmlbashใส่เนื้อหาต่อไปนี้:
<!DOCTYPE html>
<html>
<head>
<title>My Test Page</title>
</head>
<body>
<h1>Hello World</h1>
<p>This is my first web page on Apache!</p>
</body>
</html>htmlกด Ctrl + O, Enter, แล้ว Ctrl + X เพื่อบันทึกและออก จากนั้นตั้งค่า ownership และ permissions ของไฟล์:
sudo chown -R www-data:www-data /var/www/html/test
sudo chmod -R 755 /var/www/html/testbashเปิด Firefox (ภายใน Ubuntu VM) แล้วไปที่ http://localhost/test/ ↗ จะเห็นหัวข้อ “Hello World” พร้อมข้อความด้านล่าง ยืนยันว่า Apache ให้บริการไฟล์ที่สร้างไว้

💡 แนวคิดสำคัญ: URL จะ map ไปยังไฟล์ในระบบ โดย
http://localhost/test/map ไปที่/var/www/html/test/และ Apache จะให้บริการindex.htmlโดยอัตโนมัติ DVWA ก็ทำงานแบบเดียวกัน —http://10.0.2.15/dvwa/map ไปที่/var/www/html/dvwa/(แทนที่10.0.2.15ด้วย IP address จริง)
4.6 ดาวน์โหลดและตั้งค่า DVWA#
ติดตั้ง git แล้ว clone DVWA ลงใน web root ของ Apache:
sudo apt install git -y
cd /var/www/html
sudo git clone https://github.com/digininja/DVWA.git dvwa
sudo chown -R www-data:www-data /var/www/html/dvwabashสร้างไฟล์ config ของ DVWA จาก template แล้วแก้ไข:
cd /var/www/html/dvwa/config
sudo cp config.inc.php.dist config.inc.php
sudo nano config.inc.phpbashหาบรรทัดรหัสผ่านฐานข้อมูล แล้วตรวจสอบให้ตรงกับรหัสผ่านที่จะตั้งในขั้นตอนถัดไป:
$_DVWA[ 'db_password' ] = getenv('DB_PASSWORD') ?: 'p@ssw0rd';phpกด Ctrl + O, Enter, แล้ว Ctrl + X เพื่อบันทึก จากนั้นตั้งค่า permissions ให้กับ path ที่ต้องเขียนไฟล์ได้:
sudo chmod 666 /var/www/html/dvwa/hackable/uploads/
sudo chmod 666 /var/www/html/dvwa/config/config.inc.phpbashเปิดใช้งาน allow_url_include ใน PHP:
sudo nano /etc/php/8.1/apache2/php.inibashกด Ctrl + W พิมพ์ allow_url_include แล้ว Enter เพื่อกระโดดไปยังบรรทัดนั้น จากนั้นเปลี่ยนจาก:
allow_url_include = Offiniเป็น:
allow_url_include = Oniniบันทึกด้วย Ctrl + O, Enter, Ctrl + X แล้ว restart Apache:
sudo systemctl restart apache2bash4.7 สร้าง Database และ User#
เปิด MariaDB shell:
sudo mysqlbashที่ prompt ให้สร้าง database และ user โดยรหัสผ่านต้องตรงกับที่ตั้งไว้ใน config.inc.php:
CREATE DATABASE dvwa;
CREATE USER 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd';
GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa'@'localhost';
FLUSH PRIVILEGES;
EXIT;sqlNote: MariaDB เป็น drop-in replacement ของ MySQL คำสั่งเหล่านี้จึงใช้ได้เหมือนกัน
4.8 เข้าถึง DVWA#
หา IP address ของ VM โดยติดตั้ง net-tools ก่อน (เพื่อใช้คำสั่ง ifconfig):
sudo apt install net-tools -y
ifconfigbashจะพบ IP address ในลักษณะเช่น 10.0.2.15 หรือ 192.168.56.x

เปิด Firefox บน Ubuntu แล้วไปที่ http://10.0.2.15/dvwa/setup.php ↗
Note: แทนที่
10.0.2.15ด้วย IP จริงของ VM หรือใช้ http://localhost/dvwa/setup.php ↗ เมื่อทำงานภายใน VM
คลิกปุ่ม Create / Reset Database เพื่อให้ DVWA สร้าง database tables และเพิ่มข้อมูลตัวอย่างให้โดยอัตโนมัติ

Note: หากเกิด error ให้ตรวจสอบว่า database credentials ใน
config.inc.phpตรงกับ user ที่สร้างไว้ในขั้นตอน 4.7
จากนั้น login เข้าสู่ DVWA:
URL: http://10.0.2.15/dvwa/login.php
Username: admin
Password: passwordbash

5. การเข้าใจ Brute Force Vulnerability#
5.1 สำรวจ DVWA Brute Force Module#
ไปที่ http://10.0.2.15/dvwa/security.php ↗ ตั้งค่า security level เป็น Low แล้วคลิก Submit

Note: DVWA มี security level ทั้งหมด 4 ระดับ (Low, Medium, High, Impossible) บทความนี้ใช้ระดับ Low ในการเรียนรู้ เพราะมี security controls น้อย ทำให้เข้าใจขั้นตอนของ brute force attack ได้ง่ายขึ้น
จากนั้นไปที่ http://10.0.2.15/dvwa/vulnerabilities/brute/ ↗ แล้วลองเข้าสู่ระบบด้วยข้อมูลที่ถูกต้อง:
Username: admin
Password: passwordbashระบบควรแสดงข้อความ login สำเร็จ จากนั้นให้ logout แล้วทดลองใช้รหัสผ่านที่ไม่ถูกต้อง:
Username: admin
Password: wrongpassbashสังเกต URL ที่เกิดขึ้น:
http://10.0.2.15/dvwa/vulnerabilities/brute/?username=admin&password=wrongpass&Login=LoginbashNote: แทนที่
10.0.2.15ด้วย IP จริงของ VM — IP ที่ปรากฏใน URL จะเป็นของ VM ที่ใช้งาน
จุดสังเกตสำคัญ: username และ password ถูกส่งผ่าน GET request ทาง URL query parameters จึง intercept และแก้ไข request ได้ง่ายมาก
5.2 การเข้าใจ GET และ POST#

| Method | วิธีส่งข้อมูล | ความปลอดภัย | การมองเห็น |
|---|---|---|---|
| GET | ส่งผ่าน URL query parameters | ปลอดภัยน้อยกว่า | มองเห็นได้ใน URL, browser history และ logs |
| POST | ส่งผ่าน request body | ปลอดภัยกว่า | ไม่แสดงใน URL |
# GET request (DVWA Low ใช้วิธีนี้)
GET /dvwa/vulnerabilities/brute/?username=admin&password=wrongpass HTTP/1.1
# POST request (ปลอดภัยกว่า)
POST /dvwa/vulnerabilities/brute/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=admin&password=wrongpasshttp6. การติดตั้ง Burp Suite Community Edition#
Burp Suite เป็น interception proxy มาตรฐานอุตสาหกรรมที่นิยมใช้ทดสอบความปลอดภัยของ web application
6.1 ดาวน์โหลด Burp Suite#
เปิด Firefox บน Ubuntu แล้วไปที่ https://portswigger.net/burp/communitydownload ↗ และดาวน์โหลดเวอร์ชัน Linux (shell script)
6.2 ติดตั้ง Burp Suite#
เข้าไปยังโฟลเดอร์ Downloads กำหนดสิทธิ์ให้ installer execute ได้ แล้วรัน:
cd ~/Downloads
ls -l burp*
sudo chmod +x burpsuite_community_*.sh
./burpsuite_community_*.shbashทำตามขั้นตอนใน installation wizard จนเสร็จ
6.3 เปิด Burp Suite#
เปิด Burp Suite ได้ 2 วิธี
วิธีที่ 1 — เปิดผ่าน Ubuntu Applications:
- คลิก Show Applications (ไอคอน grid) ที่มุมล่างซ้าย
- พิมพ์
Burp Suiteในช่องค้นหา - คลิกเพื่อเปิดโปรแกรม

วิธีที่ 2 — เปิดผ่าน command line:
cd /opt/BurpSuiteCommunity
./burpsuitebashใน setup wizard คลิก Next เลือก Use Burp defaults แล้วคลิก Start Burp เพื่อเข้าสู่หน้าจอหลักของโปรแกรม

6.4 ตั้งค่า Firefox Proxy#
เปิด Firefox บน Ubuntu แล้วตั้งค่าให้ traffic ทั้งหมดวิ่งผ่าน Burp:
- คลิกปุ่มเมนู (สามขีด)
- ไปที่ Settings → Network Settings แล้วคลิก Settings
- เลือก Manual proxy configuration
- ตั้ง HTTP Proxy เป็น
127.0.0.1และ Port เป็น8080 - ติ๊ก Use this proxy for all protocols
- คลิก OK

ตรวจสอบ listener ใน Burp Suite ที่ Proxy → Proxy settings → Proxy:
- Interface:
127.0.0.1 - Port:
8080 - Running: ✓ (เครื่องหมายถูกสีเขียว)

6.5 ติดตั้ง Burp Suite CA Certificate#
การให้ Burp intercept HTTPS traffic ได้ ต้องให้ Firefox เชื่อถือ certificate ของ Burp ก่อน
browser จะเชื่อถือเว็บ HTTPS ก็ต่อเมื่อ certificate ของเว็บถูกเซ็นโดย Certificate Authority (CA) ที่รู้จัก แต่ Burp ทำงานแบบ man-in-the-middle คือปลอม certificate ใหม่สำหรับแต่ละเว็บ โดยเซ็นด้วย CA ของ Burp เอง ซึ่ง Firefox ไม่รู้จัก จึงขึ้นคำเตือนและบล็อกหน้าเว็บไว้ การติดตั้ง CA ของ Burp ทำให้ Firefox เชื่อถือทุกอย่างที่ Burp เซ็น หน้า HTTPS จึงโหลดได้ตามปกติ ขณะที่ Burp ยังอ่านและแก้ไข traffic ได้

เปิด Firefox แล้วไปที่ http://burp ↗ คลิก CA Certificate จากนั้นบันทึกไฟล์ชื่อ cacert.der

จากนั้นนำเข้า certificate:
- ใน Firefox ไปที่ Settings → Privacy & Security
- เลื่อนไปที่ Certificates แล้วคลิก View Certificates
- ไปที่แท็บ Authorities แล้วคลิก Import
- เลือกไฟล์
cacert.der - ติ๊ก Trust this CA to identify websites
- คลิก OK

7. การ Intercept Requests ด้วย Burp Suite#
⚠️ ก่อนเริ่ม: ตรวจสอบว่า DVWA security level ถูกตั้งเป็น Low แล้ว โดยไปที่ http://10.0.2.15/dvwa/security.php ↗

Burp วางตัวอยู่ระหว่าง Firefox กับ DVWA ทุก request ที่ Firefox ส่งจะวิ่งผ่าน proxy ของ Burp ซึ่งสามารถหยุดค้าง ตรวจสอบ และแก้ไขได้ก่อนส่งต่อไปยัง server
7.1 เปิดใช้งาน Intercept Mode#
ใน Burp Suite:
- ไปที่แท็บ Proxy
- เปิดแท็บย่อย Intercept
- คลิกปุ่ม Intercept is on เพื่อเปิดใช้งาน
เมื่อเปิดใช้งานแล้ว Burp จะ intercept requests ทั้งหมดที่ส่งจาก Firefox
7.2 Intercept DVWA Login (ดักจับการ Login ของ DVWA)#
เมื่อเปิด Intercept แล้ว:
- เปิด DVWA Brute Force page ใน Firefox
- ทดลอง login ด้วย username
adminและ passwordtest123 - Firefox จะดูเหมือนค้าง ซึ่งเป็นพฤติกรรมปกติ เพราะ request ถูกหยุดค้างไว้ที่ Burp
สลับไปที่ Burp Suite จะเห็น intercepted request ดังนี้:
GET /dvwa/vulnerabilities/brute/?username=admin&password=test123&Login=Login HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 ...
Accept: text/html,application/xhtml+xml...httprequest ที่ถูกหยุดไว้จัดการได้ดังนี้:
| Action | Shortcut | Result |
|---|---|---|
| Forward | Ctrl + F | ส่ง request ไปยัง server |
| Drop | Ctrl + D | ยกเลิก request |
| Intercept | Ctrl + I | เปิด/ปิด intercept |
คลิก Forward เพื่อส่ง request ไปยัง DVWA

7.3 ตรวจสอบ HTTP History#
ใน Burp Suite:
- ไปที่ Proxy → HTTP History
- คลิกเลือก DVWA login request ที่เพิ่งทำ เพื่อดูรายละเอียด
สังเกตโครงสร้างของ request:
Request line:
GET /dvwa/vulnerabilities/brute/?username=admin&password=test123&Login=Login
Headers:
Host: localhost
User-Agent: Mozilla/5.0...
Accept: text/html...
GET parameters:
username = admin
password = test123
Login = Loginbashจากนั้นคลิกแท็บ Response กรณีที่รหัสผ่านผิดจะพบข้อความ:
<pre><br />
Username and/or password incorrect.<br /><br /></pre>html
ข้อความ “incorrect” นี้คือเครื่องหมายที่ใช้แยกการลองที่ล้มเหลวออกจากการลองที่สำเร็จ
8. Automated Brute Force ด้วย Burp Intruder (ทำ Brute Force อัตโนมัติ)#
8.1 ส่ง Request ไปยัง Intruder#
จาก HTTP History ให้คลิกขวาที่ DVWA login request แล้วเลือก Send to Intruder จากนั้นสลับไปที่แท็บ Intruder
8.2 ตั้งค่า Attack Position#
ในแท็บ Intruder → Positions จะเห็น request ทั้งหมด ให้ระบุตำแหน่งค่าที่ต้องการโจมตี:
- คลิก Clear § เพื่อลบตำแหน่งเริ่มต้น
- Highlight เฉพาะค่า password (เช่น
test123) - คลิก Add §

💡 Note: สัญลักษณ์
§เรียกว่า section sign ใน Burp Suite ใช้กำหนดตำแหน่งที่จะแทรก payload ระหว่าง attack
Request จะมีลักษณะดังนี้:
...username=admin&password=§test123§&Login=Loginbash
เครื่องหมาย §...§ ใช้กำหนด payload position คือตำแหน่งที่ Burp จะแทนค่าใหม่ในแต่ละ request ระหว่างการโจมตี Burp จะดึงค่าจาก payload list มาทีละค่า ใส่ลงในตำแหน่งนั้น แล้วส่ง request ออกไป ทำให้การรันครั้งเดียวครอบคลุมทั้ง list โดยอัตโนมัติ
8.3 ตั้งค่า Payloads#
ไปที่แท็บ Intruder → Payloads ตั้ง Payload type เป็น Simple list แล้วเพิ่มรหัสผ่านที่พบบ่อยลงใน Payload Options:
password
admin
123456
qwerty
letmein
welcome
admin123
password123bash
8.4 ตั้งค่า Attack Settings#
ไปที่แท็บ Intruder → Settings ตั้ง Attack type เป็น Sniper (payload หนึ่งตำแหน่ง ทดสอบทีละค่าตามลำดับ)
จากนั้นเพิ่ม response filter เพื่อให้เห็นผลสำเร็จได้ชัดเจน:
- Grep - Match: คลิก Add แล้วใส่คำว่า
incorrect— Burp จะ flag ทุก response ที่มีคำว่า “incorrect” ดังนั้นรายการที่ ไม่มี flag คือการ login สำเร็จ - Grep - Extract (ทางเลือก): คลิก Add แล้ว highlight คำว่า “incorrect” ใน response เพื่อดึงมาแสดงในคอลัมน์แยกต่างหาก


8.5 เริ่ม Attack#
คลิกปุ่ม Start attack ที่มุมขวาบน จะมีหน้าต่างผลลัพธ์เปิดขึ้น:
| Payload # | Payload | Status | Length | incorrect |
|---|---|---|---|---|
| 1 | password | 200 | 5120 | (ไม่มี flag) |
| 2 | admin | 200 | 4874 | ✓ |
| 3 | 123456 | 200 | 4874 | ✓ |

จุดสังเกตสำคัญ:
- Status 200 หมายถึง server ตอบกลับเท่านั้น ไม่ได้แปลว่า login สำเร็จ
- Length ที่แตกต่างกัน บ่งบอกว่าเนื้อหา response ต่างออกไป
- Payload ที่มี length แตกต่าง และ ไม่มี flag “incorrect” คือรหัสผ่านที่ถูกต้อง
8.6 วิเคราะห์ Results#

การลองที่ล้มเหลวจะมีลักษณะเหมือนกันหมด — response length เท่ากันและมี flag “incorrect” ส่วนการ login ที่สำเร็จคือรายการที่ผิดจากพวก: length ต่างออกไป และ ไม่มี flag “incorrect” ความแตกต่างเพียงจุดเดียวนี้คือสิ่งที่เปิดเผยว่ารหัสผ่านใดถูกต้อง
ในหน้าต่าง attack results:
- คลิกหัวคอลัมน์ Length เพื่อ sort แล้วมองหารายการที่เป็น outlier
- ตรวจสอบคอลัมน์ Grep — รายการที่ ไม่มี flag “incorrect” คือการ login สำเร็จ
ยืนยันผลด้วยการ login เองด้วยรหัสผ่านที่พบ:
Username: admin
Password: passwordbash9. Dictionary Attack ด้วย Password Lists (โจมตีด้วยรายการรหัสผ่าน)#

9.1 ดาวน์โหลด Password Wordlist#
ใน Ubuntu terminal ให้ดาวน์โหลด wordlist สำเร็จรูปมาใช้งาน:
cd ~/Downloads
wget https://raw.githubusercontent.com/openwall/john/bleeding-jumbo/run/password.lst -O passwords.txtbashหากต้องการรายการที่ครอบคลุมกว่า ใช้ SecLists:
git clone https://github.com/danielmiessler/SecLists.gitbashตัวอย่างไฟล์ที่ใช้งานได้ดีใน SecLists:
Passwords/Common-Credentials/10-million-password-list-top-1000.txtPasswords/Software/dragonfly41-top10k.txt
9.2 โหลด Wordlist ลงใน Burp#
กลับไปที่ Burp Suite Intruder:
- ไปที่แท็บ Payloads
- ใน Payload Options คลิก Load…
- เลือกไฟล์
~/Downloads/passwords.txtแล้วคลิก Open
จะเห็นรายการรหัสผ่านจำนวนมากถูกโหลดเข้ามาแสดงในส่วน preview
9.3 รัน Dictionary Attack#
ปรับ settings ก่อนเริ่ม:
- ที่ Intruder → Settings → Request Engine ตั้ง threads เป็น 1–5 เพื่อไม่ให้ระบบ lab ทำงานหนักเกินไป
- ยืนยันว่า Attack type เป็น Sniper
คลิก Start attack แล้วรอจนกว่าจะเสร็จ
9.4 กรองและวิเคราะห์ผลลัพธ์#
ในหน้าต่างผลลัพธ์:
- คลิกคอลัมน์ Length เพื่อ sort และหา outlier
- ใช้ Grep - Match rule สำหรับคำว่า
incorrect— รายการที่ ไม่มี flag คือการ login สำเร็จ
รายการที่สำเร็จจะมี response length แตกต่างจากรายการอื่น ไม่มีข้อความ “incorrect” และมักมีข้อความ welcome หรือมีการ redirect ไปหน้าอื่น
10. เทคนิคการวิเคราะห์ขั้นสูง#
10.1 การวิเคราะห์ Response Length#
Response length ที่ต่างกันบ่งบอกถึงผลลัพธ์ที่ต่างกัน:
| Response | Length | ความหมาย |
|---|---|---|
| ~4800 bytes | Base length | Login ไม่สำเร็จ |
| ~5100 bytes | Different length | Login สำเร็จ |
10.2 การใช้ Grep - Extract เพื่อกรองข้อมูลอย่างแม่นยำ#
แทนที่จะเปรียบเทียบ length ด้วยสายตา สามารถ extract ข้อความเฉพาะออกมาจากแต่ละ response ได้:
- ไปที่ Settings → Grep - Extract → Add
- Highlight ข้อความที่ต้องการ extract (เช่น “incorrect”)
- ยืนยัน start และ end markers
- ผลลัพธ์จะแสดงในคอลัมน์ใหม่ หนึ่งค่าต่อหนึ่ง request
10.3 ประเภทของ Burp Intruder Attacks#

| Type | คำอธิบาย | Use Case |
|---|---|---|
| Sniper | payload หนึ่งชุด ทดสอบทีละตำแหน่ง | Single-field brute force |
| Battering Ram | payload เดียวกันทุกตำแหน่ง | ทดสอบค่าเดียวหลาย field |
| Pitchfork | payload หลายชุด จับคู่ตามลำดับ | Username + password combinations |
| Cluster Bomb | ทดสอบทุก combination ที่เป็นไปได้ | Cartesian product testing |
11. เปรียบเทียบ DVWA Security Levels#

DVWA มีหน้า brute force เดียวกันที่เขียนไว้ 4 แบบ แบบละ security level เพื่อให้เห็นว่าการเพิ่มการป้องกันแต่ละชั้นทำให้โจมตียากขึ้นอย่างไร ตั้งแต่ระดับ Low ที่โจมตีได้ง่าย ไปจนถึง Impossible ที่แทบเจาะไม่ได้
11.1 Low Security (ระดับที่ทดสอบ)#
// No protection
if( isset( $_GET[ 'Login' ] ) ) {
$user = $_GET[ 'username' ];
$pass = $_GET[ 'password' ];
// Check against database
// No rate limiting
// No lockout
}phpcredentials ถูกส่งจาก URL เข้าสู่ database โดยตรงโดยไม่มีการตรวจสอบอะไรคั่นกลาง ทั้งไม่มี delay ไม่มีการนับจำนวนครั้ง และไม่มี token จึงเป็นเหตุผลที่การโจมตีด้วย Burp Intruder ก่อนหน้านี้ทำได้รวดเร็ว เพราะ replay การเดารหัสผ่านนับพันครั้งได้ต่อเนื่องโดยไม่มีสิ่งใดขัดขวาง
จุดอ่อน:
- ❌ ไม่มี rate limiting
- ❌ ไม่มี account lockout
- ❌ ใช้ GET request ทำให้ข้อมูลปรากฏใน URL และ history
- ❌ ไม่มี CAPTCHA
- ❌ ไม่มี delay ระหว่าง attempts
11.2 Medium Security (ระดับปานกลาง)#
// Some input sanitization added
$user = stripslashes( $user );
$pass = stripslashes( $pass );
$user = mysql_real_escape_string( $user );
$pass = mysql_real_escape_string( $pass );
// Still vulnerable to brute forcephpการ sanitize input ที่เพิ่มเข้ามาช่วยป้องกัน SQL injection ไม่ใช่ brute force เพราะยังไม่มี rate limiting หรือ account lockout การโจมตีด้วย Intruder แบบเดิมจึงยังใช้ได้ การแก้ช่องโหว่ประเภทหนึ่งไม่ได้ช่วยป้องกันช่องโหว่อีกประเภท
11.3 High Security (ระดับสูง)#
// Anti-CSRF token required on every request
checkToken( $user_token, $_SESSION[ 'session_token' ], 'index.php' );phpanti-CSRF token คือค่าสุ่มลับที่ server ใส่ไว้ในหน้า login และผูกกับ session ทุก request ต้องส่ง token ที่ตรงกันกลับมา มิฉะนั้นจะถูกปฏิเสธ หน้าที่หลักคือป้องกัน Cross-Site Request Forgery แต่ยังช่วยขัดขวาง brute force ด้วย เพราะการเดาแต่ละครั้งต้องดึง token ใหม่จากหน้าเว็บก่อน ทำให้เครื่องมือที่เพียง replay request เดิมใช้ไม่ได้
11.4 Impossible Security (ระดับสูงสุด)#
// PDO with prepared statements
// Strong password hashing
// Comprehensive input validation
// Rate limiting
// Account lockout
// 2FA readyphpระดับนี้รวมการป้องกันทุกอย่างจากบทที่ 3 ไว้พร้อมกัน ทั้ง PDO prepared statements ที่ปิดช่องทาง SQL injection, password hashing (bcrypt/argon2) ที่ปกป้องข้อมูลแม้ database รั่วไหล และ rate limiting กับ account lockout ที่จำกัดความเร็วและจำนวนครั้งในการเดา การโจมตีจะถูกหน่วงจนหยุดก่อนที่ wordlist จะถูกทดสอบหมด ถือเป็น defense-in-depth ที่นำมาใช้อย่างถูกต้อง
12. การป้องกันในทางปฏิบัติ#

12.1 ตัวอย่างการทำ Rate Limiting ด้วย PHP#
ตัวอย่าง rate limiter อย่างง่ายที่อาศัย session:
<?php
session_start();
// Check for an active lockout
if (isset($_SESSION['failed_attempts']) && $_SESSION['failed_attempts'] > 5) {
if (time() < $_SESSION['lockout_time']) {
die("Account locked. Try again later.");
} else {
// Lockout expired, reset the counters
unset($_SESSION['failed_attempts']);
unset($_SESSION['lockout_time']);
}
}
// On a failed login, increment and lock if needed
if (login_failed) {
$_SESSION['failed_attempts'] = isset($_SESSION['failed_attempts'])
? $_SESSION['failed_attempts'] + 1
: 1;
if ($_SESSION['failed_attempts'] > 5) {
$_SESSION['lockout_time'] = time() + 900; // 15 minutes
}
}
?>php12.2 Web Application Firewall (WAF) — ไฟร์วอลล์สำหรับเว็บแอปพลิเคชัน#
บังคับ rate limit ที่ระดับ web server หรือ WAF
# Nginx example
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location /login {
limit_req zone=login burst=3 nodelay;
# ... rest of config
}nginx# Apache mod_security example
SecAction "id:1001,phase:1,nolog,pass,initcol:ip=%{REMOTE_ADDR}"
SecRule IP:FAILED_LOGINS "@gt 5" "phase:1,deny,status:429,msg:'Rate limit exceeded'"apache13. Detection and Monitoring (การตรวจจับและเฝ้าระวัง)#

13.1 การวิเคราะห์ Logs#
การ login ล้มเหลวซ้ำหลายครั้งจาก IP เดียวกันคือลายเซ็นคลาสสิกของ brute force attack:
[2024-04-23 10:15:23] FAILED LOGIN - user: admin, IP: 192.168.1.100
[2024-04-23 10:15:24] FAILED LOGIN - user: admin, IP: 192.168.1.100
[2024-04-23 10:15:25] FAILED LOGIN - user: admin, IP: 192.168.1.100bashตัวอย่างคำสั่งที่มีประโยชน์สำหรับ monitoring:
# Count failed logins by IP
grep "FAILED LOGIN" /var/log/auth.log | awk '{print $NF}' | sort | uniq -c
# Real-time monitoring of login POSTs
tail -f /var/log/apache2/access.log | grep "POST.*login"bash13.2 Alerting (การแจ้งเตือน)#
ควรตั้งค่า alert สำหรับเหตุการณ์ต่อไปนี้:
# Multiple failed logins from same IP (5+ in 1 minute)
alert: auth_failures > 5 within 60 seconds
# Login attempts from unusual locations
alert: country NOT in ["US", "CA", "UK", "TH"]
# Login attempts outside business hours
alert: time NOT BETWEEN 09:00 AND 17:00bash14. Quick Reference (สรุปอ้างอิงฉบับย่อ)#
14.1 Burp Suite Keyboard Shortcuts (คีย์ลัดของ Burp Suite)#
| Shortcut | Action |
|---|---|
Ctrl + I | เปิด/ปิด intercept |
Ctrl + F | Forward request |
Ctrl + D | Drop request |
Ctrl + Shift + I | Send to Intruder |
Ctrl + Shift + R | Send to Repeater |
14.2 Password Wordlists ที่นิยมใช้งาน#
| Wordlist | Size | Source |
|---|---|---|
passwords.txt | ~3,000 | John the Ripper |
rockyou.txt | ~14 million | Breach data |
10k-most-common.txt | 10,000 | SecLists |
14.3 Defense Checklist (เช็กลิสต์การป้องกัน)#
- ✅ ใช้ strong password policy (12+ ตัวอักษร มีความซับซ้อน)
- ✅ ตั้งค่า rate limiting (5 ครั้งต่อนาที)
- ✅ ใช้ account lockout (15+ นาที)
- ✅ เปิดใช้งาน 2FA / MFA
- ✅ ใช้ CAPTCHA หลัง login ผิดหลายครั้ง
- ✅ เปิด logging และ monitoring
- ✅ ตั้งค่า WAF rules
- ✅ บังคับใช้งาน HTTPS
- ✅ เก็บรหัสผ่านด้วย bcrypt หรือ argon2
15. Next Steps (ขั้นตอนถัดไป)#
ขอแสดงความยินดี! เมื่อเรียนรู้และทดลองทำ Brute Force Attack Lab จบแล้ว จะได้สิ่งต่อไปนี้:
- ✅ เข้าใจหลักการของ brute force attacks
- ✅ เรียนรู้แนวทางป้องกัน
- ✅ ฝึกใช้งาน DVWA
- ✅ ใช้งาน Burp Suite ในการวิเคราะห์ requests
- ✅ วิเคราะห์ผลลัพธ์จาก brute force attacks ได้
15.1 Recommended Learning Path (เส้นทางการเรียนรู้ที่แนะนำ)#

- SQL Injection — การโจมตีฐานข้อมูล
- Cross-Site Scripting (XSS) — Client-side attacks
- Session Hijacking — การขโมย session
- Security Testing Methodologies — OWASP Testing Guide
- Secure Coding — การพัฒนา software อย่างปลอดภัย
15.2 Practice Resources (แหล่งฝึกฝน)#
| Resource | URL |
|---|---|
| OWASP Top 10 | https://owasp.org/www-project-top-ten/ ↗ |
| Burp Suite Documentation | https://portswigger.net/burp/documentation ↗ |
| DVWA Documentation | https://github.com/digininja/DVWA ↗ |
| Web Security Academy | https://portswigger.net/web-security ↗ |
| SecLists | https://github.com/danielmiessler/SecLists ↗ |
15.3 Ethical and Legal Considerations (ข้อพิจารณาด้านจริยธรรมและกฎหมาย)#
⚠️ IMPORTANT
- ทดสอบเฉพาะ systems ที่เป็นเจ้าของหรือได้รับอนุญาตเป็นลายลักษณ์อักษรเท่านั้น
- การ brute force โดยไม่ได้รับอนุญาตถือว่าผิดกฎหมาย
- ใช้ความรู้เพื่อ defensive purposes และ authorized testing
- รายงาน vulnerabilities อย่างมีความรับผิดชอบผ่านช่องทางที่เหมาะสม
การเข้าถึง computer systems โดยไม่ได้รับอนุญาตถือเป็นความผิดทางกฎหมายในหลายประเทศ เนื้อหานี้จัดทำขึ้นเพื่อ การศึกษาเท่านั้น และควรฝึกภายใน lab environment ที่แยกจากระบบจริง เช่น DVWA เท่านั้น
Happy learning and stay ethical! 🔐