Сайт - get-simple.info
Версия 3.3.16 - Latest Stable Version.
Интернеты говорят вот так:
В админке имеем возможность редактирования шаблонов - php файлы.
Удаляем стопер, пишем phpinfo и у нас RCE)
Осталось теперь как-то попасть в эту самую админку.
Auth bypass или предсказываем значение rand()
Система использует xml файлы для хранения данных, скулей не увидим.
Посмотрим на то как проходит аутентификация.
admin/inc/login_functions.php
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]if ( ([/COLOR][COLOR="#0000BB"]$userid[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$USR[/COLOR][COLOR="#007700"]) && ([/COLOR][COLOR="#0000BB"]$password[/COLOR][COLOR="#007700"]==[/COLOR][COLOR="#0000BB"]$PASSWD[/COLOR][COLOR="#007700"]) ) {
[/COLOR][COLOR="#0000BB"]$authenticated[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]true[/COLOR][COLOR="#007700"];
[/COLOR][/COLOR]
Слабое сравнение(type jugling), но:
1) GetSimple использует sha1, брутить слишком много вариантов
2) Юзер == админ, поэтому их количество будет не большим)
3) Нужный юзер скорее всего имеет пароль отличный от необходимого нам диапозона
С одной стороны вроде как и нет баги. С другой, если мы заглянем на страницу
восстановления пароля, увидим, что этот процесс происходит таким образом:
1) Запрос на восстановление
2) Смена пароля
3) Отправка нового пароля на email
На email не отправляется линк на смену пароля, пароль меняется и отправляется на почту.
Отсюда можно решить 2 и 3 проблемы таким способом:
-- отправляем на аутентификацию всегда пароль, хэш которого 0e[0-9]{38} - например aaK1STfY
-- расстреливаем запросами на смену пароля
Но проблема слишком большого количества вариантов мешает получить сколько-нибудь
значимые результаты. Плюс ко всему, ситуация ослажняется вот этим:
admin/resetpassword.php
PHP код:
PHP:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]...
[/COLOR][COLOR="#0000BB"]$randSleep[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]rand[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]250000[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]2000000[/COLOR][COLOR="#007700"]);[/COLOR][COLOR="#FF8000"]// random sleep for .25 to 2 seconds
[/COLOR][COLOR="#007700"]...
[/COLOR][COLOR="#0000BB"]usleep[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$randSleep[/COLOR][COLOR="#007700"]);
...
[/COLOR][/COLOR]
Но раз в нашем случае мы можем поменять пароль, посмотрим что это за пароль и
как он генерируется:
admin/inc/template_functions.php
[PHP]
PHP:
[COLOR="#000000"]
functioncreateRandomPassword() {
$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNV Wvw56789";
srand((double)microtime()*1000000);
$i=0;
$pass='';
while ($i[COLOR="#007700"]
А сколько их, этих начальных чисел? На nix(php-7.3) у меня выплюнул 2kkk результатов.
Т.е. два миллиарда полных вариантов пароля, а вот для win:
Но разрабы решили вписать свое число. Оно устанавливается функцией srand.
Что в ней происходит?
Из текущей метки времени Unix с микросекундами берутся именно микросекунды
и умножаются на 1кк - именно столько вариантов у нас для брута, микросекунды
float 0.XXXXXX, поэтому целочисленное значение у нас никогда не будет больше
одного миллиона.
Для атаки на потребуется лишь один раз запросить смену пароля, а потом
пробрутить наши 1 миллион паролей - дело 20 минут.
Генерируем список вариантов возможных паролей:
[PHP]
PHP:
[COLOR="#000000"]
$chars="Ayz23mFGHBxPQefgnopRScdqrTU4CXYZabstuDEhijkIJKMNV Wvw56789";
for($i=0;$i[COLOR="#007700"]