Пишу, по большей части, про историю, свою жизнь и немного про программирование.

В Сеть через гостевой аккаунт, image script

Всем привет!

Сегодня немного поговорим о получении выхода в интернет с гостевого аккаунта и получение доступа к выполнению скриптов через заливку на сайт картинок. Способы эти работают при некоторых серьёзных ограничениях, но иначе и быть не может — если бы они работали всегда, их бы уже давно повсеместно устранили.

Изложение, как и всегда, будет конспективным — дабы дать скорее метод для устранения уязвимости, чем способ её использования. Особо упорные умы, конечно, всё равно ей воспользуются, но и начинающие вебмастера, возможно, задумаются, наконец, о безопасности собственных сайтов.

Тема: сложный способ получения бесплатного доступа в интернет с гостевого логина

Сразу скажу, что прежде чем описать идею здесь, я попробовал реализовать её в самом простом варианте, просто чтобы убедиться, что я ничего не упустил. Реализацию я в свободный доступ выкладывать не буду, даже и не просите, но идеей поделюсь. Итак…

Некоторые провайдеры, есть такие и в Казани, где я живу, предоставляют так называемый «гостевой» вход в Сеть — бесплатный урезанный аккаунт, на доступ к сайту провайдера. Даётся, обычно, он для того, чтобы втянуть человека в процесс пользования интернетом или предоставить бесплатный доступ к статистике пользования платным аккаунтом.

Как правило, доступ к этому сайту никак не ограничен снаружи, а провайдер, стремясь разнообразить контент, устанавливает на своём сайте чаты, форумы и прочие средства общения. Вот тут и начинается самое интересное.

Именно чаты подходят для нашей затеи более всего — там проще скрыть результат своего пребывания: как правило, число сообщений в окне чата ограничено и строки быстро пропадают с экрана, а историю ведут лишь немногие.

Если вы уже догадались в чём дело, следующие несколько абзацев можно пропустить, если нет, читайте дальше. В чате регистрируем два новых пользователя. Для простоты изложения, я буду называть их «client» и «server». В течении двух дней заходим в чат, со всеми знакомимся, и выясняем когда в чате будет меньше всего народу. В идеале, находим временну́ю «дыру», когда в чате не будет никого — например, глубоко ночью.

Пишутся две программы. Одна — локальный прокси, который умеет логиниться в чат под ником «client», формировать запрос пользователю «server», находить в потоке ответов нужные куски (chunks), расшифровывать их, собирать из них страницу и выдавать в ответ за запрос. Вторая — удалённый демон, который каждый день, во время затишья в чате, логинится туда с ником «server», умеет выбирать из окна сообщений запросы от пользователя «client», скачивать контент, бить его на аккуратные куски (во многих чатах есть ограничение на длину сообщения), упаковывать, преобразовывать в текст и выводить в окно чата.

Далее, запускаем демона на любом сервере с выходом в интернет, где есть хоть какие-то права, в час Икс запускаем прокси, настраиваем браузер на работу с ним и выходим с гостевым логином на сервер провайдера. Пытаемся открыть какой-нибудь сайт. Скорость, конечно, при таком способе связи, невысока — в основном из-за частой прокачки полного окна с сообщениями, но, если не забывать, что способ этот не требует расхода денежных средств, с этим вполне можно смириться.

После окончания сеанса работы, рекомендую, в целях конспирации, «забить» окно чата сообщениями типа «Привет», «А где все?», «Тут всегда так тихо?» и т. п.

Единственное, что вам может повредить всерьёз — это наличие в чате модераторов или киллеров. Им всё происходящее может не понравиться, наверняка они попытаются помешать мирному общению двух ваших программ, даже если это общение, формально, не противоречит правилам.

Можно, конечно, в качестве шутки, сымитировать общение на неком выдуманном языке, с ответами на все вопросы эквивалентом фразы «я не говорю по-русски», маскируя трафик под слова, но скорость, в этом случае, будет намного ниже границы терпения. Впрочем, если кто-то реализует что-то подобное, пишите на мыло, будет интересно посмотреть. :)

Тема: получение прав на выполнение скриптов при помощи заливки картинок

Сайтов, позволяющих размещать картинки с какой-либо целью, например, для составления фотоальбомов или заполнения анкет, в интернете великое множество. Нас же интересуют те из них, где можно указать произвольное имя для закачиваемого файла.

Случается, что программист не проверяет указываемое расширение имени закачиваемого файла, полностью полагаясь на вторичные функции проверки содержимого файла. В PHP, например, есть функция getimagesize, позволяющая узнать тип картинки и её размеры. Так что условие «враг не пройдёт» выглядит как вызов функции getimagesize с проверкой типа «если не gif и не jpeg, пусть идёт лесом».

Теперь небольшое отступление. Практически в каждом графическом формате предусмотрены поля для комментариев, куда можно поместить любую текстовую информацию. Я уже как-то рассматривал формат JPEG. Графической составляющей эта информация, понятное дело, никак не вредит и функция getimagesize не отличает такую картинку от «нормальной».

В поле комментария можно, например, записать инструкции PHP, залить файл на сервер под именем, скажем, image.php (расширение зависит от настроек сервера) и вызвать файл на выполнение из строки браузера.

Я видел реализации, где вместо вызова getimagesize просто запрещают указывать в качестве расширения имени файла php, php3, cgi, shtml и так далее. Это, конечно, решает часть проблем, но мне решительно непонятно почему нельзя просто запретить указывать в качестве расширения что бы то ни было, кроме gif и jpg. Впрочем, я отвлёкся.

Наиболее распространённый в Рунете веб-сервер Apache, файлы .htaccess, по-умолчанию, считает служебными. В частности, в них можно указать какие файлы будут обработаны интерпретатором PHP, какие считать содержащими инструкции SSI и так далее. При заливке, если указать в качестве имени файла .htaccess расширением будет считаться часть после точки, т. е. htaccess — расширение, не попадающее в список запрещенных.

Таким образом, для обхода защиты достаточно залить два файла — .htaccess с указанием нейтрального расширения, которое будет обработано как SSI, PHP или что-то ещё, и, собственно, сам файл с нужным расширением, который и будет выполняться.

Пишите!