Hallo allemaal,

Ik heb al 4 jaar een forum (IPB 2.3.5 atm) en bouw nu aan een nieuwe website ernaast. Ze staan dus los van elkaar, maar staan wel op hetzelfde ftp-account met toegang tot dezelfde db's.

Nu wil ik ergens in de header van mijn website een login-scriptje hebben voor members die rechtstreeks op de site willen inloggen met hun forum-account van IPB. Ik heb een mooie/simpele kant-en-klare mod voor gevonden en die ziet er zo uit:

<?php
if (isset($_COOKIE["member_id"])) {
    if ($_COOKIE["member_id"] == 0) {

echo "<form action='/forums/index.php?act=Login&CODE=01' method='post' name='LOGIN'>
<strong>Username</strong>: <input type='text' size='25' maxlength='64' name='UserName' /><br />
<strong>Password</strong>: <input type='password' size='25' name='PassWord' /><br />
Remember Me? <input class='checkbox' type='checkbox' name='CookieDate' value='1' checked='checked' /><br />
<input class='button' type='submit' name='submit' value='Log In' />
</form><br />
<a href='/forums/index.php?act=Reg'>Register</a>";
    }
    else { // Content that shows up if logged in
echo "HERE COMES THE MEMBER-INFO-BAR";
    }
}
else {

echo "<form action='/forums/index.php?act=Login&CODE=01' method='post' name='LOGIN'>
<strong>Username</strong>: <input type='text' size='25' maxlength='64' name='UserName' /><br />
<strong>Password</strong>: <input type='password' size='25' name='PassWord' /><br />
Remember Me? <input class='checkbox' type='checkbox' name='CookieDate' value='1' checked='checked' /><br />
<input class='button' type='submit' name='submit' value='Log In' />
</form><br />
<a href='/forums/index.php?act=Reg'>Become a Member!</a>";
}
?>


Werkt perfect (gebruikt de cookie van IPB), maar ik ben nog niet klaar met content die je ziet als je al reeds bent ingelogd als je de site bezoekt (zie: "HERE COMES THE MEMBER-INFO-BAR" in de code hierboven). Ik wil hier namelijk een paar linkjes zetten naar de index, inbox, etc. van het forum en zal geen probleem vormen, maar daarnaast wil ik ook een welkoms-tekst hebben, zoals: "Welcome back, <membername>!"
Ik heb echter geen idee hoe ik de <membername> moet opvragen uit de cookie... ik heb niet zo heel veel verstand van PHP, maar weet wel een simpele query te maken in PHP. Dus als ik op de site kan connecten met de IPB database en een query kan maken zoals:

SELECT `members_display_name` 
FROM `ibf_members` 
WHERE `id` = <ID-UIT-DE-COOKIE>


Hoe zou ik dat dan in het php script moeten neerzetten en hoe kan ik het 'id' uit de cookie gebruiken van desbetreffende member, of is dat onmogelijk? Zijn er misschien andere/betere oplossingen mogelijk naar hetgene wat ik uiteindelijk wil? Het lijkt zo simpel. Alle suggesties zijn welkom.

PS. Er hoeft in dit vraagstuk geen zorgen gemaakt te worden over hoe er met de IPB db verbinding gemaakt moet/gaat worden, want dat staat kant en klaar voorgebakken in een guide.

Je bent al heel erg ver!

Het enige wat je nu nog moet doen is het volgende:


<?php
if(isset($_COOKIE['member_id']) && !empty($_COOKIE['member_id']))
{
     $query = @mysql_query("SELECT members_display_name FROM ibf_members WHERE id = '".$_COOKIE['member_id']."'");
     if(!$query)
     {
           echo 'Query kon niet worden gemaakt!<br />'.mysql_erorr();
     }
     else
     {
           $list = @mysql_fetch_array($query);
           echo $list['members_display_name'];
      }
}
?>
Alvast heel erg bedankt!!! Het werkt! :)

Toch ben ik benieuwd of mijn script nu netjes, veilig en 'af' is... Take a look at this:


