Są różne sposoby wykrywania tego na jakim skrypcie stoi dane forum dyskusyjne. Jedne rozwiązania są mniej efektywne, a drugie bardziej. Czasami wystarcza zwykłe sprawdzenie zawartości nagłówków lub tagów
meta albo przejechanie odpowiednim wyrażeniem regularnym źródła strony. Sprawa komplikuje sie w momencie kiedy mamy setki tysięcy adresów do sprawdzenia. W przypadku botów spamujących fora dyskusyjne najczęściej odpytywane są odpowiednie adresy odpowiedzialne za rejestracje i w przypadku powodzenia proces jest kontynuowany. Są też takie przypadki, w których chodzi o znalezienie for dyskusyjnych bazujących na określonym skrypcie w celu chociażby eskalacji uprawnień lub wykorzystania exploita aby np. zrobić zrzut bazy danych celem sprzedaży. Bardzo dochodowy rynek swoją drogą. O ile w takich przypadkach Google jest bardzo pomocne to w przedstawionym przeze mnie zagadnieniu sprawa wygląda nieco inaczej. Ponadto o ile mnie pamięć nie myli metoda jest również odporna na sztuczki SEO z przyjaznymi adresami i siłą rzeczy jest niezależna od chociażby wykorzystywanego szablonu czy też ukrycia kluczowych informacji. Jej skuteczność oszacowałbym na 99,9%. Cały myk polega na tym, że odpytujemy serwer w poszukiwaniu specyficznego pliku, który występuję praktycznie tylko przy wykorzystaniu danego skryptu. Dodatkowo nie spotkałem się jeszcze z sytuacją, w której wszystkie pliki oprócz przysłowiowego index.php odpowiedzialnego za routing adresów były umieszczone w niedostępnej lokalizacji czyli tzw. katalog wyżej niedostępnego z poziomu przeglądarki. Jedyny problem jaki może wystąpić to webmaster, który umyślnie wrzucił plik o takiej samej nazwie jaką poszukujemy. Pomimo tego, że jest nikła na to szansa jednak warto o tym wspomnieć.
Kod:<?php
$target = 'http://www.forumweb.pl/';
// Reszta deklaracji dla IPB, vBulletin, SMF, bbPress, MyBB, PunBB, FluxBB, Vanilla, Phorum, UseBB, XMB, IceBB, SEO-Board i tym podobnych
$forum_types[] = ['phpbb_by_przemo', 'post_history.php'];
$forum_types[] = ['phpbb3', 'ucp.php'];
$forum_types[] = ['phpbb2', 'groupcp.php'];
echo '<pre>'.$target.' -> ';
for($h = 0, $how = count($forum_types); $h < $how; ++$h)
{
$ch = curl_init($target.$forum_types[$h][1]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
// HTTP/1.1 200 OK?
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200)
{
$forum_type = $forum_types[$h][0];
break;
}
curl_close($ch);
}
echo ($forum_type !== null ? $forum_type : 'unknown type').'</pre>';
?>
Oczywiście to tylko prototyp przedstawiający ideę. Należy go uzupełnić o konfigurację cURL'a, obsługę wyjątków, timeoutów, logowanie informacji jak i inne bzdury pokroju wrzucenie tego w jakiś wrapper albo metodę w klasie. Ulepszoną wersję wykorzystuję między innymi w pewnym projekcie zwanym dalej Beithir, o którym wspomniałem szerzej chociażby
tutaj.
Komentarze
Brak komentarzy
Dodaj komentarz
Zezwolono używać:
BBCode
Zabroniono używać:
znaczników HTML