Pull to refresh

Comments 82

Мне кажется что на многих сайтах имеет место уязвимость, связанная с авторизацией через социальные сети — вероятно многие не фильтруют, например, имена пользователей из соц сетей при их авторизации на различных порталах, которые потом без обработки вставляются в код страницы.
Да, вы правы. Тут один пользователь — chelovekdimka, кажется — подробно описал это и даже снял видео
Благодарю, как-то мимо меня прошла статья.
php сайтах, да. в рельсах xss вообще не существует сейчас )
Из-за рельсов вроде недавно Гитхаб взломали, не? Не с помощью xss конечно, но стоит помнить, что сам не без греха :)
лол взломал то я и ответственно заявляю что rails сам ый секьюрный фреймворк. На эту тему как раз готовлю «разоблачительный» пост а то после бурления говна все всё не так поняли
О сорри, не посмотрел на никнейм :)
«Баги» просто удачные, а вот статья не очень :-(
Так вот из за кого я всю ночь не мог почитать Хабр :=)
Апдейт Хабра был плановый, но вчера я очень испугался, когда статья почему-то опубликовалась
Да, что-то долго закрывали… Пришлось даже спать лечь((
Ну апдейт большой очень был — там же не только уязвимости закрывали, но еще и топики пересортировывали.
А сколько всего конвертировали…
В итоге на почту приходят неверные ссылки на топики :)
UFO just landed and posted this here
Сейчас все закрыли, но отвечу честно — воспользовался одним из багов, чтобы сделать себе возможность обнулить карму когда-нибудь… На всякий случай :-)
Т.е. я могу обнулить свою карму еще один раз, хотя давно уже делал это :-)
сделал запрос на «Я передумал»?
Не думал, что на хабре будут такие детские уязвимости
Потому и были, что никому даже в голову не приходило их искать на таком ресурсе!
Я предполагаю, что нет ни единого ресурса, в котором не было бы хоть одной уязвимости. Если же вы автор такого — напишите, пожалуйста, статью, станете в один ряд с автором этого топика.
Конечно, уязвимости есть везде. Но тотальная фильтрация всего ввода и ВСЕГДА контроль клиентских действий на стороне сервера — это то что я делаю на всех сайтах, без исключения.
Первое и главное правило: код на стороне клиента — код в руках врага.
Ах, да, еще все формы укрываю CSRF-кодами
выглядят по детски. а встерчаются везде — тот же гитхаб
Самое интересное что я находил это, как я его назвал — Вор инвайтов)
Можно было подбирать id недавно выданных инвайтов и отменять их у себя в профиле. Таким образом инвайт возвращался мне, а не тому, кто его отправил :)
Интересно, но какой логикой руководствовался программист, когда делал это? Ведь у каждого инвайта должен быть хозяин — ему то и надо возращать инвайт!
Трололо негодует, вы сломали их мечту :)
>Для защиты нужно фильтровать кавычки и прочие спецсимволы, которые могут нарушить логику вашего запроса. Также, когда у вас есть число, обязательно явно приводите его к числу.

Никогда не стоит ставить костыли, когда есть принципиальное решение проблемы.
Принципиальное решение — НИКОГДА не использовать конкатенацию запроса и пользовательской переменной. Только prepared statements является решением проблемы, которое невозможно сломать by design.
использовать нормальную ORM
ну, там как раз это и используется.
Я лично еще два года назад несмотря на использование JPA (Java) использовал конкатенацию и не понимал, почему же это плохо. Боже, каким же дубиной я был.
Prepared statements доступно и без ORM. ORM — это уже больше к логической организации данных из БД в памяти приложения, она уместно далеко не всегда.
Не любая база данных поддерживает prepared statements.
Кроме того, бывают (редко, правда) еще и запросы вида
SELECT * FROM Table1 WHERE Id in (<3000 записей>)
три тысячи записей в вебе?
у меня есть ощущение, что вы что-то делаете не так.
Это — кустарная репликация базы, запускаемая по таймеру. 3000 записей бывает только при запуске сервера (т.е. раз в неделю/год в зависимости от воли уборщицы), потому и не оптимизируем.
но, я правильно понимаю, что пользовательского ввода там нет?
Да, пользовательского ввода там нет.

