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

Tiếp theo nội dung Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 2), kỳ này tôi sẽ bay vô phần demo minh họa để làm rõ các nguyên lý với Union Attack đã giới thiệu trước đó.

Lưu ý:

  • Tương tự như các kỳ trước, tôi cũng sẽ tận dụng các bài Lab dựng sẵn của ông PortSwigger để tiết kiệm thời gian dàn cảnh;
  • Trong phần demo kỳ này, bạn có thể thao tác chỉnh sửa Request trực tiếp trên Browser. Tuy nhiên, để việc thu thập, đánh giá thông tin và bố trí các đợt tấn công hiệu quả hơn, tôi sẽ ưu tiên sử dụng Burp Suite. Phần sử dụng Browser chủ yếu tôi dùng để minh họa thêm cho rõ các nội dung;
  • Thông tin liên quan đến Burp Suite bạn có thể xem nội dung Penetration Testing Step 3 – 6 điều bạn nên biết trước khi xài tool khủng Burp Suite.

#1. Xác định số cột để triển SQL injection UNION attack

Rồi, tôi vào việc ngay luôn cho máu. Sau khi bơi vào giao diện của mục tiêu, bạn có thể thử chọn một Category vớ vẩn nào đấy.

Lab page
Lab page

Ví dụ tôi chọn Gifts thì thông tin cặp Request/Response ghi nhận sẽ kiểu như sau.

Category filter
Category filter

Sau khi nhận hàng ở HTTP history, tôi chuyển cái Request này sang Repeater để tiện bề thao túng. Như đã trình bày trong kỳ trước, bạn có thể sử dụng NULL để thăm dò số cột. Cụ thể, bạn có thể đút thêm '+UNION+SELECT+NULL-- vào sau cái chỗ category=Gifts như bên dưới.

Check number columns
Check number columns

Lưu ý: Nếu không biết Burp Suite Repeater là gì thì bạn có thể xem thêm nội dung Penetration Testing Step 3 – Thủ thuật chọc ngoáy HTTP/WebSockets message với Burp Suite Repeater.

Với nhát thăm dò đầu tiên, bạn có thể thấy thông tin trả về là Internal Server Error. Với cái Respone này, bạn có thể thử tăng thêm một cái NULL nữa để tiếp tục thăm dò theo kiểu '+UNION+SELECT+NULL,NULL--.

Check number columns (cont)
Check number columns (cont)

Ở phát thứ 2, bạn có thể tiếp tục ghi nhận Internal Server Error trong Respone. Do vậy, ý tưởng là tiếp tục tăng thêm cái NULL cho đến khi ghi nhận có sự  khác biệt.

Check number columns (fin)
Check number columns (fin)

Như quan sát ở trên, với bài Lab này, với 3 cái NULL bạn đã nhận được status code 200 – OK, hàm ý cho biết số lượng cột tương ứng là 3. Như vậy bạn đã hoàn thành xong yêu cầu thứ nhất trong công cuộc chuẩn bị cho SQL injection UNION attack.

#2. Xác định cột tương thích dữ liệu dạng string cho SQL injection UNION attack

Sau khi đã xác định được số lượng cột, bạn sẽ bắt tay vô công đoạn kế tiếp của mưu đồ tấn công – đó là xác định xem cột nào tương thích dữ liệu dạng string.

Để triển phần này, bạn có thể mò mẫm theo nguyên lý sau: Lần lượt thay đổi giá trị NULL bằng một string đại khái nào đó (ví dụ ‘HIDZXO’ trong ví dụ bên dưới) cho đến khi nhận được status code 200 trong Respose trả về. Khi đó bạn sẽ có thể xác nhận cột tương ứng với cái string vừa đút vô sẽ tương thích với dữ liệu dạng string.

Check string data
Check string data

Như kết quả quan sát được ở trên, bạn có thể xác nhận cột thứ 2 sẽ tương thích dữ liệu dạng string. Và như vậy, bạn đã mần xong luôn yêu cầu thứ 2 để chuẩn bị cho SQL injection UNION attack.

#3. Bắt đầu cào hốt dữ liệu với SQL injection UNION attack

