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

Tiếp theo nội dung Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 3), kỳ này tôi lại tiếp tục công cuộc chiến đấu với SQL injection attack. Cụ thể, tôi sẽ tập trung vô vấn đề xác định các thông tin liên quan đến database. Thông tin liên này bao gồm loại, phiên bản database software, các bảng của database và các cột của bảng. Đây là những thông tin giá trị, góp phần giảm thời gian thử nghiệm đoán mò để tăng tốc cho quá trình tấn công.

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, để 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ẽ chỉ sử dụng Burp Suite (bạn cũng có thể thao tác chỉnh sửa Request trực tiếp trên Browser tương tự như kỳ trước, nếu thích );
  • Để tiết kiệm thời gian, tôi sẽ chỉ chạy các payload xác nhận số cột mà query trả về cũng như cột nào tương thích với string data. Thực tế bạn sẽ phải dò tìm 2 thông tin này tương tự như nội dung kỳ trước chứ không phải tự nhiên có sẵn phương án để bạn xác nhận đâu nhé;
  • 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. Làm sao để xác định loại và phiên bản của database?

Trước hết, bạn cần lưu ý thông tin loại và phiên bản của database là thông tin thiết yếu, giúp bạn thu hẹp phạm vi xử lý nên có thể giúp tiết kiệm một lượng thời gian đáng kể. Để xác định được loại và phiên bản của database, tối thiểu bạn cần biết phương thức query cho các database phổ biến. Ví dụ query với đám database phổ biến như sau.

DB version query
DB version query

Nguồn: portswigger.net

Như vậy, ví dụ với với Microsoft SQL/MySQL, bạn có thể triển Union attack kiểu như sau:

' UNION SELECT @@version--

Thông tin thu lượm minh họa sẽ tương tự như sau:

Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

#1.1 Hốt hàng với MySQL/Microsoft SQL

Tương tự như nội dung kỳ trước, bạn cần xác định số cột mà query trả về cũng như cột nào tương thích với string data. Quá trình này tương tự như kỳ trước nên tôi sẽ không nói nhiều. Bạn có thể sử dụng cái payload kiểu như sau:

'+UNION+SELECT+'abc','def'#

Nếu thấy kết quả status code 200 trong phần Response như bên dưới là ngon ăn.

MySQL-Microsoft SQL column number and datatype
MySQL-Microsoft SQL column number and datatype

Giờ chyển qua phần húp thông tin từ database. Với MySQL/Microsoft SQL, bạn có thể sử dụng payload kiểu như sau:

'+UNION+SELECT+@@version,+NULL#

Với payload này, nếu trời độ, bạn sẽ lượm được thông về phiên bản database kiểu như sau:

MySQL-Microsoft SQL DB version
MySQL-Microsoft SQL DB version

#1.2 Chấm mút với với Oracle

Giống như trên, trước hết, bạn cần xác định số cột mà query trả về cũng như cột nào tương thích với string data với payload kiểu như sau:

'+UNION+SELECT+'abc','def'+FROM+dual--

Lưu ý: Việc sử dụng dual như tôi đề cập trong Mục 2.2 của nội dung Penetration Testing Step 3 – Các thể loại SQL injection phổ biến (Part 2)

Nếu nhận được status code 200 trong Response như bên dưới là bạn đã xong công việc xác nhận.

Oracle column number and datatype
Oracle column number and datatype

Việc cào hốt thông tin từ Oracle database cũng sẽ tương tự như với MySQL/Microsoft SQL. Bạn có thể sử dụng payload kiểu như sau:

'+UNION+SELECT+BANNER,+NULL+FROM+v$version--

Nếu mọi chuyện êm đẹp thì bạn sẽ chấm mút được kha khá thông tin về database như bên dưới.

Oracle DB version
Oracle DB version

#2. Thăm dò cấu trúc của các dạng database phổ biến

Sau khi đã xác định được loại và phiên bản của database, bạn sẽ cần tiếp tục chọc ngoáy để coi con hàng này có gì trong đó (cụ thể là các bảng của database cũng như thông tin các cột liên quan). Đây là bước quan trọng vì sẽ giúp bạn đưa ra được payload phù hợp chứ không phải đoán rồi mò mẫm trong vô vọng.

