เมื่อเร็ว ๆ นี้มีข่าวออกมา พนักงานสี่คนของแผนกความปลอดภัยเครือข่ายของอาลีบาบาใช้ช่องโหว่ของหน้าเว็บในการเขียนสคริปต์ JS เพื่อคว้า Mooncakes ดังนั้นพวกเขาจึงรู้สึกทึ่ง พวกเขาต้องการทราบวิธีการเขียนสคริปต์ JS นี้และวิธีการใช้คำสั่งซื้อและการคว้าปืนต่างๆ
การโจมตีแบบฉีดจาวาสคริปต์คืออะไร?
1. เมื่อใดก็ตามที่เนื้อหาที่ป้อนโดยผู้ใช้และซ้ำซ้อนเว็บไซต์จะเสี่ยงต่อการโจมตีฉีดจาวาสคริปต์ ลองดูแอปพลิเคชันเฉพาะที่มีความเสี่ยงต่อการโจมตีฉีดจาวาสคริปต์ สมมติว่ามีการสร้างเว็บไซต์ความคิดเห็นของลูกค้าแล้ว ลูกค้าสามารถเยี่ยมชมเว็บไซต์และป้อนข้อมูลข้อเสนอแนะเกี่ยวกับผลิตภัณฑ์ เมื่อลูกค้าส่งข้อเสนอแนะข้อมูลข้อเสนอแนะจะถูกซ้ำในหน้าข้อเสนอแนะ
เว็บไซต์ความคิดเห็นของลูกค้าเป็นเว็บไซต์ที่เรียบง่าย น่าเสียดายที่เว็บไซต์นี้มีความเสี่ยงต่อการโจมตีฉีดจาวาสคริปต์
สมมติว่าข้อความต่อไปนี้กำลังถูกป้อนลงในแบบฟอร์มความคิดเห็นของลูกค้า:
<script> Alert (Attack!) </script>
ข้อความนี้แสดงถึงสคริปต์ JavaScript ที่แสดงกล่องข้อความเตือน หลังจากมีคนส่งสคริปต์นี้ไปยังแบบฟอร์มความคิดเห็นของลูกค้าการโจมตีข้อความ! จะปรากฏขึ้นเมื่อทุกคนเข้าชมเว็บไซต์ความคิดเห็นของลูกค้าในอนาคต
2. ประเภทอื่นคือป้อนรหัส JS ในแถบที่อยู่เบราว์เซอร์เพื่อเปลี่ยนเนื้อหาของตัวแปรหน้า JS และฉลากหน้า
การใช้การฉีดจาวาสคริปต์ผู้ใช้สามารถเปลี่ยนเนื้อหาได้โดยไม่ต้องปิดหรือบันทึกหน้าเว็บซึ่งทำในแถบที่อยู่ของเบราว์เซอร์ ไวยากรณ์ของคำสั่งมีดังนี้:
JavaScript: Alert (#คำสั่ง#)
ตัวอย่างเช่นหากคุณต้องการดูกล่องเตือนการแจ้งเตือนบนเว็บไซต์ http://www.example.com ก่อนอื่นให้ป้อน URL ในแถบที่อยู่และรอให้หน้าโหลดแล้วลบ URL และป้อน:
JavaScript: Alert (Hello World)
เป็น URL ใหม่ สิ่งนี้จะปรากฏขึ้น Hello World Warning Box โดยใช้เทคนิคนี้เพื่อเปลี่ยนเกือบทุกอย่างบนหน้าเว็บเช่นรูปภาพ สมมติว่ามีภาพโลโก้เว็บไซต์และเราพบหนึ่งในรหัส HTML โดยดูที่ไฟล์แหล่งที่มาของหน้า:
<img name = hi src = hello.gif>
รูปภาพมีชื่อว่า HI ไฟล์ต้นฉบับคือ hello.gif เราต้องการเปลี่ยนเป็นไฟล์ bye.jpeg ที่เก็บไว้ในเว็บไซต์ของเรา (http://www.mysite.com) ดังนั้นที่อยู่ URL เต็มรูปแบบของภาพคือ http://www.mysite.com/bye.jpeg
JavaScript: Alert (document.hi.src = http: //www.mysite.com/bye.jpeg)
คุณจะเห็นป๊อปอัพ http://www.mysite.com/bye.jpegalert คำเตือนและภาพเปลี่ยนไป ควรสังเกตว่าการเปลี่ยนแปลงเหล่านี้เป็นเพียงชั่วคราว! หากคุณรีเฟรชหน้าหรือป้อนการเปลี่ยนแปลงของคุณจะหายไปอีกครั้งเนื่องจากคุณเพิ่งทำการเปลี่ยนแปลงเหล่านี้บนพีซีของคุณไม่ใช่บนเว็บเซิร์ฟเวอร์
การใช้วิธีเดียวกันเราสามารถดูหรือเปลี่ยนค่าของตัวแปรตัวอย่างเช่นเราพบชิ้นส่วนของรหัสเช่นนี้บนหน้าเว็บ:
<ภาษาสคริปต์ = JavaScript> var a = test </script>
หมายความว่าค่าของตัวแปร A คือการทดสอบและตอนนี้เราป้อน:
JavaScript: Alert (A)
จากนั้นเราเปลี่ยนค่าเป็นสวัสดี:
JavaScript: Alert (A = Hello)
การฉีดจาวาสคริปต์มักจะใช้ในการเปลี่ยนคุณสมบัติของฟอร์มโดยสมมติว่ามีรหัสชิ้นส่วนเช่นนี้:
<form name = format action = send.php method = post> <input type = name hidden = mail [email protected]> <input type = name name = name> <input type = submit value = submit> </form>
เราต้องการให้แบบฟอร์มถูกส่งไปยังกล่องจดหมายของเราไม่ใช่ [email protected] คุณสามารถใช้คำสั่งต่อไปนี้:
JavaScript: Alert ([email protected])
•บางทีคุณอาจสังเกตเห็นความสัมพันธ์แบบลำดับชั้นของคำสั่งเหล่านี้:
•เราอธิบายตามลำดับจากซ้ายไปขวา:
• 1) เอกสารซ้ายสุดคือเอกสาร
• 2) จากนั้นมีชื่อวัตถุที่เราต้องการเปลี่ยน (เช่น document.hi.src) หรือวัตถุที่มี (เช่น document.format.mail.value)
• 3) ในที่สุดก็มีคุณสมบัติที่เราต้องการเปลี่ยน (เช่น Source Path: document.hi.src หรือค่าตัวแปร: document.format.mail.value)
• 4) ใช้. การแยกจำนวนมาก
• 5) เมื่อเราต้องการเปลี่ยนค่าแอตทริบิวต์เราจะใช้เครื่องหมาย = และค่าแอตทริบิวต์ใหม่
•*หมายเหตุ: เมื่อค่าแอตทริบิวต์ใหม่เป็นสตริง (ตัวอย่างเช่น: [email protected]) มันจะต้องถูกแนบมาในราคาสองเท่า
•หากเราต้องการใช้เป็นค่าสำหรับตัวแปรเราไม่จำเป็นต้องใช้คำพูดสองเท่า ตัวอย่างเช่นหากเราต้องการกำหนดค่าของตัวแปร B ให้กับตัวแปร A เราสามารถป้อน JavaScript: Alert (A = B)
•อย่างไรก็ตามแท็กส่วนใหญ่ในหน้าไม่มีชื่อเช่น:
<form action = send.php method = post> <input type = name hidden = mail [email protected]> <อินพุตประเภท = ชื่อข้อความ = ชื่อ> <อินพุตประเภท = ส่งค่า = ส่ง> </form>
ไม่มีชื่อฟอร์มในรหัสนี้ จากข้อมูลข้างต้นคุณสามารถใช้คำสั่งนี้:
JavaScript: Alert (เอกสาร. .mail.value = [email protected])
ในกรณีนี้เราต้องนับและค้นหาหมายเลขลำดับฟอร์มและต่อไปนี้เป็นตัวอย่าง:
<form action = method.php method = post> <อินพุตประเภท = ชื่อข้อความ = ชื่อ> <อินพุตประเภท = ส่งค่า = ส่ง> </ฟอร์ม> <ฟอร์มแอ็คชั่น = เมธอด send.php = โพสต์> <อินพุตประเภท = ชื่อที่ซ่อน = ค่าจดหมาย[email protected]> <อินพุตประเภท = ชื่อข้อความ = ชื่อ value = submit> </form>
•ในรหัสข้างต้นเราเห็น 3 รูปแบบ แต่เราสนใจเพียงรูปแบบที่สองดังนั้นหมายเลขฟอร์มที่เราต้องการคือ 2 อย่าลืมว่าเราเริ่มจาก 1 เช่น 1, 2, 3, 4 ... ในขณะที่ JavaScript เริ่มต้นจาก 0 เช่น 0, 1, 2, 3 ... เราจะใช้หมายเลขซีเรียลนี้เพื่อทำคำสั่งให้เสร็จสมบูรณ์:
JavaScript: Alert (document.forms [1] .mail.value = [email protected])
•วิธีนี้คุณสามารถเปลี่ยนรูปภาพหรือลิงก์โดยไม่มีชื่อและคุณสามารถเปลี่ยนฟอร์มเป็นประเภทแท็กที่คุณต้องการ สำหรับภาพ
JavaScript: Alert (document.images [3] .src =#URL ของรูปภาพที่คุณต้องการ#)
สำหรับลิงค์คือ
JavaScript: Alert (document.links [0] .href =#URL ที่คุณต้องการ#)
ในที่สุดเราสามารถใช้เทคนิคนี้เพื่อแก้ไขคุกกี้ คำสั่งต่อไปนี้เขียนโดย dr_amado จาก triviasecurity.net และฉันแก้ไขเพียงเล็กน้อยเพื่อให้มันปรากฏก่อนที่ผู้ใช้แก้ไข คุณเพียงแค่ต้องคัดลอกไปยังแถบที่อยู่:
JavaScript: การแจ้งเตือน (window.c = ฟังก์ชั่น a (n, v, nv) {c = document.cookie; c = c.substring (c.indexof (n)+n.length, c.length); c = c.substring (1, (c.indexof (;)>-1)? c.length)); nc = Unsescape (c). replace (v, nv); document.cookie = n+=+หลบหนี (nc); return unescape (document.cookie);}); แจ้งเตือน ('คุกกี้คือ:'+document.cookie+');// หากคุณต้องการเปลี่ยนคุกกี้ของคุณด้วยตนเองคุณสามารถใช้คำสั่งต่อไปนี้:
JavaScript: Alert (document.cookie)
สิ่งนี้จะแสดงคุกกี้ปัจจุบันของคุณโดยสมมติว่า userId = 1 หากคุณต้องการเปลี่ยนเป็น userId = 2 คุณสามารถใช้คำสั่งต่อไปนี้:
JavaScript: Alert (document.cookie = userId = 2)
ในที่สุดฉันต้องเน้นว่าการเปลี่ยนแปลงทั้งหมดอยู่ทางด้านลูกค้า! มันเหมือนกับการบันทึกหน้าเว็บบนพีซีของคุณและแก้ไข ถึงกระนั้นการใช้เคล็ดลับนี้คุณยังสามารถหลอกหน้า (เช่นคุกกี้) หรือบายพาสการตรวจสอบความปลอดภัย ตัวอย่างเช่นเว็บเพจบางหน้าจะตรวจจับตำแหน่งที่ผู้ใช้ส่งข้อมูล หากคุณส่งข้อมูลจาก http://www.test.com/form.php ไปที่ http://www.test.com/check.php, check.php อาจตรวจพบว่าข้อมูลมาจากแบบฟอร์มบน http://www.test.com/form.php นอกจากนั้นหากคุณวางแผนที่จะป้อนรหัส JavaScript ของคุณเองลงในหน้าโดยใช้เทคนิคเหล่านี้คุณจะสามารถเปลี่ยนรูปภาพและปล่อยให้มันเหมือนเดิม!
ในที่สุดเนื่องจากการฉีด JS นั้นแย่มากเราต้องแก้ปัญหาอะไรเพื่อป้องกันการฉีด JS บนเว็บไซต์ที่เราเขียนเอง?
วิธีที่ 1:
วิธีที่ง่ายในการป้องกันการโจมตีแบบฉีดจาวาสคริปต์คือการเข้ารหัสข้อมูลที่ผู้ใช้เว็บไซต์ใด ๆ ใน HTML ใน HTML เมื่อมีการแสดงข้อมูลซ้ำในมุมมอง
ตัวอย่างเช่น: <%= html.encode (feedback.message)%>
ความหมายของการใช้ HTML ในการเข้ารหัสสตริงคืออะไร? เมื่อใช้ HTML เพื่อเข้ารหัสสตริงอักขระอันตรายเช่น <และ> จะถูกแทนที่ด้วยเอนทิตี HTML เช่น <และ> ดังนั้นเมื่อสตริง <script> Alert (boo!) </script> ถูกเข้ารหัสโดยใช้ HTML มันจะถูกแปลงเป็น <script> Alert (Attack!) </script> เบราว์เซอร์จะไม่เรียกใช้สคริปต์ JavaScript อีกต่อไปเมื่อแยกวิเคราะห์สตริงที่เข้ารหัส แต่มันแสดงหน้าไม่เป็นอันตราย
วิธีที่ 2:
นอกเหนือจากการใช้ HTML เพื่อเข้ารหัสข้อมูลเมื่อแสดงข้อมูลในมุมมองคุณยังสามารถใช้ HTML เพื่อเข้ารหัสข้อมูลก่อนที่จะส่งไปยังฐานข้อมูล
Stringescapeutils.escapehtml (ข้อมูลที่ส่งโดยแผนกต้อนรับ);
บ่อยครั้งที่ผู้คนชอบใช้วิธีแรกที่กล่าวถึงในบทช่วยสอนนี้ไม่ใช่วิธีที่สอง ปัญหาเกี่ยวกับวิธีการที่สองคือข้อมูลที่เข้ารหัส HTML จะถูกเก็บไว้ในฐานข้อมูลในที่สุด กล่าวอีกนัยหนึ่งข้อมูลในฐานข้อมูลจะมีอักขระแปลก ๆ ข้อเสียของสิ่งนี้คืออะไร? หากคุณต้องการแสดงข้อมูลฐานข้อมูลในรูปแบบอื่นนอกเหนือจากหน้าเว็บคุณจะพบปัญหา ตัวอย่างเช่นข้อมูลไม่สามารถแสดงได้อย่างง่ายดายในแอพพลิเคชั่น Windows Forms
ขอบคุณชาวเน็ตสำหรับการแบ่งปัน: http://zxf-noimp.iteye.com/blog/1130771
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น