Но когда программист пишет «where id=» + $id, он порой тоже думает, что $id никак не является пользовательским вводом…

Это я к тому, что ваше НИКОГДА является слишком категоричным.
Да, возможно, я был слишком категоричен, но с другой стороны, такую конкатенацию в общем случае использовать нельзя. Ваш случай — скорее исключение и довольно-таки слабо связан с уязвимостями веба (По крайней мере, я не вижу способа все сломать как-либо)
Туда можно sleep() запихнуть.
То есть запрос вида
select data1, data2, data3 from tbl where id=sleep(100) limit 10
подвешивает базу данных на тысячу секунд. Используя конструкцию if, взломщик может вытащить что-нибудь из базы данных, используя отклик «уснуло — не уснуло».
Трудоёмко, но чего только не сделают, чтобы удовлетворить любопытство.
Извините, но в данном конкретном приведенном mayorovp случае такое сделать нельзя. Автоинкрементный id (Насколько я понял) со значением sleep(1000) меня бы насторожил.
И выборка трех тысяч записей не самое быстрое удовольствие, как и последующая их передача (У нас же репликация написана)
Не знаю, как ваша любимая СУБД, а SQL Server Express имеет ограничение на 2048 параметров запроса.
Аааа, Вы об этом… Я Вас неправильно понял.
По себе помню, что новичка абстрактное описание раздражает. Может стоит все-таки более предметно?