Lưu ý: Trong nội dung kỳ trước, với easy mode, bạn sẽ được mật báo “Hãy thử kiếm với bảng Users coi có húp được gì không”. Kiểu mớm cơm vô tận họng đấy chỉ để minh họa chứ thực tế không có chuyện tự nhiên bạn biết nên tên bảng là gì mà bay vô quất liền đâu nhé.  

Ngoại trừ Oracle, phần lớn các database sẽ có thông tin về nội dung ghi nhận trong information schema. Dựa vào chi tiết này, bạn có thể thu lượm thông tin về các bảng với query kiểu như:

SELECT * FROM information_schema.tables

Nếu muốn múc các cột, bạn có thể dùng query kiểu như sau để hốt thông tin trong bảng (ví dụ Users):

SELECT * FROM information_schema.columns WHERE table_name = 'Users'

Rồi, giờ tôi bắt tay vô phần demo. Giống như các nội dung trước đó, đầu tiên bạn cũng sẽ cần xác định số cột trả về cũng như cột nào tương thích với string data với payload kiểu như sau:

'+UNION+SELECT+'abc','def'--

MySQL-Microsoft SQL column number and datatype (cont)
MySQL-Microsoft SQL column number and datatype (cont)

Sau đó bạn tiến hành dò tìm tên các bảng từ information schema với payload kiểu như sau:

'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--

Get table name
Get table name

Như bạn thấy ở trên, tôi đã dò được thông tin liên quan đến user nằm trong bảng users_cijxla. Do vậy, tôi có thể triển bước tiếp theo là dò thông tin các cột trong bảng này với payload kiểu như sau:

'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_cijxla'--

Get column name
Get column name

Với kết quả trên, tôi xác định được 2 cột quan trọng là username_dkvvlppassword_sawdtm. Lúc này tôi không thể nào cưỡng lại được ham muốn tung ra payload để dò thông tin đăng nhập kiểu như sau:

'+UNION+SELECT+username_dkvvlp,+password_sawdtm+FROM+users_ cijxla--

Và Tadaaaaa! Cái username administrator kèm theo password phọt thẳng vô mặt tôi.

Get credential
Get credential

Lưu ý: Bạn có thể dùng tính năng search phần Response của Burp Suite để nhanh chóng xác định thông tin liên quan

#3. Thăm dò cấu trúc của Oracle database

Khác với Mục 2, trường hợp này bạn sẽ không thể khai thác thông tin dựa vào information schema. Với Oracle database, bạn có thể hốt thông tin các bảng với query:

SELECT * FROM all_tables

Sau đó thu lượm thông tin cột trong bảng (ví dụ Users) với query kiểu như sau:

SELECT * FROM all_tab_columns WHERE table_name = 'USERS'

Rồi, giờ tôi bay vô phần demo. Tương tự như trên, việc đầu tiên bạn cần làm là xác định số cột trả về cũng như cột nào tương thích với string data với payload kiểu như sau

'+UNION+SELECT+'abc','def'+FROM+dual--

Oracle column number and datatype (cont)
Oracle column number and datatype (cont)

Sau đó bạn tiến hành dò tìm thông tin các bảng trong database với payload kiểu như sau:

'+UNION+SELECT+table_name,NULL+FROM+all_tables--

Get column name for Oracle DB
Get column name for Oracle DB

Như bạn thấy ở trên, tôi đã dò ra được bảng liên quan đến thông tin user có tên là USERS_IUDXQQ. Việc tiếp theo là dò tìm thông tin các cột trong bảng này với payload kiểu như sau:

'+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_IUDXQQ'--

Get column name for Oracle DB
Get column name for Oracle DB

Rất suôn sẻ, tôi húp được thông tin 2 cột quan trọng là USERNAME_EZUFMBPASSWORD_EARLAO. Với thông tin này, tôi tung đòn quyết định để húp thông tin đăng nhập với payload:

'+UNION+SELECT+USERNAME_EZUFMB,+PASSWORD_EARLAO+FROM+USERS_IUDXQQ--

Get credential for Oracle DB
Get credential for Oracle DB

Và như bạn thấy ở trên, mưu đồ đen tối của tôi đã thành công rực rỡ với thông tin credential của admin nằm chình ình trong phần Response của Burp Suite.

Đến đây coi như bạn đã đút túi thêm một thủ thuật quan trọng trong công cuộc chích choác với SQL injection attack. Kỳ tới tôi sẽ tiếp tục gia tăng độ khó để chuyển sang chơi với các thể loại trâu chó hơn.

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

Leave a Reply

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