Часть 2. Процесс технических исследований
первый,JSON и JSONP — это две концепции.,JSON — популярный формат данных.,Используется для передачи и хранения данных между различными приложениями. JSONP был до CORS,Технология разрешения междоменных запросов,Он позволяет веб-страницам получать данные из других доменных имен, которые не соответствуют той же политике происхождения. JSONP — это способ использования json;,Позволяет текущей веб-странице получать данные из других доменных имен в разных доменах.,он использует в своих интересах<script>МаркированныйsrcСвойства, на которые не влияет политика одного и того же происхождения.。
Когда веб-сайт передает конфиденциальные данные пользователей через JSONP, злоумышленник может создать сторонний веб-сайт, встроить ссылки JSONP внутрь веб-страницы и внедрить вредоносный код JS. Как только жертва просматривает этот веб-сайт, его или ее конфиденциальная информация будет неизвестна. При определенных обстоятельствах заранее созданный злоумышленником js-код может быть украден. Это уязвимость перехвата JSONP, которую мы собираемся объяснить сегодня.
Сначала напишите страницу сервлета, которая позволяет пользователям входить в систему, используя свое имя пользователя и пароль, и сохраняет файлы cookie, имитируя статус пользователей после входа в производственную среду. Чтобы перехват JSONP позволил получить конфиденциальные данные жертвы, жертва должна войти на веб-сайт и не выйти из системы. Таким образом, когда злоумышленник реализует атаку перехвата JSONP, браузер автоматически передает файлы cookie пользователя для получения конфиденциальных данных. данные.
Напишите страницу GetUserInfo для возврата данных в формате JSONP, включая идентификационный номер конфиденциальных данных пользователя, имя, пароль и т. д.
Как показано на рисунке ниже, сгенерируйте пакет war и разверните его в tomcat. Введите имя пользователя и пароль admin:123456 в браузере, и он сообщит об успешном входе в систему.
Посетите следующий URL-адрес, чтобы имитировать обычный веб-сайт и вернуть личную информацию, которую мы заполнили сами.
http://192.168.237.1:9999/Servlet/GetUserInfo
Далее мы проходимcallbackпараметр,Официально имитирует захват JSONP,Было обнаружено, что текущая страница JSONP вернула формат кода, соответствующий стандартам JavaScript.,test111() эквивалентен функции JS.
Затем подражайте злоумышленнику, чтобы создать тестовую страницу уязвимости перехвата JSONP, как показано на рисунке ниже.
Среди них user111222 — функция, которую нужно вызвать обратно,
<script src=”http://192.168.237.1:9999/Servlet/GetUserInfo?callback=user111222”>
Это эквивалентно загрузке фрагмента JS-кода, и этот JS-код
user111222({"identitycard":"370688022919880819","password":"P@ssw0rd","username":"Ли Си"})
Затем движок js продолжит поиск функции user111222 на текущей странице и выдаст предупреждение о выполнении (код JSON.stringify(data));
Многие статьи не содержат приведенного выше описания, в результате чего многие новички до сих пор не понимают принцип уязвимости перехвата JSONP.。Итак, мы используем GoogleБраузерchromeтестодин раз,Нашел пустую страницу, вернулся,Никакие конфиденциальные данные пользователя не всплывают.
Почему это? ABC_123 проверил код от начала до конца,Я понял, что проблем быть не должно。Поэтому я использовал программное обеспечение для захвата пакетов для захвата пакетов данных и обнаружил, что пакет HTTP-запроса не содержит файла cookie.,без файлов cookie,Конечно, никакие конфиденциальные данные не будут возвращены.
Вспоминая предыдущее тестирование уязвимостей междоменного совместного использования ресурсов CORS, мне интересно, принял ли Google Chrome меры предосторожности против взлома JSONP. Поэтому я перешел на более старую версию браузера Firefox, чтобы протестировать его, и обнаружил, что тест на уязвимость перехвата JSONP прошел успешно. Будучи жертвой, я посетил страницу злоумышленника http://192.168.237.128:8888/jsonpHack.html и Появилось сообщение о том, что моя личная информация может быть получена.
В этот раз мы использовали программное обеспечение для перехвата пакетов для захвата пакетов данных и обнаружили, что старая версия браузера Firefox автоматически переносит файлы cookie.
Затем я протестировал IE11 и обнаружил, что уязвимость перехвата JSONP все еще можно успешно протестировать.
Подводя итог, мы нашли,Для уязвимостей перехвата JSONP в новых браузерах или в некоторых браузерах приняты превентивные меры, направленные на устранение основной причины.,Вредность этого вида лазейки в ближайшее время постепенно снизится.
1. Проверьте источник реферера при принятии запроса.
2. Добавьте токен в запрос и проверьте его на серверной стороне.
3. Строго фильтруйте вывод имен и данных функций обратного вызова в формате JSON.
4. Замените междоменную функциональность JSONP на CORS.
5. Строго фильтруйте имена функций обратного вызова и выходные данные в формате JSON, чтобы предотвратить уязвимости XSS.
6. Строго установите стандартный вывод Content-Type и кодировку формата JSON ( Content-Type : application/json; charset=utf-8 )。
7. Добавьте другие символы (например: /**/, возврат каретки и перевод строки) перед выводом обратного вызова. Это не повлияет. JSON Загрузка файлов также может в определенной степени предотвратить атаки перехвата JSONP.
1. В последней версии Google Chrome приняты меры предосторожности против атак перехвата JONSP. Именно поэтому многие уязвимости перехвата JSONP могут быть успешно воспроизведены другими, но некоторым людям всегда не удается их воспроизвести. Это указывает на то, что вред от перехвата JSONP и уязвимостей междоменного совместного использования ресурсов CORS будет постепенно уменьшаться.
2. Если вы хотите понять принципы работы некоторых веб-уязвимостей, вам все равно придется создать свою собственную среду, написать собственный код и разобраться в нем от начала до конца, чтобы понять суть уязвимости только после того, как вы войдете в нее. в яме ты поймешь, что именно это и произошло.