การเปิดใช้งานการหลบหนีสองครั้งเป็นอันตรายหรือไม่?


136

ฉันมีแอปพลิเคชั่น ASP.NET MVC พร้อมเส้นทางที่อนุญาตให้ค้นหาสิ่งต่างๆผ่าน / search / <searchterm>

เมื่อฉันจัดหา "search / abc" มันทำงานได้ดี แต่เมื่อฉันใส่ "/ search / a + b + c" (เข้ารหัส url อย่างถูกต้อง) IIS7 จะปฏิเสธคำขอที่มี HTTP Error 404.11 ( โมดูลการกรองคำขอถูกกำหนดค่าให้ปฏิเสธ a คำขอที่มีลำดับการหลีกเลี่ยงคู่ ) เหตุใดจึงทำเช่นนี้ ดูเหมือนว่าจะโยนข้อผิดพลาดหากเป็นส่วนหนึ่งของ URL แต่ไม่ได้เป็นส่วนหนึ่งของสตริงการสืบค้น (/ ส่ง? q = a + b + c ใช้ได้ดี)

ตอนนี้ฉันสามารถเปิดใช้งานการร้องขอการหลบหนีสองครั้งในส่วนความปลอดภัยของ web.config ของฉัน แต่ฉันลังเลที่จะทำเช่นนั้นเนื่องจากฉันไม่เข้าใจผลกระทบและสาเหตุที่เซิร์ฟเวอร์ไม่ปฏิเสธคำขอ "a + b + c" เป็น เป็นส่วนหนึ่งของ URL แต่ยอมรับเป็นส่วนหนึ่งของสตริงข้อความค้นหา

ใครช่วยอธิบายและให้คำแนะนำได้บ้างว่าต้องทำอย่างไร?


7
ฉันยังลองใช้ตัวเลือกที่ถูกต้องมากขึ้นในการเรียก Server.Url Path Encode และลงเอยด้วย/search/a%2520b%2520cการมาร์กอัปซึ่งนำไปสู่ข้อผิดพลาด " คำขอที่อาจเป็นอันตรายตรวจพบค่าเส้นทางจากไคลเอ็นต์ (%)" ที่น่ารัก ดูเหมือนว่าคุณไม่สามารถชนะได้
Zhaph - Ben Duguid

คำตอบ:


159

แก้ไข:เพิ่มความสำคัญในส่วนที่เกี่ยวข้อง

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

หากต้องการปิดใช้งานการตรวจสอบให้ทำดังต่อไปนี้ (จากที่นี่ ): (ดูความคิดเห็นของฉันด้านล่างสำหรับสิ่งที่ทำให้เกิดการหลบหนีสองครั้ง)

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

หากสัญลักษณ์บวกเป็นอักขระที่ถูกต้องในอินพุตการค้นหาคุณจะต้องเปิดใช้งาน "allowDoubleEscaping" เพื่ออนุญาตให้ IIS ประมวลผลอินพุตดังกล่าวจากเส้นทางของ URI

สุดท้ายวิธีแก้ปัญหาที่ง่ายมากหากมีข้อ จำกัด คือหลีกเลี่ยง "+" และใช้ "% 20" แทน ไม่ว่าในกรณีใดการใช้สัญลักษณ์ '+' เพื่อเข้ารหัสพื้นที่ไม่ใช่การเข้ารหัส url ที่ถูกต้องแต่เฉพาะเจาะจงสำหรับชุดโปรโตคอลที่ จำกัด และอาจได้รับการสนับสนุนอย่างกว้างขวางเนื่องจากเหตุผลด้านความเข้ากันได้แบบย้อนกลับ หากเพียงเพื่อวัตถุประสงค์ในการบัญญัติศัพท์คุณควรเข้ารหัสช่องว่างเป็น '% 20' แต่อย่างใด และนี่เป็นการหลีกเลี่ยงปัญหา IIS7 (ซึ่งยังสามารถครอบตัดสำหรับลำดับอื่น ๆ เช่น% 25ab)


3
ฉันจะปิดการใช้งานการตรวจสอบ เป็นเรื่องยุ่งยากและไม่ได้เพิ่มความปลอดภัยให้กับแอปส่วนใหญ่
Eamon Nerbonne

3
คุณมีลิงค์ / ข้อมูลอ้างอิงว่าปิดการใช้งานการหลบหนีสองครั้งได้ค่อนข้างปลอดภัยหรือไม่? นอกจากนี้มาตรการรักษาความปลอดภัยนี้ป้องกันไม่ให้เกิดอะไรขึ้น?
Alex

