# SQL injection - Portswigger
Yêu cầu:
- Đọc toàn bộ lý thuyết về SQL Injection tại đây:
<https://portswigger.net/web-security/sql-injection>
- Hoàn thành các bài labs thuộc chủ đề SQL Injection tại:
<https://portswigger.net/web-security/all-labs>
Ouput:
- Chụp ảnh các bài labs đã giải được
- Viết writeups các bài đã giải được
- Điểm số sẽ tính theo tỉ lệ các bài labs giải được

## SQL injection examples
There are a wide variety of SQL injection vulnerabilities, attacks, and techniques, which arise in different situations. Some common SQL injection examples include:
* Retrieving hidden data, where you can modify an SQL query to return additional results.
* Subverting application logic, where you can change a query to interfere with the application's logic.
* UNION attacks, where you can retrieve data from different database tables.
* Examining the database, where you can extract information about the version and structure of the database.
* Blind SQL injection, where the results of a query you control are not returned in the application's responses.
## Retrieving hidden data
### Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data

Access vào bài lab, ngay tại trang home cho phép ta search theo category

Thử sqli với payload là `?category=Pets'-- -`

Để list ra tất cả product theo yêu cầu của bài lab, sử dụng payload sau: `?category=' or true -- -`, kết quả:

## Subverting application logic
### Lab: SQL injection vulnerability allowing login bypass

Bài lab yêu cầu ta login với tài khoản `administrator`, nhưng ta không có password.

Có thể sử dụng sqli để bypass login `csrf=<csrf>&username=administrator'-- -&password=blabla`

Kết quả

## SQL injection UNION attacks
### Determining the number of columns required in an SQL injection UNION attack
#### Lab: SQL injection UNION attack, determining the number of columns returned by the query

Bài lab yêu cầu ta chỉ cần tấn công sqli để trả về thêm một row chỉ gồm các giá trị null.
Access vào lab, ta thấy có chức năng lọc ra các kết quả dựa trên GET param `result`

Để tìm số cột hiện tại ta dùng đoạn payload `UNION SELECT NULL-- -`

Tiếp tục điều chỉnh số lượng "SELECT NULL" cho đến khi server không báo lỗi

### Finding columns with a useful data type in an SQL injection UNION attack

Từ yêu cầu bài lab, đầu tiên ta sẽ cần tìm số cột sau đó là tìm cột chứa kiểu dữ liệu dạng string và cuối cùng là select chuỗi `PBh4Ke`:

Sử dụng cách tương tự như bài trước, ta tìm được số cột là 3:

Tiếp theo thực hiện thay lần lượt `PBh4Ke` vào các vị trí của `NULL`: ví dụ `Pets' UNION SELECT 'PBh4Ke', NULL, NULL--` ... cho đến khi solve bài lab

### Using an SQL injection UNION attack to retrieve interesting data
#### Lab: SQL injection UNION attack, retrieving data from other tables

Dựa vào yêu cầu bài lab, ta cần union sqli attack để lấy ra hết username và password sau đó login vào tài khoản của user `administrator`
Tìm được số cột là 2 đồng thời cả hai cột này đều chứa kiểu dữ liệu dạng string

Tiếp theo select ra username và password từ table users

Và login vào account administrator

### Retrieving multiple values within a single column
#### Lab: SQL injection UNION attack, retrieving multiple values in a single column

Bài này khác với bài trước ở chỗ, chỉ có một cột chứa data kiểu string

Dùng concat operator `||` để nối giá trị của hai cột `username` và `password` trong table users lại với nhau

Và login với account administrator để solve bài lab

## Examining the database
### Querying the database type and version
#### Lab: SQL injection attack, querying the database type and version on Oracle

Ở Oracle database, khi select yêu cầu ta phải cung cấp đầy đủ clause của câu SELECT, có nghĩa là phải cần FROM <table_name> vì vậy ta có thể dùng built-in table `dual` để bắt đầu tìm số cột

=> 2 cột
Tiếp đó ta cần select ra version của database, table v@version có cấu trúc như sau

Payload cuối cùng

#### Lab: SQL injection attack, querying the database type and version on MySQL and Microsoft
Cách làm tương tự như bài trước nhưng ở mysql và microsoft thì đơn giản hơn chỉ cần dùng hàm version()

### Listing the contents of the database
#### Lab: SQL injection attack, listing the database contents on non-Oracle databases

Bài này ta sẽ cần phải đi theo trình tự các bước: tìm số cột -> tìm cột trả về data kiểu string -> tìm loại database -> tìm tên table lưu username và password -> login với user administrator.
Làm tương tự như các bước ở trên tìm được sốt cột là 2 và cột trả về string là cột thứ nhất. Tiếp theo ta tìm được tên table đáng nghi chứa username và password là `users_frbrma`

Hai column tương ứng là `username_cseemm` và `password_uqtumb`

Cuối cùng là tìm admin password

Login với admin account

### Equivalent to information schema on Oracle
#### Lab: SQL injection attack, listing the database contents on Oracle

Tương tự như bài lab trước nhưng đây là Oracle
- `Gifts' UNION SELECT table_name, 'a' FROM all_tables-- -` -> tìm được table name là `USERS_OTLFUW`
- `Gifts' UNION SELECT column_name, 'a' FROM all_tab_columns where table_name = 'USERS_OTLFUW'-- -` -> Column name tương ứng là `USERNAME_YQMCLX` và `PASSWORD_THZBBY`

Và login vào admin account

## Blind SQL injection
### Exploiting blind SQL injection by triggering conditional responses
#### Lab: Blind SQL injection with conditional responses

Từ đề bài ta biết được, server sử dụng cookie và đưa vào câu truy vấn SQL để xử lí gì đó.
Thử sqli, ta nhận thấy được nếu câu truy vấn trả về giá trị thì sẽ hiện ra dòng chữ `Welcome back!` ngược lại không hiển thị gì.

Script brute admin password

Login với admin password và kết quả

### Inducing conditional responses by triggering SQL errors
#### Lab: Blind SQL injection with conditional errors

Ở bài lab này, ta cần trigger error trong câu truy vấn để server trả về trang chứa lỗi

Vì database là oracle, ta có thể lợi dụng hàm `TO_CHAR(1/0)` để trigger lỗi
Vẫn là sqli ở cookie, script để brute password như sau

Login vào account admin, kết quả

### Exploiting blind SQL injection by triggering time delays
#### Lab: Blind SQL injection with time delays

Từ yêu cầu bài lab, ta chỉ cần trigger time delay 10s là có thể solve

và

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

Time base sqli với database là Postgre

Script để brute password

Kết quả

### Exploiting blind SQL injection using out-of-band (OAST) techniques
#### Lab: Blind SQL injection with out-of-band interaction

Trigger DNS lookup với payload

Request đến burp collaborator client

và solve bài lab

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

Ở bài lab này, ta cần phải login được vào admin account với password lấy được bằng cách áp dụng sqli out-of-band như ở lab trước
Payload như sau:

DNS query:

Solve lab

## SQL injection in different contexts
### Lab: SQL injection with filter bypass via XML encoding

SQLI bypass filter với XML encode
Tìm tên table - `users`

Gồm hai column là `password` và `username`

Tìm được password của admin

Login với admin password và solve bài lab

###### tags: `portswigger`