Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 5)

Như đã hứa hẹn trong nội dung Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 4), kỳ này tôi sẽ chuyển sang thể loại trâu chó hơn của SQL injection attack là Blind SQL Injection.

Với Blind SQL Injection, bạn sẽ bắt đầu chuyển qua chơi kiểu hardcore vì lúc này HTTP response sẽ không còn trả về kết quả của SQL query hoặc thông báo lỗi của database rõ ràng như trước nữa. Do vậy các chiêu trò trước đó, ví dụ kiểu Union attack sẽ khó lòng mà áp dụng và bạn sẽ phải chuyển sang các thủ thuật phức tạp hơn.

Nguyên lý chung của Blind SQL Injection là bạn phải cố gắng soi kèo cái resposne để nhận ra các điểm khác biệt từ đó có những hiệu chỉnh phù hợp trong query để gãi đúng chỗ ngứa. Và trong nội dung kỳ này, tôi sẽ demo việc áp dụng Blind SQL Injection thông qua việc kích hoạt các response theo các điều kiện cụ thể.

Lưu ý:

#1. Kiểm tra khả năng chấm mút với Blind SQL Injection thông qua response trả về của các boolean condition khác nhau

Việc đầu tiên tôi cần làm là bật Intercept is on trên Burp Suite và truy cập vào giao diện cái shop quen thuộc của bài lab để lấy cái request có TrackingId kiểu như sau.

TrackingId
TrackingId

Tiếp đến, tôi có thể thử hiệu chỉnh lại cái request, cụ thể là chỗ TrackingId bằng cách kèm vô thêm một đoạn kiểm tra điều kiện với AND.

TrackingId=3gaNNVzoXdRoDETc' AND '1'='1

Check condition True
Check condition True

Như quan sát ở trên, bạn có thể thấy message “Welcome back” trong response trả về. Tiếp tục, tôi thử thay đổi boolean condition sang ‘1’=’2 như sau:

TrackingId=3gaNNVzoXdRoDETc' AND '1'='2

Check condition False
Check condition False

Lúc này nếu trong phần response không thể tìm thấy được message “Welcome back” thì bạn có thể mừng thầm trong bụng vì kết quả trên cho thấy có thể thử nghiệm dựa vô boolean condition và phân tích tình hình dựa trên cái response trả về (cụ thể trong trường hợp này là sự có mặt của cái message “Welcome back”)

#2. Xác nhận sự tồn tại của bảng chứa thông tin user và user thần thánh “administrator” với Blind SQL Injection

Thừa thắng xông lên, tôi mạnh dạn điều chỉnh lại cái request để thăm dò coi có tồn tại một bảng users trong database hay không theo kiểu:

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT 'a' FROM users LIMIT 1)='a

Check users table
Check users table

Lưu ý: Ở đây tôi đang ăn gian vì mạnh dạn bay vô xác nhận ngay việc tồn tại một bảng có tên users trong database. Thực thế thì bạn phải tự mò mẫm, xác định lại các thông tin này tương tự như kỳ trước chứ không có sẵn thông tin thế này đâu nhé.

Việc cái response chứa message “Welcome back” như trên đã xác nhận việc tồn tại bảng users trong database cho tôi. Kế đến, tôi tiếp tục ép sân và thăm dò để xác định coi có tồn tại username administrator nào trong bảng users không bằng request:

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT 'a' FROM users WHERE username='administrator')='a

Check user admin
Check user admin

Ngon! Với reponse như trên, tôi có thể kết luận một thông tin quan trọng là tồn tại một username administrator trong bảng users (tất nhiên thực tế bạn phải dò tìm username chứ không có chuyện đập phát ăn ngay thế này nhé).

#3. Tấn công dò tìm password với Blind SQL injection

#3.1 Xác định độ dài password

Sau khi đã xác định được username administrator, kế tiếp tôi sẽ cần xác định password. Với trường hợp này bạn đừng hy vọng chơi kiểu chó ngáp phải ruồi mà đoán đúng được password. Việc trước tiên, tôi sẽ cần xác định độ dài của password trước đã. Để làm được việc này tôi sẽ cần chạy một query để thăm dò phản hồi kiểu như sau:

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>1)='a