15
หาก uri เป็นค่า Escape สองครั้งส่วนประกอบของ uri ที่ไม่ใช้ Escape อาจมีอักขระที่สงวนไว้ดังนั้น (บางส่วนของ) uri ที่ไม่ใช้ Escape อาจเป็น uri ที่ถูกต้อง ในระยะสั้นหากคุณใช้สตริง uri ที่ไม่ใช้ Escape เพื่อสร้าง uri ใหม่โดยเฉพาะอย่างยิ่งเส้นทางระบบไฟล์และคุณไม่สามารถหลีกเลี่ยงเส้นทางใหม่ได้อย่างถูกต้องคุณอาจอนุญาตให้มีการแทรกเส้นทาง การแทรกพา ธ อาจทำให้ผู้โจมตีสามารถหลอกล่อโปรแกรมของคุณให้ประมวลผลข้อมูลที่ไม่ควรหรือทำให้สับสนโดยคิดว่าอูริสองตัวนั้นแตกต่างกันเมื่อมันเหมือนกัน แต่เพียงแค่เข้ารหัสต่างกัน
Eamon Nerbonne


4
@Stijn: ใช่: ที่ปลอดภัย การตรวจสอบทั้งหมดนี้เป็นการกรองคำขอที่อาจตีความผิดโดยรหัสบั๊กกี้ (โดยเฉพาะถ้าคุณถอดรหัสสองครั้งหรือสร้าง Uri ผ่านสตริงคอนแคตและไม่มีการเข้ารหัสที่เหมาะสม) คุณไม่ได้ทำการประมวลผลใด ๆ ดังนั้นจึงค่อนข้างปลอดภัยโดยอัตโนมัติในส่วนของคุณ ข้อผิดพลาดใด ๆ จะต้องอยู่ในรหัสการให้บริการไฟล์พื้นฐานของ IIS และฉันคิดว่าเราสามารถสรุปได้อย่างปลอดภัยว่าตอนนี้ได้รับการทดสอบการต่อสู้อย่างละเอียดถี่ถ้วนแล้ว อีกครั้งการตรวจสอบนี้เป็นอะไรแฟนซีก็แค่ Bails ในสิ่งที่อาจจะมีการถอดรหัสและจากนั้นมีลักษณะเหมือนการเข้ารหัส URI
Eamon Nerbonne

2

ฉันแค่อยากจะเพิ่มข้อมูลบางอย่างในคำตอบของ Eamon Nerbonneที่เกี่ยวข้องกับส่วน " สิ่งที่ต้องทำ " ในคำถามของคุณ (ไม่ได้อธิบายถึงสาเหตุ)
คุณสามารถเปลี่ยนการตั้งค่าของแอปพลิเคชันเฉพาะได้อย่างง่ายดายด้วย

  1. เปิดคอนโซลด้วยสิทธิ์ผู้ดูแลระบบ (เริ่ม - cmd - คลิกขวาเรียกใช้ในฐานะผู้ดูแลระบบ)
  2. พิมพ์ต่อไปนี้ (นำมาจากที่นี่: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true
    

    (คุณสามารถเช่นแทนYOURSITENAMEด้วยDefault Web Siteสำหรับการใช้กฎนี้ไปยังเว็บไซต์เริ่มต้น)

  3. ใส่ให้พร้อม

ตัวอย่าง:

  1. ประการแรกฉันมีปัญหาเดียวกัน: ข้อผิดพลาด HTTP 404.11 - โมดูลการกรองการร้องขอถูกกำหนดค่าให้ปฏิเสธคำขอที่มีลำดับการหลีกเลี่ยงคู่
  2. การพิมพ์ข้อความที่กล่าวถึงข้างต้น: Drupal7-another วิธีแก้ไขข้อผิดพลาด HTTP 404.11 - โมดูลการกรองคำขอถูกกำหนดค่าให้ปฏิเสธคำขอที่มีลำดับการหลีกเลี่ยงคู่
  3. ตอนนี้ใช้งานได้ตามที่คาดไว้: วิธีแก้ไขข้อผิดพลาด HTTP 404.11 - โมดูลการกรองคำขอถูกกำหนดค่าให้ปฏิเสธคำขอที่มีลำดับการหลีกเลี่ยงคู่

1

คุณเคยคิดที่จะมี URL การค้นหาเช่น "/ search / a / b / c" หรือไม่?

คุณต้องตั้งค่าเส้นทางเช่น

search/{*path}

จากนั้นแยกค่าการค้นหาจากสตริงเส้นทางของคุณในการดำเนินการ

HTHs
Charles


ปัญหาคืออักขระที่เข้ารหัส URL อื่น ๆ (รวมถึง '/' เอง) อาจเป็นส่วนหนึ่งของการค้นหา
Alex

คุณไม่สามารถเข้ารหัส '/' ทั้งหมดที่เป็นส่วนหนึ่งของการค้นหาเป็น '% 2F' ได้หรือไม่?
Charlino

0

ฉันพบสิ่งนี้ภายใต้ IIS 7.5 การทำ Server.TransferRequest () ในแอปพลิเคชัน

การเข้ารหัสชื่อไฟล์ทำให้เกิดปัญหา double-escape แต่ถ้าฉันไม่ได้เข้ารหัสฉันจะพบ ข้อผิดพลาด"Request.Path ที่อาจเป็นอันตราย"

การใส่โปรโตคอลใด ๆ แม้แต่โปรโตคอลที่ว่างเปล่าบน URL ที่ฉันส่งผ่านไปยัง Server.TranferRequest () ช่วยแก้ปัญหาได้

ไม่สำเร็จ:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

ผลงาน:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.