ph-sanchat.github.io

LDAP Injection

การโจมตีด้วย LDAP Injection ใช้ช่องโหว่ในการตรวจสอบความถูกต้องของอินพุตเพื่อ Inject และดำเนินการสืบค้นไปยังเซิร์ฟเวอร์ Lightweight Directory Access Protocol บริการ LDAP มีความสำคัญต่อการดำเนินงานประจำวันของหลายองค์กรและการโจมตีด้วย LDAP Injection ที่ประสบความสำเร็จสามารถให้ข้อมูลที่มีค่าสำหรับการโจมตีฐานข้อมูลและแอปพลิเคชันภายในเพิ่มเติม บทความนี้กล่าวถึงวิธีการทำงานของ LDAP Injection และแสดงวิธีป้องกันเพื่อปรับปรุงความปลอดภัยของเว็บแอปพลิเคชัน

ความสำคัญของเซิร์ฟเวอร์ LDAP

Lightweight Directory Access Protocol หรือ LDAP เป็นโปรโตคอลแอปพลิเคชันแบบเปิดสำหรับการเข้าถึงและบำรุงรักษาบริการไดเร็กทอรีในเครือข่าย IP (ดูข้อกำหนด RFC 4511) โดยทั่วไปองค์กรจะจัดเก็บข้อมูลเกี่ยวกับผู้ใช้และทรัพยากรในไดเร็กทอรีกลาง (เช่น Active Directory) และแอปพลิเคชันสามารถเข้าถึงและจัดการข้อมูลนี้โดยใช้คำสั่ง LDAP เซิร์ฟเวอร์ LDAP เป็นประตูสู่ข้อมูลที่ละเอียดอ่อนมากมายรวมถึงข้อมูลรับรองผู้ใช้ชื่อพนักงานและบทบาทอุปกรณ์ทรัพยากรเครือข่ายที่ใช้ร่วมกันเป็นต้น แม้ว่าจะมีการเผยแพร่สู่สาธารณะน้อยกว่าการโจมตีด้วยการฉีด SQL แต่การโจมตีด้วยการฉีด LDAP สามารถให้ข้อมูลที่มีค่าเกี่ยวกับโครงสร้างพื้นฐานภายในขององค์กรและอาจทำให้ผู้โจมตีสามารถเข้าถึงเซิร์ฟเวอร์ฐานข้อมูลและระบบภายในอื่น ๆ ได้

LDAP Statement Syntax

ไคลเอ็นต์สามารถสอบถามเซิร์ฟเวอร์ LDAP ได้โดยการส่งคำร้องขอรายการไดเร็กทอรีที่ตรงกับตัวกรองเฉพาะ หากพบรายการที่ตรงกับตัวกรองการค้นหา LDAP เซิร์ฟเวอร์จะส่งคืนข้อมูลที่ร้องขอ ตัวกรองการค้นหาที่ใช้ในการสืบค้น LDAP เป็นไปตามไวยากรณ์ที่ระบุใน RFC 4515 (เดิมคือ RFC 2254) ตัวกรองสร้างจากแอตทริบิวต์ LDAP จำนวนเท่าใดก็ได้ที่ระบุเป็นคู่คีย์ - ค่าในวงเล็บ ตัวกรองสามารถรวมกันได้โดยใช้ตัวดำเนินการเชิงตรรกะและตัวดำเนินการเปรียบเทียบและสามารถรวมสัญลักษณ์แทนได้ นี่คือตัวอย่างบางส่วน:

LDAP Injection ทำงานอย่างไร?

เช่นเดียวกับ SQL Injection และการโจมตีด้วยการแทรกโค้ดที่เกี่ยวข้องช่องโหว่ของ LDAP Injection จะเกิดขึ้นเมื่อแอปพลิเคชันแทรกอินพุตของผู้ใช้ที่ไม่ได้รับการรับรองลงในคำสั่ง LDAP โดยตรง ด้วยการสร้างค่าสตริงที่เหมาะสมโดยใช้ไวยากรณ์ตัวกรอง LDAP ผู้โจมตีสามารถทำให้เซิร์ฟเวอร์ LDAP ดำเนินการค้นหาและคำสั่ง LDAP อื่น ๆ หากรวมกับสิทธิ์ที่กำหนดค่าไม่ถูกต้องหรือถูกบุกรุกการฉีด LDAP อาจทำให้ผู้โจมตีสามารถแก้ไขโครงสร้าง LDAP และแทรกแซงข้อมูลที่มีความสำคัญทางธุรกิจได้

ในขณะที่ LDAP Injection มีหลายรูปทรงและขนาดต่อไปนี้เป็นวิธีการทั่วไปสองวิธี:

filterContent = "(&(userID=" + enteredUser + ")(password=" + 
  enteredPwd + "))"

สำหรับผู้ใช้ที่ไม่ประสงค์ร้ายตัวกรองผลลัพธ์ควรเป็นดังนี้:

(&(userID=johndoe)(password=johnspwd))

หากแบบสอบถามนี้เป็นจริงชุดผู้ใช้และรหัสผ่านจะมีอยู่ในไดเร็กทอรีดังนั้นผู้ใช้จึงเข้าสู่ระบบอย่างไรก็ตามผู้โจมตีสามารถป้อนรหัสตัวกรอง LDAP เป็น ID ผู้ใช้ (แสดงเป็นสีแดง) เพื่อสร้างตัวกรองที่เป็นจริงเสมอ ตัวอย่างเช่น:

(&(userID=*)(userID=*))(|(userID=*)(password=anything))