Sau khi đã xác định được số cột cũng như cột nào tương thích với dữ liệu dạng string, bạn có thể bắt đầu chuyển qua chấm mút với SQL injection attack.

Ví dụ, với bài Lab bên dưới, tôi xác định được số cột là 2. Đồng thời cả cột thứ nhất và cột thứ hai đều tương thích với dữ liệu dạng string. Kết quả xác nhận tương ứng với cặp Request/Response như sau.

Verify number of columns and string data
Verify number of columns and string data

Với nội dung đã xác nhận như trên, bạn có thể bắt tay vô việc chọc ngoáy để thu lượm dữ liệu. Và thông thường, thứ khiến bạn thèm muốn nhất sẽ dính líu đến thông tin đăng nhập vào hệ thống. Thực tế quá trình mò mẫm, đâm thọc này có thể đòi hỏi nhiều phương án thử nghiệm nên việc sử dụng Burp Suite để hỗ trợ là một lựa chọn hợp lý.

Quay trở lại vấn đề chính, trong khuôn khổ của bài Lab, sau khi thăm dò một số nội dung, bạn sẽ có thể phát hiện ra việc tồn tại bảng users trong cơ sở dữ liệu với 2 cột lần lượt là usernamepassword. Khi đó, cái Request để tấn công (sử dụng '+UNION+SELECT+username,+password+FROM+users--) và Response chứa đựng kết quả thu lượm (thông tin usernamepassword) được sẽ có kiểu như sau.

Attack and get data
Attack and get data

Bạn cũng có thể chạy lại Request trên Browser để quan sát kết quả thu lượm tương ứng.

Attack on browser
Attack on browser
Data on browser
Data on browser

Để xác nhận hàng thu được là chính hãng, bạn có thể truy cập đến trang Login và sử dụng để đăng nhập thử.

Check login
Check login

Nếu kết quả nhận được kiểu như sau thì bạn đã thành công rực rỡ.

Check login success
Check login success

#4. Hốt dữ liệu với SQL injection UNION attack khi kết quả thu từ query chỉ nằm trong một cột

Mục 3, bạn có thể quan sát thấy kết quả thu từ query được đẩy vô tương ứng cho 2 cột usernamepassword. Nếu gặp tình huống khi kết quả chỉ đẩy vào trong một cột thì lúc này bạn có thể xem xét sử dụng string concatenation operator (ví dụ || cho Oracle database) và ký tự đặc biệt để làm dấu hiệu phân tách các dữ liệu đã kết hợp lại (ví dụ ký tự ~).

Quay trở lại nội dung demo, tương tự như Mục 3, đầu tiên bạn cũng sẽ cần xác định số cột và cột nào có dữ liệu tương thích với dạng string theo kiểu tương tự như sau.

Verify number of columns and string data with single column
Verify number of columns and string data with single column

Kế đến, bạn cũng sẽ có thể tung payload để húp thông tin từ bảng users theo kiểu '+UNION+SELECT+NULL,username||'~'||password+FROM+users--.

Attack and get data with single column
Attack and get data with single column

Kết quả như bạn có thể thấy ở trên, usernamepassword đã được kết hợp lại và phân biệt nhờ ký tự ~ như ý đồ thiết kế. Tất nhiên, bạn cũng có thể thử chạy Request trên Browser và quan sát kết quả tương ứng.

Attack on browser
Attack on browser
Data on browser
Data on browser

Sau đó đăng nhập lại để xác nhận thông tin hốt được là chuẩn cmn mực.

Check login success
Check login success

Phù! Đến đây coi như tôi đã xong phần múa lửa minh họa rồi đấy. Tôi hy vọng phần demo minh họa kỳ này đã làm rõ phần nguyên lý trình bài trong kỳ trước. Và cũng như mọi khi, tôi cũng muốn nhấn mạnh lại một lần nữa là các bài Lab được thiết kế để bạn “dễ ăn” nhằm nắm bắt ý tưởng chính. Thực tế quá trình tấn công có thể sẽ phát sinh nhiều vấn đề làm bạn đổ mồ hôi, sùi bọt mép chứ không nhẹ nhàng tình cảm thế này đâu nhé.

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

Leave a Reply

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