จัดการคำขอ IIS อย่างเหมาะสมด้วยเปอร์เซ็นต์การลงชื่อเข้าใช้ URL (/%)


14

ฉันกำลังมองหาวิธีการแก้ปัญหาใด ๆ เพื่อรับคำขอ IIS อย่างถูกต้องเช่น/programming//%และhttp://bing.com/%เพื่อไม่แสดงหน้า 400 คำขอไม่ถูกต้อง แต่แสดงหน้าข้อผิดพลาดที่กำหนดเอง คล้ายกับวิธีที่http://google.com/%และhttp://facebook.com/%ทำ (แน่นอนว่าตัวอย่างเหล่านั้นไม่ได้อยู่ใน IIS)

ฉันเชื่อว่าฉันได้ลองตั้งค่าการตั้งค่ารีจิสทรี http.sys ทั้งหมด (AllowRestrictedChars, PercentUAllowed) ต่อhttp://support.microsoft.com/kb/820129แต่ไม่ได้ช่วย การตั้งค่า AllowRestrictedChars และหน้า 400 ที่กำหนดเองมี URL คงที่เช่น/programming//%12แต่ไม่ใช่ /%


3
คุณรู้ว่ามันเป็น URL-escape ที่ไม่สมบูรณ์และเป็นคำขอที่ไม่ดีดังนั้น 400 จึงจัดการได้อย่างถูกต้องหรือไม่ PercentU และ AllowRestricted ไม่ได้จริงๆบังคับ
โฟโต้

ใช่ฉันทำ (และ /% เป็นเพียงตัวอย่าง URL แต่เห็นได้ชัดว่าเกิดข้อผิดพลาดกับอักขระการยกเว้นทั้งหมดไม่ถูกต้อง) IIS จัดการ 400 แต่ฉันต้องการแสดงหน้า 400 ที่กำหนดเองอย่างที่ฉันสามารถทำได้ด้วยรหัสสถานะอื่น ๆ ใน IIS และเช่นเดียวกับเซิร์ฟเวอร์ที่ไม่ใช่ IIS สามารถทำได้สำหรับ 400
bkaid

ฉันมีลิงค์ที่มีประสิทธิภาพซึ่งชี้ไปยังเว็บไซต์ของฉันซึ่งเข้ารหัสอย่างผิดพลาดเช่นนี้ แต่ฉันไม่ได้รับอนุญาตให้ส่งพวกเขาไปยังหน้าที่ถูกต้อง แต่เป็นข้อผิดพลาดอย่างหนัก นี่เป็นสิ่งที่ยอมรับไม่ได้
boomhauer

คำตอบ:


20

สิ่งนี้ถูกบล็อกในระดับเคอร์เนล IIS จากการทดสอบฉันดึงทุกโมดูลใน IIS ออกมาเพื่อที่จะไม่ได้มีตัวจัดการหน้าเว็บแบบสแตติกและยังคงแสดงข้อความแสดงข้อผิดพลาด 400 ข้อ

ฉันไม่เชื่อว่าเป็นไปได้ที่ IIS จะหลีกเลี่ยงปัญหานั้น การตั้งค่ารีจิสทรีที่คุณกล่าวถึงมีไว้สำหรับอักขระที่ จำกัด ประเภทอื่น ฉันไม่เห็นคันโยกที่จะเปลี่ยนฟังก์ชั่นนั้น

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

Update2: นี่คือลิงค์ยอดเยี่ยมสามลิงก์ ทั้ง Nazim Lala และ Wade Hilmo จากทีม IIS ได้บล็อกเกี่ยวกับเรื่องนี้เนื่องจากการอภิปรายรอบคำถามของคุณ Scott Hanselman ก็มีโพสต์ที่ยอดเยี่ยมในส่วนของการสืบค้นภายใน. NET:

อัปเดต: ฉันตรวจสอบกับสมาชิกของทีม IIS เพื่อรับคำตอบที่มีสิทธิ์ เขากล่าวว่า% ถือเป็นตัวละครที่ไม่ปลอดภัยตาม RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt )

นี่คือข้อความที่เกี่ยวข้อง:

ที่ไม่ปลอดภัย:

