ถ้าคิดว่าเว็บคือ “บ้านดิจิทัล” ของธุรกิจ คุณก็อยากให้ทุกบานประตู ตั้งแต่ประตูหน้าไปจนถึงช่องลับหลังครัว ถูกล็อกแน่นก่อนที่ใครสักคนจะเล็ดรอดเข้าไปได้ OWASP Top 10 คือรายการ “10 ความเสี่ยงยอดฮิตบนแอปเว็บ” ที่องค์กรควรรู้และป้องกันให้เป็นกิจวัตร เพราะนี่แหละคือจุดที่ผู้โจมตีใช้บ่อยที่สุด
บทความนี้ถอดมุมมองแบบ White Hat Hacker: เราไม่ได้แค่ชี้รูรั่ว แต่ช่วยคุณอุดมันด้วยขั้นตอนที่ทำได้จริง พร้อมตัวอย่างเคสที่ทีม Dev/SecOps เจอบ่อย
1) Broken Access Control — สิทธิ์หลวม ใครๆ ก็แอบเข้าห้องสำคัญได้
ความหมาย: ระบบอนุญาต/ห้ามเข้าถึงบริเวณทำงานไม่ครบ จนคนสิทธิ์ต่ำกว่าเข้าถึงความลับได้
เปรียบเทียบ: ประตูหลังร้านไม่ล็อกทำให้ลูกค้าธรรมดาเปิดเข้าห้องเก็บเงินได้
ตัวอย่างบนเว็บ: เปลี่ยน ?order_id=101 เป็น 102 แล้วเห็นออร์เดอร์ของคนอื่น (IDOR)
ผลกระทบ: PII/ธุรกรรม ถูกเปิดเผย, เปลี่ยนบทบาทเป็นแอดมิน, เสียความเชื่อมั่น
สัญญาณเตือน: บัญชีธรรมดาเข้าหน้า /admin หรือ API ผู้ดูแลแล้วไม่ 403 http error code
ตัวอย่างการป้องกันเบื้องต้น:
เช็คสิทธิ์ที่ฝั่งเซิร์ฟเวอร์ทุกครั้ง (อย่าพึ่งแค่ซ่อนปุ่มใน UI)
ใช้ RBAC/ABAC + ตรวจก่อนอ่าน/แก้ไข
เขียนเทสต์เคส: ผู้ใช้ A ต้องทำไม่ได้ กับทรัพยากรของผู้ใช้ B
2) Cryptographic Failures — เข้ารหัสพลาด เหมือนวางกุญแจไว้หน้าบ้าน
ความหมาย: ข้อมูลสำคัญไม่ถูกเข้ารหัส/ปกป้องอย่างเหมาะสม
เปรียบเทียบ: เก็บเงินสดในลิ้นชักโดยไม่ล็อก
ตัวอย่างบนเว็บ: ใช้ HTTP, เก็บรหัสผ่านเป็น plaintext/MD5, token ไม่หมดอายุ
ผลกระทบ: ถ้าหลุด=อ่านได้ทันที, นำรหัสไปใช้ที่อื่น (credential stuffing)
สัญญาณเตือน: เปิดเว็บแบบ http:// ได้, error/Log โชว์ข้อมูลความลับ
ตัวอย่างการป้องกันเบื้องต้น:
บังคับ HTTPS ทุกหน้า
รหัสผ่านใช้ bcrypt/Argon2 + salt
ตรวจอย่าให้ข้อมูลอ่อนไหวไปโผล่ใน error/log
3) Injection — อินพุตกลายเป็นคำสั่งทำให้ใครมาสั่งอะไรก็ได้ (SQL/OS/Template/NoSQL)
ความหมาย: ช่องกรอก/URL ถูกตีความเป็นคำสั่งโดยไม่ได้ตั้งใจ
เปรียบเทียบ: ให้คนแปลกหน้าตะโกนสั่งพนักงานหลังครัวได้โดยตรง
ตัวอย่างบนเว็บ: ต่อสตริง SQL จากค่าที่ผู้ใช้กรอก, Template Injection, Command Injection
ผลกระทบ: อ่าน/ลบข้อมูลจำนวนมาก, ยึดเครื่อง, ฝัง backdoor
สัญญาณเตือน: ใส่ ‘ ” — ) แล้วเว็บ error แปลกๆ
ตัวอย่างการป้องกันเบื้องต้น:
ใช้ Prepared Statement/Parameterized Query/ORM
Validate อินพุตแบบ allow-list ตามชนิดข้อมูล (ตัวเลข/รูปแบบ)
บัญชี DB ใช้สิทธิ์เท่าที่จำเป็น (Least Privilege)
4) Insecure Design — ออกแบบไม่คิดถึงความปลอดภัยตั้งแต่แรก
ความหมาย: การออกแบบโปรแกรม/ฟีเจอร์มี=ช่องโหว่การใช้ในทางที่ผิด
เปรียบเทียบ: สร้างบ้านเสร็จค่อยนึกได้ว่าควรมีรั้ว
ตัวอย่างบนเว็บ: ล็อกอินไม่มี rate-limit/lockout, โอนเงินไม่มียืนยันชั้นสอง
ผลกระทบ: ต้องรื้อแก้ทีหลัง แพงและช้า, ความเสี่ยงค้างยาว
สัญญาณเตือน: เอกสารออกแบบไม่มี Threat Modeling เลย
ตัวอย่างการป้องกันเบื้องต้น:
ทำ Threat Modeling (เช่น STRIDE) ตั้งแต่เริ่ม
ตั้ง Secure Defaults (ปิดฟีเจอร์เสี่ยงเป็นค่าเริ่มต้น)
ใส่ rate-limit/step-up auth ในจุดเปราะบางโดยดีไซน์
5) Security Misconfiguration — ตั้งค่าพลาด เปิดไฟโชว์ทั้งร้าน
ความหมาย: ค่าคอนฟิก/สิทธิ์/ส่วนขยาย(Extensions)ไม่ปลอดภัยในโปรดักชัน
เปรียบเทียบ: ลืมปิดไฟ-ป้ายบอกทางให้โจรเห็นหมด
ตัวอย่างบนเว็บ: เปิด debug ในโปรดักชัน, ไม่มี CSP/ X-Frame-Options, เปิด directory listing
ผลกระทบ: เผยข้อมูลระบบ, ถูกโจมตีขั้นต่อไปง่ายขึ้น
สัญญาณเตือน: หน้า error โชว์ stack trace, header ความปลอดภัยหาย
ตัวอย่างการป้องกันเบื้องต้น:
ปิด debug/verbose ในโปรดักชัน + ใช้ baseline ที่ harden
เปิด CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy
ถอนบริการ/ปลั๊กอินที่ไม่ใช้ + ตรวจ config drift เป็นรอบ
6) Vulnerable & Outdated Components — ใช้ไลบรารี/ปลั๊กอิน/เฟรมเวิร์กเก่าที่คนทั้งโลกรู้ว่ามีช่องโหว่
ความหมาย: ไลบรารี/ปลั๊กอิน/เฟรมเวิร์กเวอร์ชันมีรูรั่วหรือช่องโหว่
เปรียบเทียบ: เอาบานพับสนิมมาใส่ประตูหน้าทำให้โจรพังเข้ามาได้
ตัวอย่างบนเว็บ: ไม่เคย npm audit/pip-audit, ใช้ปลั๊กอิน CMS เก่ามาก
ผลกระทบ: โดนโจมตีด้วยสูตรสำเร็จ (มี PoC พร้อม) กระทบกว้าง
สัญญาณเตือน: ไม่รู้ด้วยซ้ำว่าโปรเจ็กต์ใช้เวอร์ชันอะไร (ไม่มี SBOM)
ตัวอย่างการป้องกันเบื้องต้น:
ทำ/อัปเดต SBOM และสแกน dependency เป็นกิจวัตร
เปิดบอทอัปเดต (Dependabot/Renovate) + กำหนดรอบแพตช์
ทดสอบบน canary ก่อนปล่อยจริง
7) Identification & Authentication Failures — การออกแบบระบบล็อกอินหละหลวม กุญแจหาไม่ยาก
ความหมาย: พิสูจน์ตัวตน/จัดการเซสชันไม่แน่น
เปรียบเทียบ: ประตูหน้ามีกุญแจง่ายๆหละหลวม และไม่เคยเปลี่ยน
ตัวอย่างบนเว็บ: ไม่มี MFA, คุกกี้ไม่มี HttpOnly/Secure เดาผิดกี่ครั้งก็ได้
ผลกระทบ: ยึดบัญชี, โกงธุรกรรม, ขโมยข้อมูล
สัญญาณเตือน: ล็อกอินผิด 20 ครั้งติด ระบบยังเฉย
ตัวอย่างการป้องกันเบื้องต้น:
เปิด MFA/2FA (TOTP/WebAuth)
ตั้งคุกกี้เซสชันให้ปลอดภัย + หมุนเซสชันหลังล็อกอิน
ใส่ rate-limit/lockout สำหรับความพยายามล้มเหลว
8) Software & Data Integrity Failures — รับซอฟต์แวร์/ข้อมูลโดยไม่เช็คว่า “ของแท้ไหม”
ความหมาย: ใช้โค้ด/อัปเดต/สคริปต์ที่ไม่ยืนยันแหล่งที่มา หรือ CI/CD ไม่มีกฎคุมเข้ม
เปรียบเทียบ: รับพัสดุจากคนแปลกหน้าโดยไม่ดูบัตร
ตัวอย่างบนเว็บ: โหลดสคริปต์จาก CDN โดยไม่ใช้ SRI, ใครก็ push เข้า main ได้
ผลกระทบ: โค้ดถูกฝังของแถม (มัลแวร์), กระทบลูกค้าจำนวนมาก
สัญญาณเตือน: ไม่มี signing/checksum ของ artifact, secret โผล่ใน repo
ตัวอย่างการป้องกันเบื้องต้น:
ใช้ signed releases/verify checksum + เปิด SRI สำหรับสคริปต์ภายนอก
CI/CD เปิด branch protection + required reviews, เก็บ secret ใน vault
9) Security Logging & Monitoring Failures — มีกล้องแต่ไม่อัด/ไม่มีคนดู
ความหมาย: ไม่เก็บ log สำคัญ หรือเก็บแต่ไม่มีการแจ้งเตือน
เปรียบเทียบ: ร้านมีกล้องแต่ปิดเสียง/ไม่เคยเช็คเทปกล้องวงจรปิด
ตัวอย่างบนเว็บ: ล็อกอินผิดรัวๆ ไม่มี alert, เหตุการณ์สำคัญไม่ถูกบันทึก
ผลกระทบ: รู้ตัวช้า กู้คืนยาก, ขาดหลักฐานสืบสวน
สัญญาณเตือน: ไม่มี correlation ID, หาเหตุการณ์ข้ามบริการไม่เจอ
ตัวอย่างการป้องกันเบื้องต้น:
กำหนด log schema กลาง และรวมศูนย์ไป SIEM
ตั้ง Alert Rule กับเหตุการณ์เสี่ยง (ทดสอบให้เด้งจริง)
ทำ runbook/incident drill และกำหนดระยะเก็บ log ให้พอ
10) SSRF — หลอกให้เซิร์ฟเวอร์เรา “ไปหยิบของให้โจร”
ความหมาย: ผู้โจมตีกรอก URL แล้วทำให้แบ็กเอนด์ของเราไปเรียกปลายทางที่เขาคุม/เครือข่ายภายใน
เปรียบเทียบ: ให้พนักงานในบ้านไปเปิดประตูหลังให้โจรโดยไม่รู้ตัว
ตัวอย่างบนเว็บ: ฟอร์ม “ดึงรูปจาก URL” ที่รับ http://169.254.169.254 (metadata service) ได้
ผลกระทบ: เข้าถึงบริการภายใน, ดึงความลับ, ใช้เป็นฐานสแกนเครือข่าย
สัญญาณเตือน: รับ localhost, IP private, และตาม redirect โดยไม่ตรวจ
ตัวอย่างการป้องกันเบื้องต้น:
Deny-by-default egress: บล็อกออกเน็ต ยอมเฉพาะ allow-list
ตรวจ/normalize URL, ปฏิเสธ IP ภายใน/redirect เสี่ยง
แยก “fetcher service” ให้ sandbox และไม่มีสิทธิ์แตะภายใน
มุมมองของ White Hat Hacker
“หน้าที่เราไม่ใช่แค่ ‘หา’ ช่องโหว่ แต่คือทำให้ทีมเห็นความเสี่ยงก่อนคนร้าย แล้วปิดมันอย่างยั่งยืน ด้วยกระบวนการที่ซ้ำได้ อัตโนมัติได้ และตรวจสอบได้” และเราจำลองการโจมตีอย่างมีจรรยาบรรณ ไม่ทำลายข้อมูล และส่งมอบรายงานเชิงปฏิบัติที่ทีม Dev/SecOps ใช้ลงมือแก้ได้ทันที