Check pass length - 1
Check pass length – 1

Với response như trên, bạn có thể xác nhận phần điều kiện AND (SELECT ‘a’ FROM users WHERE username=’administrator’ AND LENGTH(password)>1)=’a đưa vào trả về giá trị True (nên mới thấy được message “Welcome back”). Ngoài ra, câu query trên cũng cho biết độ dài password lớn hơn 1. Kết luận này nhìn hơi thừa thãi nhưng khá quan trọng, vì nó sẽ là nền tảng cho công cuộc chọc ngoáy tiếp theo.

Ở đây, để thăm dò độ dài password, tôi sẽ có các phương án như sau:

  • Tăng dần giá trị độ dài password cần so sánh cho đến khi điều kiện trả về giá trị False (sẽ không thấy message “Welcome back” nữa). Dễ thấy (cái này dễ thấy thật, không phải tôi đang bơm đểu), giá trị độ dài password khi đó sẽ bằng giới hạn đang so sánh;
  • Chơi kiểu như Binary Search để giảm thời gian dò tìm độ dài password;
  • Sử dụng Burp Suite Intruder để quất một phát ăn ngay mà không cần mò mẫm từ từ.

Sau khi xem xét kỹ 3 phương án trên, tôi quyết định chọn phương án thứ 4 là tham khảo nguồn tin mật để mạnh dạn kết luận độ dài password không quá 20 ký tự và chạy luôn query xác nhận như sau.

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>20)='a

Check pass length - 2
Check pass length – 2

Lưu ý: Phương án thứ 4 ở trên tôi xàm cho vui thôi, thực tế bạn nên dùng kiểu Burp Suite Intruder (hoặc ít nhất cũng kiểu Binary Search) để tiết kiệm thời gian dò tìm. Vì nội dung chỗ này tương đối đơn giản nên tôi chỉ xác nhận cho nhanh. Phần dử dụng Burp Suite Intruder tôi sẽ demo kỹ hơn trong phần sau.

Với response không chứa message “Welcome back” như trên, tôi có thể kết luận độ dài password không quá 20 ký tự. Do vậy, tôi cần điều chỉnh giá trị so sánh xuống 19 và kiểm tra lại.

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT 'a' FROM users WHERE username='administrator' AND LENGTH(password)>19)='a

Check pass length - 3
Check pass length – 3

Và với response này, tôi có thể kết luận một thông tin quan trọng kế tiếp là giá trị độ dài password là 20 ký tự.

#3.2 Trả lời cho câu hỏi lớn của thời đại Password của admin là gì?”

Kế đến, tôi chuyển sang phần quan trọng cuối cùng – trả lời cho câu hỏi password là gì?. Để có thể trả lời cho câu hỏi nhức nhối này, tôi cần đến sự hỗ trợ của con hàng Burp Suite Intruder. Do vậy tôi cần mở Context Menu và đẩy hàng qua Intruder trước. Tiếp theo, tôi cũng sẽ dọn các Payload Positions mặc định của Burp Suite bằng cách bấm nút Clear§. Kết quả quan sát được sẽ tương tự như sau:

Intruder Sniper Positions
Intruder Sniper Positions

Giờ tôi sẽ thử hiệu chỉnh lại các query để hốt cái ký tự đầu tiên của password (thông qua SUBSTRING(password,1,1)) với cái query kiểu như sau:

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator')='§a§

Intruder Sniper Positions with makers
Intruder Sniper Positions with makers

Lưu ý:

Chuyển sang tab con Payloads. Với giả định dễ thở là password chỉ bao gồm chữ thường và số, tôi có thể thiết lập Payload typeSimple list sau đó chọn Add from list drop-down để chọn các chữ cái a-z và các số 0-9 trong phần Payload Options.

Intruder Sniper Payloads
Intruder Sniper Payloads