สิ่งนี้สามารถทำให้ผู้โจมตีสามารถเข้าถึงได้โดยไม่ต้องมีชื่อผู้ใช้หรือรหัสผ่านที่ถูกต้อง

(|(resType=printer)(resType=scanner))

หากผู้โจมตีสามารถป้อนค่าอื่นแทนเครื่องพิมพ์และทราบว่า userID ถูกใช้สำหรับชื่อผู้ใช้ในไดเร็กทอรีพวกเขาอาจแทรกโค้ดต่อไปนี้:

(|(resType=printer)(userID=*))(resType=scanner))

นี่จะแสดงรายการเครื่องพิมพ์และอ็อบเจ็กต์ผู้ใช้ทั้งหมดและส่วนของสแกนเนอร์จะถูกละเว้นโดยเซิร์ฟเวอร์ (เฉพาะตัวกรองที่สมบูรณ์ตัวแรกเท่านั้นที่ประมวลผล)

Blind LDAP Injection

หากต้องการสอบถามเซิร์ฟเวอร์ LDAP โดยตรงผู้โจมตีจำเป็นต้องทราบ (หรือคาดเดา) ชื่อแอตทริบิวต์จึงจะระบุในตัวกรองได้ Blind LDAP injection เป็นเทคนิคการหาประโยชน์ขั้นสูงสำหรับการดึงข้อมูลที่ไม่รู้จักโดยการส่งคำขอหลายรายการและตรวจสอบการตอบกลับของเซิร์ฟเวอร์เพื่อตรวจสอบว่าแบบสอบถามนั้นถูกต้องหรือไม่ เมื่อรวมกับการเพิ่มประสิทธิภาพและระบบอัตโนมัติเพิ่มเติมทำให้ผู้โจมตีสามารถรับข้อมูลโดยใช้ชุดคำถามใช่ / ไม่ใช่: การตอบกลับของเซิร์ฟเวอร์ที่ถูกต้องหมายถึง“ ใช่” และข้อผิดพลาดของเซิร์ฟเวอร์หมายถึง“ ไม่ใช่” โดยทั่วไปแล้วการโจมตีด้วยการฉีดยาคนตาบอดที่มีประสิทธิภาพมักเกี่ยวข้องกับหลายขั้นตอน:

(&(userID=John Doe)(objectClass=user))

หากผู้โจมตีสามารถปรับเปลี่ยนค่า ID ผู้ใช้พวกเขาสามารถ Inject โค้ดดังต่อไปนี้เพื่อตรวจสอบว่าออบเจ็กต์ผู้ใช้ในไดเร็กทอรีนี้มี department attribute:

(&(userID=John Doe)(department=*))(objectClass=user))

หาก department attribute มีอยู่ (และ John Doe เป็น ID ผู้ใช้ที่ถูกต้อง) เซิร์ฟเวอร์จะส่งคืนการตอบกลับที่ถูกต้อง มิฉะนั้นผู้โจมตีสามารถลองใช้ชื่อแอตทริบิวต์อื่น ๆ

สมมติว่ามี department attribute จากตัวอย่างก่อนหน้านี้ ในการค้นหาชื่อแผนกผู้โจมตีสามารถเริ่มต้นด้วยการฉีดรหัสต่อไปนี้เพื่อตรวจสอบตัวอักษรตัวแรก:

(&(userID=John Doe)(department=a*))(objectClass=user))

การตอบกลับของเซิร์ฟเวอร์ที่ถูกต้องหมายความว่ามีแผนกที่ขึ้นต้นด้วยตัวอักษร“ a” อยู่ ผู้โจมตีสามารถดำเนินการต่อสำหรับ ab*, ac* และอื่น ๆ เพื่อค้นหาอักขระที่ตามมา สำหรับค่าตัวเลขสามารถใช้ตัวดำเนินการ <= (น้อยกว่าหรือเท่ากับ) และ> = (มากกว่าหรือเท่ากับ) เพื่อผ่านช่องว่างค่าที่เป็นไปได้

(&(userID=John Doe)(department=*x*))(objectClass=user))

หมายความว่ามีชื่อแผนกที่มีตัวอักษร“ x” อยู่ หากมีการส่งคืนข้อผิดพลาดหรือการตอบกลับที่ว่างเปล่าผู้โจมตีสามารถกำจัดอักขระนี้ออกจากการสแกนได้ สิ่งนี้สามารถลดจำนวนคำขอที่จำเป็นในการค้นหาค่าเป้าหมายได้อย่างมาก

การป้องกัน LDAP Injection ในเว็บแอปพลิเคชัน

เช่นเดียวกับการโจมตีแบบฉีดอื่น ๆ การตรวจสอบความถูกต้องและการเข้ารหัสอินพุตที่เหมาะสมในชั้นแอปพลิเคชันเป็นสิ่งสำคัญในการกำจัดช่องโหว่ของการฉีด LDAP ทุกอินพุตของผู้ใช้ที่อาจใช้ในการสืบค้น LDAP ควรได้รับการฆ่าเชื้อตามข้อกำหนดของแอปพลิเคชันและเข้ารหัสเพื่อให้แน่ใจว่าอักขระพิเศษของ LDAP ที่เหลือจะถูกหลีกเลี่ยงอย่างปลอดภัยรวมถึงอย่างน้อย ()! & *. เอกสารข้อมูลสรุป OWASP มีข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับเทคนิคการหลบหนี เพื่อความปลอดภัยและความสะดวกสูงสุดควรใช้เฟรมเวิร์กหรือไลบรารีที่พร้อมใช้สำหรับการหลีกเลี่ยงอักขระพิเศษและการประกอบตัวกรอง LDAP

References:

Author