ตัวละครอาจไม่ปลอดภัยด้วยเหตุผลหลายประการ อักขระช่องว่างไม่ปลอดภัยเนื่องจากช่องว่างที่สำคัญอาจหายไปและอาจมีช่องว่างที่ไม่สำคัญเมื่อมีการคัดลอก URL หรือเรียงพิมพ์หรืออยู่ภายใต้การดูแลของโปรแกรมประมวลผลคำ อักขระ "<" และ ">" ไม่ปลอดภัยเนื่องจากถูกใช้เป็นตัวคั่นรอบ ๆ URL เป็นข้อความอิสระ เครื่องหมายอัญประกาศ ("" ") ใช้เพื่อคั่น URL ในบางระบบอักขระ" # "ไม่ปลอดภัยและควรเข้ารหัสเสมอเนื่องจากมีการใช้ใน World Wide Web และในระบบอื่น ๆ เพื่อคั่น URL จากแฟรกเมนต์ / จุดยึด ตัวระบุที่อาจตามมา ตัวละคร "%" ไม่ปลอดภัยเพราะใช้สำหรับการเข้ารหัสอักขระอื่น อักขระอื่น ๆ ไม่ปลอดภัยเนื่องจากบางครั้งเกตเวย์และเอเจนต์การขนส่งอื่น ๆ บางครั้งอาจแก้ไขอักขระดังกล่าว อักขระเหล่านี้คือ "{", "}", "|", "\", "^", "~", "[", "]" และ "` "

อักขระที่ไม่ปลอดภัยทั้งหมดจะต้องถูกเข้ารหัสภายใน URL เสมอ ตัวอย่างเช่นตัวอักษร "#" จะต้องเข้ารหัสภายใน URL แม้ในระบบที่ปกติจะไม่จัดการกับตัวระบุส่วนหรือจุดยึดดังนั้นหากคัดลอก URL ไปยังระบบอื่นที่ใช้พวกเขาจะไม่จำเป็นต้องเปลี่ยน การเข้ารหัส URL

ดังนั้น IIS จะป้องกันสิ่งนี้ในระดับแกนกลางซึ่งเป็นมาตรการรักษาความปลอดภัยเชิงรุกเพื่อลดพื้นที่การโจมตี


ฉันต้องการบันทึกและจัดการข้อผิดพลาดทั้งหมดอย่างถูกต้องด้วยตนเองเพื่อตรวจสอบชุดค่าผสมของ URL ที่ไม่ถูกต้องที่ไม่ถูกต้องซึ่งสร้างขึ้นแบบไดนามิกในเว็บไซต์ของฉัน - ในกรณีที่ URL ไม่ได้รับการหลบหนีอย่างถูกต้อง
bkaid

1
มีบางอย่างที่ต้องบอกว่าจัดการกับข้อผิดพลาดด้วยตัวเอง แต่ถ้าความล้มเหลวที่เห็นได้ชัดถูกจัดการให้คุณนั่นเป็นโบนัสที่ดี IIS ไม่ควรอนุญาตให้ใช้อักขระผ่านที่ไม่สอดคล้องกับไฟล์หรือโฟลเดอร์ในระบบไฟล์ NTFS ไม่รู้จะทำอย่างไรกับเส้นทางของโฟลเดอร์ หากไม่ใช่รูปแบบตัวละครที่เท่ากับตัวอักษรที่ถูกต้องก็จะต้องตัดสินใจเกี่ยวกับสิ่งที่ต้องทำ ในกรณีนี้ปรากฏว่ามีการบล็อกโดยเฉพาะแทนที่จะละเว้นอักขระที่ไม่ถูกต้อง
Scott Forsyth - MVP

@thekaido ตามที่สกอตต์บอกว่าไม่เหมาะสมที่จะแยกวิเคราะห์ URL ที่ไม่สมบูรณ์ คุณสามารถสร้างหน้าข้อผิดพลาดแบบกำหนดเองประเภทใดได้เนื่องจากคุณไม่ทราบว่าผู้ใช้พยายามทำอะไร (เนื่องจากคำขอไม่สมบูรณ์) โปรดทราบว่า IE9 จะไม่ยอมให้คุณไปยังเซิร์ฟเวอร์ด้วยคำขอที่ไม่สมบูรณ์
Jim B

ฉันเข้าใจความหมายของสิ่งเหล่านี้ทั้งหมด แต่ Apache และเว็บเซิร์ฟเวอร์อื่น ๆ อนุญาตให้ใช้ IIS ได้ URL ที่หลีกเลี่ยงไม่ถูกต้องเป็น IIS ของ URL เดียวที่จะไม่ให้คุณจัดการที่ฉันรู้ IIS ควรและอนุญาตให้ใช้อักขระอื่นที่ไม่แม็พกับระบบไฟล์ NTFS เนื่องจากเว็บไซต์ของฉันสร้างขึ้นโดยใช้ ASP.NET MVC โดยที่คำขอจะถูกส่งไปยังทรัพยากรที่ไม่ใช่ไฟล์
bkaid

ที่จริงฉันยืนแก้ไขเกี่ยวกับ% ใน NTFS มันได้รับอนุญาตพร้อมกับตัวละครอื่น ๆ มากที่สุด: en.wikipedia.org/wiki/Ntfs (ค้นหาอักขระที่อนุญาตในชื่อไฟล์)
Scott Forsyth - MVP

3

ฉันคิดได้ 3 วิธี

  1. เปลี่ยน IIS ให้ชี้ไปที่หน้ากำหนดเองสำหรับข้อผิดพลาด 400 กว่าปกติ

  2. หากนี่เป็นเว็บไซต์เฉพาะใน IIS คุณสามารถทำสิ่งนี้ได้ใน web.config:

    <customErrors defaultRedirect = "ErrorPage.aspx" mode = "On">
    <error statusCode = "400" redirect = "myCustom400Error.aspx" />
    </customErrors>

  3. เขียน httpModule ที่ตรวจสอบ URL ที่เข้ามาและจัดการมัน


4
ไม่มีงานเหล่านี้ - IIS ไม่เคยผ่านการร้องขอ
bkaid

# 1 ตัวเลือกควรจะทำงานไม่ว่าสิ่งที่เพราะเห็นว่าเป็นวิธีการที่ IIS ตอบสนองต่อข้อผิดพลาด
เดฟปรีชาญาณ

4
ฉันลองตัวเลือก 1 และ # 2 อีกครั้งและไม่สามารถใช้งานได้ IIS กำลังจัดการคำขอนี้เป็นพิเศษเช่น Scott กล่าวถึง
bkaid

3

วิธีเดียวในการแก้ปัญหานี้คือการตรวจสอบ URL ก่อนที่เคอร์เนล IIS จะทำได้

คุณจะต้องส่งลิงค์ที่สร้างขึ้นแบบไดนามิกผ่านสคริปต์เพื่อตรวจสอบก่อนที่จะส่งต่อผู้ใช้ปลายทางไปยัง URL นั้น ...

นอกจากนี้คุณจะรู้ว่านี่เป็นสถานการณ์เดียวที่ IIS ไม่จัดการตามที่คุณต้องการ ถ้าคุณมีคำขอที่ไม่สามารถจัดการได้คุณจะรู้ว่าอะไรเป็นสาเหตุ

บางทีการตรวจสอบผู้อ้างอิงในหน้า 400 ที่กำหนดเองน่าจะช่วยลดแหล่งที่มาของการเข้าชมให้แคบลงได้ไหม


2

โพสต์นี้ในฟอรัม IIS ระบุว่า HTTP 400 (คำขอไม่ถูกต้อง) ถูกบล็อกโดย http.sys และไม่ส่งไปที่ IIS ซึ่งตรงกับลิงก์ที่ @Scott Forsyth - MVP รวมอยู่ในคำตอบดั้งเดิมของเขา

คุณสามารถดูบันทึกของคำขอเหล่านี้ได้ภายใต้ c: \ Windows \ System32 \ LogFiles \ HTTPERR \

ฉันไม่ทราบว่าคุณสามารถกำหนดค่าหน้าการตอบสนองที่ส่งกลับไปยังผู้ใช้สำหรับข้อผิดพลาดประเภทนี้ได้หรือไม่เนื่องจากแม้ Bing ประสบปัญหานี้ฉันสงสัยว่าอาจเป็นไปไม่ได้หรืออาจต้องการแฮ็คระบบที่น่ากลัว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.