Всем хай, столкнулся с проблемой. Достал логин и пароль администратора. Нужно войти в игру для получения данных MySQL командами (Фича одного плагина) При авторизации в лаунчере дропает сообщение:"Аккаунт привязан к hwid!" Собственно вот в чём вопрос, как это можно обойти? Имеется php-часть лаунчера. PHP: <?phpclass Auth{ protected $info; public function __construct($data) { $cipher = new Cipher(); $list=explode("<>",$cipher->h2s($data)); //$list=explode("<>",$data); if(count($list)<5) die("Неверные данные"); $this->info = array( "login" => $this->clear($list[0]), "pass" => $list[1], "client" => $list[2], "os" => $this->clear2($cipher->h2s($list[3])), "hwid" => $this->clear($list[4]) ); } public function process(){ $this->check(); if($this->checkHWIDBan()){ if($this->checkBrute()){ if($this->auth()) $this->postAuth(); } } } public function check(){ if(strlen($this->info['login'])<3 or strlen($this->info['login'])>16) die('Неверная длина логина! Допустимо от 3 до 16 символов'); if(strlen($this->info['pass'])<3 or strlen($this->info['pass'])>40 or strlen($this->info['hwid'])!=32) die("Неверная длина пароля! Допустимо от 3 до 40 символов"); if (!preg_match("/^[a-zA-Z0-9_-]+$/", $this->info['login']) or !preg_match("/^[a-zA-Z0-9_-]+$/", $this->info['hwid']) or !ctype_digit($this->info['client'])) die('Обнаружены запрещенные сиволы!'); if(ctype_digit($this->info['login'])) die('Ники из цифр запрещены!'); } public function checkHWIDBan(){ $hwid = $this->info['hwid']; $userdata = new User(); if($userdata->getHwids($hwid,true)>0) { echo "Бан по железяке"; return false; } return true; } public function checkBrute(){ global $db; $time = time(); $hwid = $this->info['hwid']; $q0 = $db->delete("DELETE from brute where time < $time"); $q1 = $db->select("SELECT time from brute where hwid='$hwid'"); if(count($q1)!=0) { $f1 = $q1[0]['time']-$time; echo "Защита от подбора паролей! Подождите $f1 секунд!"; return false; } return true; } public function auth(){ global $db,$brute_check,$brute_time,$authengine; $engine = new Engine($this->info['login'],$this->info['pass'],$authengine); $user = $engine->processAuth(); if($user){ if($this->info['client']==100) die("OK"); $this->info['realuser'] = $user; return true; } else { if($brute_check) { $time1=time()+$brute_time; $hwid = $this->info['hwid']; $db->insert("INSERT INTO `brute` (hwid,time) VALUES ('$hwid','$time1')"); } echo "Неверный логин или пароль!"; return false; } } public function getSessionId(){ $cipher = new Cipher(); return $cipher->gsd($this->info['login'].$this->info['pass'].$this->info['hwid']); } public function postAuth(){ global $prefs,$db,$ac; $client = new Client($prefs['servers'][$this->info['client']]); if(!$client->clientExists()) { if(!$client->tryCreate()){ echo "Не хватает прав на создание папки клиента!"; return false; } } $hwid = $this->info['hwid']; $os = $this->info['os']; $user = $this->info['realuser']; $cipher = new Cipher(); $uuid = $cipher->getPlayerUUID($user); $ses = $this->getSessionId(); $userdata = new User(); $userdata->getForName($user); if($userdata->get('banned')=='1'){ echo "Ваш аккаунт забанен!"; return false; } if($userdata->exists()){ $userdata->set('session',$ses); $userdata->set('hwid2',$hwid); $userdata->set('os',$os); $userdata->set('salt','enter'); //$userdata->set('uuid',$uuid); $userdata->update(); } else { if($hwid=='5bc8b3c903b946f2a5931f4fcdf84f34' || $hwid=='9ba31d46f02abc923a0bacaafa0b1381') $hwid = 'abc'; $q = $db->select("SELECT * from `auth` where `hwid`='$hwid'"); if($userdata->getHwids($hwid,false)>=$ac && $hwid!='abc') { echo "Исчерпан лимит аккаунтов для вашего ПК!"; return false; } $userdata->createNew($user,$os,$ses,$hwid,$uuid); } $id = $userdata->get('id'); if($userdata->get('priv')==1 and $hwid!=$userdata->get('hwid')) { echo "Аккаунт привязан по железу!"; return false; } if($userdata->get('admin')==1){ $manager = new LibraryManager($client->getVersion()); $manager->downloadLibraries(); } $ke = substr($cipher->gsd(md5_file("launcher.jar")."fuckmykey"),16); $kez = substr(md5($ke."fuckmykey"),16); $kev = $cipher->encrypt("$user<:>$ses<:>$id<:>$uuid<br>".$client->getDownloadFiles($os),$kez); echo $ke.":".$kev; return true; } protected function clear($s1){ return str_replace(array("'",'"','\\','<','>','$','%','/','.'),'',$s1); } protected function clear2($s1){ return str_replace(array("'",'"','\\','<','>','%'),'',$s1); }}class Engine{ protected $login; protected $pass; protected $engine; public function __construct($login,$pass,$engine) { $this->login = $login; $this->pass = $pass; $this->engine = $engine; } public function processAuth(){ if($this->engine=='dle') return $this->dle(); if($this->engine=='webmcr' || $this->engine=='webMCR') return $this->webMCR(); if($this->engine=='xf' || $this->engine=='xenforo') return $this->xf(); return false; } protected function dle(){ global $db; $login = $this->login; $row = $db->select("SELECT `login`,`password` FROM `accounts` WHERE `login`='$login'"); if(count($row)==0) { return false; } $realPass = $row[0]['password']; $user = $row[0]['login']; $checkPass = md5(md5($this->pass)); if(!strcmp($realPass,$checkPass) == 0 || !$realPass) { return false; } return $user; } protected function webMCR(){ global $db; $login = $this->login; $row = $db->select("SELECT `login`,`password` FROM `accounts` WHERE `login`='$login'"); if(count($row)==0) { return false; } $realPass = $row[0]['password']; $user = $row[0]['name']; $checkPass = md5(md5($this->pass)); if(!strcmp($realPass,$checkPass) == 0 || !$realPass) { return false; } return $user; } public function xf(){ global $db; $login = $this->login; $postPass = $this->pass; $q0 = $db->select("SELECT user_id,username from xf_user WHERE username='$login'"); if(count($q0)==0) return false; $id = $q0[0]['user_id']; $q = $db->select("SELECT scheme_class,data FROM xf_user_authenticate WHERE user_id='$id'"); if(count($q)==0) return false; if($q[0]['scheme_class']==='XenForo_Authentication_Core') { $salt = substr($q[0]['data'],105,64); $realPass = substr($q[0]['data'],22,64); } else { $salt = false; $realPass = substr($q[0]['data'],22,60); } $cryptPass = hash_xf($realPass,$postPass,$salt); if(!strcmp($realPass,$cryptPass) == 0 || !$realPass) return false; else return $q0[0]['username']; } function hash_xf($realPass, $postPass, $salt) { if($salt!==false) { return $cryptPass = hash('sha256', hash('sha256', $postPass) . $salt); } $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $cryptPass = '*0'; if (substr($realPass, 0, 2) == $cryptPass) $cryptPass = '*1'; $id = substr($realPass, 0, 3); # We use "$P$", phpBB3 uses "$H$" for the same thing if ($id != '$P$' && $id != '$H$') return $cryptPass = crypt($postPass, $realPass); $count_log2 = strpos($itoa64, $realPass[3]); if ($count_log2 < 7 || $count_log2 > 30) return $cryptPass = crypt($postPass, $realPass); $count = 1 << $count_log2; $salt = substr($realPass, 4, 8); if (strlen($salt) != 8) return $cryptPass = crypt($postPass, $realPass); $hash = md5($salt . $postPass, TRUE); do { $hash = md5($hash . $postPass, TRUE); } while (--$count); $cryptPass = substr($realPass, 0, 12); $encode64 = ''; $i = 0; do { $value = ord($hash[$i++]); $encode64 .= $itoa64[$value & 0x3f]; if ($i < 16) $value |= ord($hash[$i]) << 8; $encode64 .= $itoa64[($value >> 6) & 0x3f]; if ($i++ >= 16) break; if ($i < 16) $value |= ord($hash[$i]) << 16; $encode64 .= $itoa64[($value >> 12) & 0x3f]; if ($i++ >= 16) break; $encode64 .= $itoa64[($value >> 18) & 0x3f]; } while ($i < 16); $cryptPass .= $encode64; if ($cryptPass[0] == '*') $cryptPass = crypt($postPass, $realPass); return $cryptPass; }}?>
Вот ориентир в коде:"echo "Аккаунт привязан по железу!";" Игра - Minecraft. Может как вариант мне написать запускатор на той-же яве, с отправкой логина и пароля и далее запускать клиент юзая все либы? ps: hwid хранится в базе. pss: Кто реально может помочь, предоставлю веб-часть, возможна материальная благодарность.
если это phpbb 3 и hwid хранится в бд, то можно попробовать заюзать sql injection в memberlist, зайти под модером, залить шелл через стиль/шаблон и поменять hwid в бд на свой...
Бро, спасибо, но не выйдет. SQL-inj нету, пароль я подобрал при условии, что знал почту админа. Через анти-паблик дёрнул пасс. Там сайт dle 10.5 + IPS. На dle у него админки нету, 4 группа, а на ips доп.пароль стоит, форум и сайт обвязанны, я сменил ему почту, но функция востановления пароля не пашет, видимо вырезанна. Даже на админке в Ips вылазит окно авторизации со всторым паролем..