Как нас поимели ZaCo (zaco@yandex.ru) Хакер, номер #088, стр. 088-056-1 Все подробности последнего дефейса xakep.ru Мы много пишем о разных взломах и часто стебемся над туповатыми программистами и бездарными админами. Однако время от времени нам самим щелкают по носу: недавно вот два негодяя задефейсили сайт нащего журнала. Стесняться тут нечего: пусть расскажут, как было дело. Мы нашли их и попросили написать статью. На страницах xakep.ru можно найти зеркала взломов. Как правило, там находятся малоизвестные сайты, взломанные киддистами. Я решил исправить немного эту ситуацию и отправить туда же зеркало взлома самого хакера - это произвело бы много шума. Сказано - сделано. Заранее хочу поблагодарить Zadoxlik'a: он мне во многом помог при совершении этого злого деяния. [беглый осмотр пациента] Посмотрев движок, я понял, что имею дело с самописной работой от программеров gameland. Признаюсь, меня это нисколько не разочаровало, наоборот, придало некоторый стимул для дальнейшего исследования. Все эти паблик-сплоиты настолько меня достали, что работа с «черным ящиком» доставила лишь удовольствие. Тут уже нужно иметь чутье, без которого не обойтись. Тут уже мыслить, знаете ли, нужно :). Первым делом я нажал на линк «статьи». Ткнув на первую попавшуюся ссылку, меня перекинуло на www.xakep.ru/post/28039/default.asp. Ясно, что у всех публикаций на сайте менялось лишь это пятизначное число. А что делать, если этот параметр не фильтруется? Поставив вместо числа магическое слово "lala", я получил внутреннюю ошибку сервера (это то, что с http-ответом 500): The system cannot find the path specified. К сожалению, дальнейшие манипуляции с этим значением ни к чему не привели, и я по кнопке backspace вернулся обратно. Что-то толкнуло меня посмотреть "архив статей". Присмотревшись к передаваемой переменной, меня поразило, что значение tosearch в адресе www.xakep.ru/articles/common/archive.asp?tosearch=theme%20like%20'*zEDITORz*'%20and%20theme%20like%20'*zINFOz*' содержало в себе логическое условие. Раньше я такого никогда не видел и попробовал передать в качестве toserach значение (1=1) - сервер вернул мне страничку со всеми записями. Подставив (2=1), я увидел надпись "нет данных". Я уже надеялся, что значение в тупую подставляется в sql-запрос, но после того, как я подставил (1=/**/1) и данных опять не было, я разочаровался. Посмотри, комментарии /*КАММЕНТЫ*/ - это практически стандарт sql: употребим как в мускле, так и мсскл с PostgreSQL. Радость от первой маленькой победы уже вскружила голову. Едем дальше. [первая серьезная бага] Когда я вернулся к списку публикаций, меня заинтересовал конкурс от команды GHC. Решив немного отвлечься, я принялся за него - через полчаса получил доступ к админке, но на форуме появилась мессага о том, что конкурс пройден. Жаль, что я не приступил раньше. Хотел оставить положительный отзыв под статьей, но опять решил проверить параметры на sql-injection - мне это удалось. Когда я нажал на кнопку «Оставить свое мнение», мне предложили ввести логин и пароль одновременно с сообщением. Зарегистрировавшись на имя «xaxa» с паролем 123456, я оставил свой отзыв. Посмотрев свое сообщение, справа я обнаружил две кнопки: EDIT и DELETE. Подведя курсор к кнопке EDIT, я увидел, что все нужные параметры передаются методом GET. Ну что ж, посмотрим, как дело обстоит тут. Нажал на свойства, скопировал адрес и понаставил везде кавычки. В ответ я получил еще одну ошибку - код возврата 500. Зайдя под файрфоксом (осел читает только странички с кодом 200), я увидел надпись: The page cannot be displayed. |