# cURL Authentication with Escape

## Description

The `cURL` authentication preset is designed for dynamic token generation and reuse:

- **cURL Command Parsing**: Parses a cURL command and executes it in a secure sandboxed cURL simulator.
- **Dynamic Token Extraction**: Extracts the authentication token from the cURL command's HTTP response.
- **Token Re-injection**: Reinjects the extracted token into subsequent authenticated requests.

This preset is particularly useful for scenarios where authentication tokens are dynamically generated and need to be efficiently extracted and reused in ongoing requests.

The simulator supports a subset of arguments commonly used in `cURL`:

- `url`: The URL for the HTTP request.
- `-X`, `--request`: Specify a custom request method to use when communicating with the HTTP server.
- `-H`, `--header`: Add a header to the request (can be used multiple times for multiple headers).
- `-b`, `--cookie`: Add a cookie to the request (can be used multiple times for multiple cookies).
- `-d`, `--data`, `--data-ascii`, `--data-binary`, `--data-raw`: Sends the specified data in a POST request.
- `-u`, `--user`: Specify the user and password for server authentication.
- `-A`, `--user-agent`: Sets the user agent string for the HTTP request.
- `-x`, `--proxy`: Use the specified proxy.
- `-k`, `--insecure`: Allow connections to SSL sites without certificates.
- `-L`, `--location`: Follow redirects (the maximum number of redirects is defined by `--max-redirs`).
- `--max-redirs`: Set the maximum number of redirections to follow for `-L`.
- `-m`, `--max-time`: Maximum time in seconds for the request to complete.

**Note**: The simulator doesn't support all `cURL` arguments. Adding unsupported arguments may result in an error.

## Examples

```yaml
presets:
-   type: curl
    injections:
    -   key: Authorization
        location: header
        prefix: Bearer
        variable: token
    extractions:
    -   name: token
        key: Authorization
        location: header
    users:
    -   username: user1
        curl: curl -X POST https://api.example.com/auth -d "username=user1&password=pass1"
```

```yaml
presets:
-   type: curl
    injections:
    -   key: session_id
        location: cookie
        variable: sessionId
    extractions:
    -   name: sessionId
        key: Set-Cookie
        location: header
        regex: session_id=(\S+);
    users:
    -   username: user2
        curl: curl -X POST https://api.example.com/login -d "username=user2&password=pass2"
```

```yaml
presets:
-   type: curl
    injections:
    -   key: Authorization
        location: header
        prefix: Bearer
        variable: token
    extractions:
    -   name: token
        key: access_token
        location: body
    users:
    -   username: user3
        curl: 'curl -X POST https://api.example.com/auth -H "Authorization: Basic
            1234567890" -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials&client_id=1234567890&client_secret=0987654321&scope=scope1
            scope2 scope3"'
```

## Extensive Configuration

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `extractions` \* | `List[`[HTTPExtraction](<#HTTPExtraction>)`]` |  | The token extraction configuration used to extract the tokens from the HTTP response. |
| `injections` \* | `List[`[HTTPInjection](<#HTTPInjection>)`]` |  | The injection configuration used to inject the tokens into the HTTP requests. |
| `timeout` | `integer` | `null` | The timeout of the authentication request in seconds. Overrides `-m` / `--max-time` from the curl command when set. |
| `type` | `Const[curl]` | `curl` |  |
| `users` \* | `List[`[CurlUserPreset](<#CurlUserPreset>)`]` |  | The list of users to generate tokens for. |

## Objects

### CurlUserPreset

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `allow_failure` | `boolean` | `false` | If false, authentication failure for this user will fail the scan. Ignored for the main user: failures for main user are always fatal. |
| `basic` | `string` | `null` | The basic to attach Reach the Login Page and attack to the HTTP requests sent for this user. |
| `cookies` | `Dict[string, string]` | `null` | Optional cookies injected during the authentication process and in authenticated requests. |
| `curl` \* | `string` |  | The curl command that is used to fetch the tokens for this user. |
| `digest` | `string` | `null` | The digest to attach Reach the Login Page and attack to the HTTP requests sent for this user. |
| `headers` | `Dict[string, string]` | `null` | Optional headers injected during the authentication process and in authenticated requests. |
| `main_user` | `boolean` | `false` | When running a WebApp Testing scan, this indicates that the scanner must use this user when crawling. There must be only one main user per scan. If none is provided, a random user will be selected. |
| `query_parameters` | `Dict[string, string]` | `null` | Optional query parameters injected during the authentication process and in authenticated requests. |
| `role` | `string` | `null` | The role of the user (for example, admin or user). |
| `username` \* | `string` |  | The arbitrary name that identifies the user. |

### HTTPExtraction

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `key` \* | `string` |  | The key to use for the extracted value, depending on the location |
| `location` \* | [HTTPLocation](<#HTTPLocation>) |  | The location of the HTTP request where the value should be extracted |
| `name` \* | `string` |  | The name of the variable to store the extracted value into |
| `regex` | `string` | `null` | The regex to use to extract the token from the key value. By default the entire value is taken. |

### HTTPInjection

| Property | Type | Default | Description |
| --- | --- | --- | --- |
| `key` \* | `string` |  | The key to use for the injected token. Its usage depends on the location. For headers, cookies,and query parameters, this key describes the name of the header, cookie or query parameter. For a body location, the key is the field where the token should be injected within the request bodies |
| `location` \* | [HTTPLocation](<#HTTPLocation>) |  | The location of the HTTP request where the token should be injected |
| `prefix` | `string` | `null` | A prefix to prepend to the token before it's injected |
| `variable` \* | `string` |  | The name of a variable to retrieve to create the token's value. If not provided, the token will be inferred as the first successful extraction of the procedure |

## Enums

### HTTPLocation

| Value |
| --- |
| `header` |
| `cookie` |
| `body` |
| `query` |