Lưu ý: Để tránh gây ảo tưởng sức mạnh, tôi thấy cần nhắc lại, đây là lab minh họa chứ thực tế méo có chuyện sử dụng Simple list dễ ăn thế này đâu nhé bạn.

Tiếp tục, để tận dụng sức mạnh của Burp Suite Intruder, tôi sẽ không soi kèo response bằng mắt nữa mà dùng giải pháp chuẩn cmn mực hơn là Grep – Match trong tab con Options. Trong phần này, tôi sẽ chọn Flag result items with responses matching these expressions và đút cái message “Welcome back” vào kiểu như sau (nhớ dọn cho gọn nếu trước đó bạn có sử dụng các string khác).

Intruder Sniper Options
Intruder Sniper Options

Sau khi đã thiết lập xong rồi thì tôi có thể quay lại tab con Positions (hoặc Payloads) để bắt đầu xả đạn bằng cách chọn nút Start attack.

Ngồi nhịp đùi vài cái rồi quan sát kết quả thu lượm được tôi thấy dấu tick bên cột Welcome back cho biết chữ cái đầu tiên của password là “lờ” như bên dưới.

Intruder Sniper Result
Intruder Sniper Result

Theo logic thông thường, tôi có thể lần lượt dò tiếp các ký tự thứ 2 của password với các query hiệu chỉnh như sau:

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT SUBSTRING(password,2,1) FROM users WHERE username='administrator')='§a§

Và tiếp tục tăng dần lên cho đến con số 20 đã xác định. Về cơ bản, việc này là khả thi và không có gì sai trái. Tuy nhiên, tôi có thể có một giải pháp tinh tế hơn là chuyển sang Attack type Cluster bomb để đưa payload vào 2 vị trí:

  • : xác định vị trí của ký tự trong password;
  • : xác định ký tự tại vị trí xác định giống như trước đó.

Và lúc này cái query cập nhật sẽ kiểu như sau:

TrackingId=3gaNNVzoXdRoDETc' AND (SELECT SUBSTRING(password, §1§,1) FROM users WHERE username='administrator')='§a§

Intruder Cluster bomb Positions
Intruder Cluster bomb Positions

Tiếp theo, bạn cũng sẽ cần chuyển qua tab con Payloads và thiết lập Payload set 1 – Tương ứng cái §1§. Thằng này tương ứng với các chỉ số vị trí 20 ký tự của password nên tôi có thể thiết lập kiểu Numbers Sequential như sau.

Intruder Cluster bomb Payloads 1
Intruder Cluster bomb Payloads 1

Chuyển sang Payload set 2 – Tương ứng cái §a§, tôi sẽ thiết lập với Simple List tương tự như trước đó.

Intruder Cluster bomb Payloads 2
Intruder Cluster bomb Payloads 2

Sau khi bày binh bố trận xong xuôi tôi có thể nhấn Start attack và treo mỏ chờ hàng về. Và rồi thời khắc ấy cũng đã đến. Hàng về ồ ạt. Và xối xả.

Intruder Cluster bomb Result
Intruder Cluster bomb Result

Tôi lúc này như một người nông dân nghèo bước đi trên đồng ruộng khô cằn và nhặt nhạnh từng viên hột xoàn để ghép lại thành cái password của nhân vật quyền lực tột đỉnh administrator.

Bỗng đâu thấy ớn lạnh toàn thân, tôi rùng mình một cái rồi đọc to cái password: “l2tkupzl3pnamnjsvl96”.

Và lúc này tôi không còn lựa chọn nào khác ngoài trừ móc hàng ra đút vào vị trí login.

Login
Login

Để rồi sau đó tận hưởng cảm giá đê mê khi trở thành administrator một tay che trời, quản lý hết toàn bộ ngóc ngách của cái shop bán toy mà tôi thèm khát bấy lâu nay.

Result
Result

Phù! Mỏi tay rồi, thôi nay nghỉ ở đây nhé. Hôm sau tôi quay lại chém gió với đám Blind SQL Injection này tiếp vậy.

1 thought on “Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 5)”

Leave a Reply

Your email address will not be published. Required fields are marked *