При пожелании фильтрации xss привести пример фильтра, от SQL инъекций подсказать использовать placeholders, с перечислением расширений, например, PDO для php. Или хотя бы ссылки на хорошие статьи по теме.
Спасибо, сейчас занят, но ближе к вечеру допишу
Приводить пример XSS-фильтра — опасная практика, в том же codeigniter он состоит более чем из сотни строк, к тому же, я не уверен на 100%, что он защитит сайт от более-менее серьезного взломщика.
Согласен, ссылок на мат.часть не хватает.
Можно, конечно, поискать в сети, но ведь приятнее, когда всё в одном месте (:
Хорошо, сейчас добавлю
XSS — не единственная беда и в одном месте все возможные баги не соберешь. Вот взять те же рельсы. Казалось бы магия везде, ОРМ, фильтрации по-умолчанию и т.д. Но недавно увидел у знакомого кусок кода вроде этого:
Comment.create! { user_id: current_user.id }.merge params[:comment]

Вроде бы все хорошо, но если вдруг кто-то передаст параметр user_id в форму (мало ли, код увидит или еще что), то можно отправлять комментарии от имени другого пользователя. А нужно было всего лишь сделать мерж в другую сторону:
Comment.create! params[:comment].merge({ user_id: current_user.id })

Вывод — очень много зависит от логики.
старый добрый mass assignment. кор уже всерьез за него взялся
Я ж написал, это не мой код :) а про attr_protected знаем.
хех twitter.com/#!/homakov/status/177839734754770944
у вм так же работает верификация смс
> Думаете, веб-разработчики стали от этого умнее и предприняли все возможные методы для защиты? Я так не думаю.
Вот для того, чтобы веб-разработчики стали умнее, они должны пройти через путь тех самых скрипт-киддисов :) Сначала киддисы ломают сайты по чужим рецептам, потом им хочется начать писать свои, а для этого нужно очень много всего изучить. Начинают изучать языки программирования, протоколы, какие-то вспомогательные технологии и т.д. Причем нужно изучать, вдаваясь во все подробности, иначе баги не так-то просто будет откопать.
И когда уже есть багаж знаний, они понимают, что лучше создавать, чем ломать :) Но такие люди уже будут создавать сайты, предугадывая большинство вариантов взлома.
Хочу спросить: как при вводе «alert('Bug')» получается диалог с кнопочкой ОК и надписью «XSS»? Или это так специально сделано, чтобы юные пионеры ждали именно «XSS»? :)
Когда делал скриншот, то ввел «XSS», но в топике написал «Bug».
По-моему, это лишает наглядности. Я могу подключить Cisco, а сфоткаю Juniper.
Исправлю текст в топике — устроит?
Я больше писал для информации для тех, кто, возможно, столкнется и не поймет, а не как претензию.
Если вам не сложно, исправьте пожалуйста.
Давно же вроде уже исправил…
Нда уж — Хабр хотя бы реферер проверял
У меня до сих пор работает — вы добавились ко мне :-)
Упс — не работает, я не заметил, что вы ссылку на чей-то профиль дали :-)
Еще в качестве совета можно предложить использование HttpOnly для всех cookie (в этом случае их нельзя будет получить через XSS).
Cамый безопасный способ, который я видел — у vk.
Собственно, вся авторизация — на login.vk.com, там хранится мастер-куки, назову его так.
При авторизации на любом сайте или сервисе идет редирект на login.vk.com, где проверяется мастер-куки, и делается редирект на страницу, на которой ставится куки-токен для нужного сайта.
Мастер-куки имеет долгий срок жизни, не зависит от ip или чего-либо еще. Куки-токен при смене IP или чего-либо еще сбрасывается. То есть кража куки-токена через XSS ничего не даст, при этом доступа к мастер-куки нет. Единственное, что может быть — xss на login.vk.com, но ИМХО гораздо проще защитить одну страницу, чем весь сайт.
Сервисы google работают аналогично
В общем, советы те же, только теперь вам стоит немного потратиться на человека, который за деньги проверит ваш сайт на наличие уязвимостей и сообщит вам результаты.
Хочу предложить Вам в помощь сайт для проверки защиты вашего ресурса — по сути фриланс биржа для людей обладающих умением взлома. От вас требуется разместить проект, указать тип уязвимости и бюджет. Дальше просто — ждать предложения выполнить проект от экспертов взлома. Проект молодой и ждёт своих клиентов!
hackmysite.ru/
Ну а вот от такого рода «атак» защитится, как мне кажется, не представляется возможным.
Если претендуете на легальность, то добавьте простенький функционал подтверждения прав на сайт (как у гугл или яндекс) — например, чтобы заказчик разместил на корне текстовый файл с вашим кодом.
Если бы вы создали проект, то убедилиь что данная функция реализована в первую очередь, называется она верификация или подтверждения прав на сайт, дабы защитить сайты от заказа со стороны конкурентов. Спасибо за интерес к нашему сервису!
И выражаю огромную благодарность хабре за более 200 человек целевой аудитории!
UFO just landed and posted this here
Не обязательно для XSS использовать JavaScript. Например, если на сайте разрешена публикация картинки, то взломщик в качестве src может указать что-нибудь вроде «mysite.com/logout» или повесить менее безобидный action. При закрузке страницы браузер попытается загрузить данный image и вызовет action внутри сессии пользователя.

Хорошего способа от этого взлома нет: либо убрать полностью GET с сайта, либо производить жесткую валидацию внутренних URL-ей, либо вообще при отправке сервер пытается загрузить header имиджа.
Хорошим способом является динамических токен, хранящийся в сессии пользователя и добавляемый во все формы как скрытый параметр.

Если параметра нет — сервер либо игнорирует запрос, либо показывает страницу вида «Вы уверены?»
Между прочим, Хабр режет картинки на внутренние скрипты
От 95% XSS неплохо защищает сборка целиком через DOM, ну или только динамических полей. Да и код чище получается.
Sign up to leave a comment.

Articles