<?php
function do_connect()
{
    define( 'ROOT_PATH', dirname( __FILE__ ) ."/forums/" );
    define( 'KERNEL_PATH'  , ROOT_PATH.'ips_kernel/' );
    
    $sql_driver = 'mysql';
    
    if ( ! class_exists( 'db_main' ) )
    {
        require_once( KERNEL_PATH.'class_db.php' );
        require_once( KERNEL_PATH.'class_db_'.$sql_driver.".php" );
    }
    
    $classname = "db_driver_".$sql_driver;
    
    $DB = new $classname;
    
    $DB->obj['sql_database']        = 'name';
    $DB->obj['sql_user']            = 'user';
    $DB->obj['sql_pass']            = 'xxxx';
    $DB->obj['sql_host']            = 'localhost';
    $DB->obj['sql_tbl_prefix']        = 'ibf_';
    $DB->obj['force_new_connection']    = 1;
    $DB->obj['use_shutdown']        = 0;
    $DB->obj['error_log']            = ROOT_PATH . 'cache/sql_error_log_'.date('m_d_y').'.cgi';
    $DB->obj['use_error_log']        = 1;
    $DB->obj['debug_log']            = ROOT_PATH . 'cache/sql_debug_log_'.date('m_d_y').'.cgi';
    $DB->obj['use_debug_log']        = 0;
    
    
    if ( !isset($DB->connect_vars['mysql_tbl_type']) OR !$DB->connect_vars['mysql_tbl_type'] )
    {
        $DB->connect_vars['mysql_tbl_type'] = 'myisam';
    }
    
    define( 'SQL_PREFIX'      , $DB->obj['sql_tbl_prefix'] );
    define( 'SQL_DRIVER'      , $sql_driver);
    define( 'IPS_MAIN_DB_CLASS_LOADED', TRUE );
    
    $DB->connect();
    
    
    if ( ! defined( 'IPSCLASS_DB_LOADED' ) )
    {
        define( 'IPSCLASS_DB_LOADED', 1 );
    }
    
    unset( $classname );

    return $DB;
}

$DB = do_connect();

if (isset($_COOKIE["member_id"])) {
    if ($_COOKIE["member_id"] == 0) {

echo "<form action='/forums/index.php?act=Login&CODE=01' method='post' name='LOGIN'>
<strong>Username</strong>: <input type='text' size='25' maxlength='64' name='UserName' /><br />
<strong>Password</strong>: <input type='password' size='25' name='PassWord' /><br />
Remember Me? <input class='checkbox' type='checkbox' name='CookieDate' value='1' checked='checked' /><br />
<input class='button' type='submit' name='submit' value='Log In' />
</form><br />
<a href='/forums/index.php?act=Reg'>Register</a>";
    }
    else {
echo "Welcome, "; 
if(isset($_COOKIE['member_id']) && !empty($_COOKIE['member_id']))
{
     $query = @mysql_query("SELECT members_display_name FROM ibf_members WHERE id = '".$_COOKIE['member_id']."'");
     if(!$query)
     {
           echo 'Query could not be made<br />'.mysql_erorr();
     }
     else
     {
           $list = @mysql_fetch_array($query);
           echo $list['members_display_name'];
      }
}
echo "! <A HREFs AND REST OF CONTENT HERE>";
         }
}
else {

echo "<form action='/forums/index.php?act=Login&CODE=01' method='post' name='LOGIN'>
<strong>Username</strong>: <input type='text' size='25' maxlength='64' name='UserName' /><br />
<strong>Password</strong>: <input type='password' size='25' name='PassWord' /><br />
Remember Me? <input class='checkbox' type='checkbox' name='CookieDate' value='1' checked='checked' /><br />
<input class='button' type='submit' name='submit' value='Log In' />
</form><br />
<a href='/forums/index.php?act=Reg'>Become a Member!</a>";
}
$DB->close_db();
?>


En let dan vooral ook op line: 68 t/m 82. Hier heb ik iChris.nl's code in verwerkt en werkt nu, maar kan misschien anders/beter?
En wat als ik nu mijn cookie aanpas naar JOUW userid...

Et voila, admin-rights..
Verre van veilig om zo maar te zeggen.
En welk gedeelte uit dit script maakt het zo vulnerable dat jij met een gemodificeerde cookie admin rights zou kunnen hebben?
Het gebruikt dezelfde cookie als IPB's forumsoftware en je moet eerst de login-form invullen, die via de forumsoftware inlogt en geloof mij... die is zwaar beveiligt. Of is het de query oid die dit script 'vulnerable' maakt?

Uhm... Je kunt de Cookie member_id aanpassen naar jouw id, en dan kan ik al jouw linkjes zien.
Daar zullen alleen de welkomstekst komen en wat algemene URLS... zodra je daadwerkelijk naar de forums gaat is alles super zwaar beveiligd door IPB. Maar jullie maken mij wel bang :P Ik zou het graag even zelf testen, waar kan ik tegenwoordig de cookies vinden voor IE7/Mozilla/Opera?

Voor de rest is het script wel 'clean' ?

Alvast bedankt allemaal voor de hulp
Sorry voor de doublepost, maar ik heb het even zelf geprobeerd (al ben ik geen PRO hacker)... maar volgens mij lukt het niet. Dit is een example waaruit de cookie is opgebouwd (van een testaccount):

ipb_stronghold
f9179f4e2c9664d707b7ffc0d6e33b04
domain.net/
9728
2157889920
30023480
155658720
29950055
*
member_id
19561
domain.net/
9728
2157889920
30023480
155808720
29950055
*
pass_hash
ee067b68ab6c4629ae17533ef0262ddb
domain.net/
9728
837645952
29951463
172218720
29950055
*
anonlogin
-1
domain.net/
1536
1997889920
30023480
4287496016
29950054
*


Als ik de member_id van "19561" veranderde in de id van een admin account en daarna de website bezocht, was de cookie gelijk gedelete en moest ik opnieuw inloggen.
Redelijk veilig dus?

Reageren