# Lab: Visible error-based SQL injection

## Mô tả

Phòng thí nghiệm này chứa lỗ hổng [SQL injection](https://portswigger.net/web-security/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ề.

Cơ sở dữ liệu chứa một bảng khác có tên là `users`, với các cột có tên là `username`và `password`

**Mục tiêu: Tìm cách rò rỉ mật khẩu của người dùng `administrator`, sau đó đăng nhập vào tài khoản của họ.**

## Phân tích

**Xác định có thể khai thác ứng dụng với lỗi SQL injection qua các thông báo lỗi có thể nhìn thấy được**

Thêm dấu `'` vào TrackingID

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FrFmpreYeDhg9jMP4HxqQ%2Fimage.png?alt=media&#x26;token=6a29e539-8b8d-401c-a848-bdf56d0fb76c" alt=""><figcaption><p>Thông báo lỗi cho thấy truy vấn ứng dụng xây dựng có cả đầu vào vừa thêm</p></figcaption></figure>

Khi thêm dấu -- để bỏ quan phần còn loại của truy vấn

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2F0t5B2MBMClw0fiQOfx0f%2Fimage.png?alt=media&#x26;token=e3bdaa3f-6206-40f9-8a55-cc07c626ca3e" alt=""><figcaption><p>Kết quả truy vấn thành công</p></figcaption></figure>

Thử kích hoạt phản hồi có điều kiện

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2F4lW5WqOpomUGfzi58Hml%2Fimage.png?alt=media&#x26;token=0060ac40-90a1-4fb1-ad2b-b0aac2935b09" alt=""><figcaption><p>Không thành công,  có vẻ như có giới hạn ký tự</p></figcaption></figure>

Có thể sử  dụng hàm `CAST()` chuyển đổi một kiểu dữ liệu sang kiểu dữ liệu khác nhằm tạo ra thông báo lỗi và thực thi payload được cast.

## Giải pháp

`'||cast((select username from users limit 1)as int)--`

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FzLhfNO10c7EbSFU7H3kF%2Fimage.png?alt=media&#x26;token=53e4241f-4890-4b33-8997-899012e6035b" alt=""><figcaption></figcaption></figure>

`'||cast((select password from users limit 1)as int)--`

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FmD38eMAayVmsM2H6oz25%2Fimage.png?alt=media&#x26;token=027f2b85-378d-4346-a195-25a80f475b08" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FqpuedYczIRchul7OKZou%2Fimage.png?alt=media&#x26;token=31cde266-2107-4f37-b4ba-89a3672fa1bd" alt=""><figcaption></figcaption></figure>
