用户
搜索

[web安全] 前端JS攻击

  • TA的每日心情
    开心
    2021-11-26 16:06
  • 签到天数: 240 天

    连续签到: 1 天

    [LV.8]以坛为家I

    i春秋作家

    Rank: 7Rank: 7Rank: 7

    64

    主题

    129

    帖子

    3728

    魔法币
    收听
    0
    粉丝
    8
    注册时间
    2020-10-2

    积极活跃奖春秋文阁

    发表于 2021-8-20 15:12:26 04321

    前端JS攻击

    本篇文章作者Johnson666,本篇文章参与i春秋作家连载计划所属从0到1团队,未经许可禁止转载。连载方向:web安全,内网安全

    The attacks in this section are designed to help you learn about how JavaScript is used in the browser and how it can be manipulated. The attacks could be carried out by just analysing network traffic, but that isn't the point and it would also probably be a lot harder.
    本章节中的攻击旨在帮助您了解如何在浏览器中使用 JavaScript 以及如何对其进行操作,攻击可以通过分析网络流量来实现,但这不是本章节的重点而且可能要困难得多。
    Simply submit the phrase "success" to win the level. Obviously, it isn't quite that easy, each level implements different protection mechanisms, the JavaScript included in the pages has to be analysed and then manipulated to bypass the protections.
    只需提交单词 “success” 即可攻击成功,显然这并不是那么容易。每个级别都实现了不同的保护机制,页面中包含的JavaScript必须经过分析,然后才能绕过保护。

    这里用DVWA的靶场来当作例子。

    Low

    这里看到只需提交单词 “success” 即可攻击成功,马上开始尝试:

    可是提交了 “success”之后,页面却提示Invalid token

    抓包看看,请求网页时同时提交了 token 和 phrase 参数,其中 phrase 参数是我们提交的内容。而 token 参数无论我们提交什么,都是不会变的,也就是说 token 和我们注入的参数并不会匹配:

    这里按F12,点击调试器来这里查看js文件,找到该页面的JS文件,审计了一波,找到了这段代码,可以发现token 的生成是基于 phrase 参数的,将phrase参数的值经过加密生成了token:

    那么我也在Console控制台输入以下函数来加密ChangeMe:

    发现和刚才burp抓到的包里的token值一模一样,那么上面提示Invalid token的原因就很清楚了:页面并没有更新token值,还是原来的ChangeMe。

    那么在Console控制台输入以下函数来加密success:

    再替换到burp抓的包里:

    包全放掉后,页面提示我成功了:

    还有一种方法,就是重新生成token值(建议用上面的方法,这种试了好几次才成功):
    首先要先在页面输入success:

    出现了Invalid token后,在F12的Console控制台中输入generate_token()函数并运行:

    运行完之后再次提交success,然后来用burp抓包查看下,现在的 token 值已经改变了,变成了success加密后的token值:

    那么就成功了

    medium

    访问http://127.0.0.1/bachang/dvwa/vulnerabilities/javascript/source/medium.js,查看JS文件:

    function do_something(e)
    {
          for(var t = "", n = e.length - 1; n >=0; n--)
                t += e[n];
          return t
    }
    
    setTimeout(function()
    {
          do_elsesomething("XX")
    },300);
    
    function do_elsesomething(e)
    {
          document.getElementById("token").value = do_something(e + document.getElementById("phrase").value + "XX")
    }
    

    由代码审计后可以得知:其中生成 token 的函数被放在了这个单独的js文件中,生成的方式是将 "XX" + phrase 变量的值 + "XX"字符串反转作为 token。

    那么这里的攻击方法就和 low 差不多,首先注入 “success” 之后抓包看看,现在的 token 是 “XXChangMeXX” 的反转:

    这里直接替换成“XXsuccessXX” 的反转“XXsseccusXX” 即可:

    high

    high和medium很相似,生成 token值 的逻辑在另外单独的 js 文件中。和medium不同的是,这里的 JS代码 是经过了混淆的,就显得很混乱,肯定不好看懂。
    访问http://127.0.0.1/bachang/dvwa/vulnerabilities/javascript/source/high.js,即可看到经过混淆的JS代码:

    那么这里就要用到JS解混淆的工具了。大家可以到这里github里下载项目:https://github.com/mindedsecurity/JStillery;也可以用基于这个JStillery的在线JS解混淆的工具:http://tool.yuanrenxue.com/deobfuscator。它所提供的功能是:把混淆后的JS代码转成我们可以看懂的JS代码。如图所示,我们复制混淆后的JS代码粘贴到框里,点击尝试解混淆,然后就成功了:

    解混淆后的JS代码如下:

    var a = [
        'fromCharCode',
        'toString',
        'replace',
        'BeJ',
        '\\w+',
        'Lyg',
        'SuR',
        '(w(){\'3M 3L\';q 1l=\'3K 3I 3J T\';q 1R=1c 2I===\'1n\';q Y=1R?2I:{};p(Y.3N){1R=1O}q 2L=!1R&&1c 2M===\'1n\';q 2o=!Y.2S&&1c 2d===\'1n\'&&2d.2Q&&2d.2Q.3S;p(2o){Y=3R}z p(2L){Y=2M}q 2G=!Y.3Q&&1c 2g===\'1n\'&&2g.X;q 2s=1c 2l===\'w\'&&2l.3P;q 1y=!Y.3H&&1c Z!==\'2T\';q m=\'3G\'.3z(\'\');q 2w=[-3y,3x,3v,3w];q U=[24,16,8,0];q K=[3A,3B,3F,3E,3D,3C,3T,3U,4d,4c,4b,49,4a,4e,4f,4j,4i,4h,3u,48,47,3Z,3Y,3X,3V,3W,40,41,46,45,43,42,4k,3f,38,36,39,37,34,33,2Y,31,2Z,35,3t,3n,3m,3l,3o,3p,3s,3r,3q,3k,3j,3d,3a,3c,3b,3e,3h,3g,3i,4g];q 1E=[\'1e\',\'27\',\'1G\',\'2R\'];q l=[];p(Y.2S||!1z.1K){1z.1K=w(1x){A 4C.Q.2U.1I(1x)===\'[1n 1z]\'}}p(1y&&(Y.50||!Z.1N)){Z.1N=w(1x){A 1c 1x===\'1n\'&&1x.1w&&1x.1w.1J===Z}}q 2m=w(1X,x){A w(s){A O N(x,1d).S(s)[1X]()}};q 2a=w(x){q P=2m(\'1e\',x);p(2o){P=2P(P,x)}P.1T=w(){A O N(x)};P.S=w(s){A P.1T().S(s)};1g(q i=0;i<1E.W;++i){q T=1E[i];P[T]=2m(T,x)}A P};q 2P=w(P,x){q 1S=2O("2N(\'1S\')");q 1Y=2O("2N(\'1w\').1Y");q 2n=x?\'1H\':\'1q\';q 2z=w(s){p(1c s===\'2p\'){A 1S.2x(2n).S(s,\'4S\').1G(\'1e\')}z{p(s===2q||s===2T){1u O 1t(1l)}z p(s.1J===Z){s=O 2r(s)}}p(1z.1K(s)||Z.1N(s)||s.1J===1Y){A 1S.2x(2n).S(O 1Y(s)).1G(\'1e\')}z{A P(s)}};A 2z};q 2k=w(1X,x){A w(G,s){A O 1P(G,x,1d).S(s)[1X]()}};q 2f=w(x){q P=2k(\'1e\',x);P.1T=w(G){A O 1P(G,x)};P.S=w(G,s){A P.1T(G).S(s)};1g(q i=0;i<1E.W;++i){q T=1E[i];P[T]=2k(T,x)}A P};w N(x,1v){p(1v){l[0]=l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0;k.l=l}z{k.l=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}p(x){k.C=4I;k.B=4H;k.E=4l;k.F=4U;k.J=4J;k.I=4K;k.H=4L;k.D=4T}z{k.C=4X;k.B=4W;k.E=4Y;k.F=4Z;k.J=4V;k.I=4O;k.H=4F;k.D=4s}k.1C=k.1A=k.L=k.2i=0;k.1U=k.1L=1O;k.2j=1d;k.x=x}N.Q.S=w(s){p(k.1U){A}q 2h,T=1c s;p(T!==\'2p\'){p(T===\'1n\'){p(s===2q){1u O 1t(1l)}z p(1y&&s.1J===Z){s=O 2r(s)}z p(!1z.1K(s)){p(!1y||!Z.1N(s)){1u O 1t(1l)}}}z{1u O 1t(1l)}2h=1d}q r,M=0,i,W=s.W,l=k.l;4t(M<W){p(k.1L){k.1L=1O;l[0]=k.1C;l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0}p(2h){1g(i=k.1A;M<W&&i<1k;++M){l[i>>2]|=s[M]<<U[i++&3]}}z{1g(i=k.1A;M<W&&i<1k;++M){r=s.1Q(M);p(r<R){l[i>>2]|=r<<U[i++&3]}z p(r<2v){l[i>>2]|=(2t|(r>>6))<<U[i++&3];l[i>>2]|=(R|(r&V))<<U[i++&3]}z p(r<2A||r>=2E){l[i>>2]|=(2D|(r>>12))<<U[i++&3];l[i>>2]|=(R|((r>>6)&V))<<U[i++&3];l[i>>2]|=(R|(r&V))<<U[i++&3]}z{r=2C+(((r&23)<<10)|(s.1Q(++M)&23));l[i>>2]|=(2X|(r>>18))<<U[i++&3];l[i>>2]|=(R|((r>>12)&V))<<U[i++&3];l[i>>2]|=(R|((r>>6)&V))<<U[i++&3];l[i>>2]|=(R|(r&V))<<U[i++&3]}}}k.2u=i;k.L+=i-k.1A;p(i>=1k){k.1C=l[16];k.1A=i-1k;k.1W();k.1L=1d}z{k.1A=i}}p(k.L>4r){k.2i+=k.L/2H<<0;k.L=k.L%2H}A k};N.Q.1s=w(){p(k.1U){A}k.1U=1d;q l=k.l,i=k.2u;l[16]=k.1C;l[i>>2]|=2w[i&3];k.1C=l[16];p(i>=4q){p(!k.1L){k.1W()}l[0]=k.1C;l[16]=l[1]=l[2]=l[3]=l[4]=l[5]=l[6]=l[7]=l[8]=l[9]=l[10]=l[11]=l[12]=l[13]=l[14]=l[15]=0}l[14]=k.2i<<3|k.L>>>29;l[15]=k.L<<3;k.1W()};N.Q.1W=w(){q a=k.C,b=k.B,c=k.E,d=k.F,e=k.J,f=k.I,g=k.H,h=k.D,l=k.l,j,1a,1b,1j,v,1f,1h,1B,1Z,1V,1D;1g(j=16;j<1k;++j){v=l[j-15];1a=((v>>>7)|(v<<25))^((v>>>18)|(v<<14))^(v>>>3);v=l[j-2];1b=((v>>>17)|(v<<15))^((v>>>19)|(v<<13))^(v>>>10);l[j]=l[j-16]+1a+l[j-7]+1b<<0}1D=b&c;1g(j=0;j<1k;j+=4){p(k.2j){p(k.x){1B=4m;v=l[0]-4n;h=v-4o<<0;d=v+4p<<0}z{1B=4v;v=l[0]-4w;h=v-4G<<0;d=v+4D<<0}k.2j=1O}z{1a=((a>>>2)|(a<<30))^((a>>>13)|(a<<19))^((a>>>22)|(a<<10));1b=((e>>>6)|(e<<26))^((e>>>11)|(e<<21))^((e>>>25)|(e<<7));1B=a&b;1j=1B^(a&c)^1D;1h=(e&f)^(~e&g);v=h+1b+1h+K[j]+l[j];1f=1a+1j;h=d+v<<0;d=v+1f<<0}1a=((d>>>2)|(d<<30))^((d>>>13)|(d<<19))^((d>>>22)|(d<<10));1b=((h>>>6)|(h<<26))^((h>>>11)|(h<<21))^((h>>>25)|(h<<7));1Z=d&a;1j=1Z^(d&b)^1B;1h=(h&e)^(~h&f);v=g+1b+1h+K[j+1]+l[j+1];1f=1a+1j;g=c+v<<0;c=v+1f<<0;1a=((c>>>2)|(c<<30))^((c>>>13)|(c<<19))^((c>>>22)|(c<<10));1b=((g>>>6)|(g<<26))^((g>>>11)|(g<<21))^((g>>>25)|(g<<7));1V=c&d;1j=1V^(c&a)^1Z;1h=(g&h)^(~g&e);v=f+1b+1h+K[j+2]+l[j+2];1f=1a+1j;f=b+v<<0;b=v+1f<<0;1a=((b>>>2)|(b<<30))^((b>>>13)|(b<<19))^((b>>>22)|(b<<10));1b=((f>>>6)|(f<<26))^((f>>>11)|(f<<21))^((f>>>25)|(f<<7));1D=b&c;1j=1D^(b&d)^1V;1h=(f&g)^(~f&h);v=e+1b+1h+K[j+3]+l[j+3];1f=1a+1j;e=a+v<<0;a=v+1f<<0}k.C=k.C+a<<0;k.B=k.B+b<<0;k.E=k.E+c<<0;k.F=k.F+d<<0;k.J=k.J+e<<0;k.I=k.I+f<<0;k.H=k.H+g<<0;k.D=k.D+h<<0};N.Q.1e=w(){k.1s();q C=k.C,B=k.B,E=k.E,F=k.F,J=k.J,I=k.I,H=k.H,D=k.D;q 1e=m[(C>>28)&o]+m[(C>>24)&o]+m[(C>>20)&o]+m[(C>>16)&o]+m[(C>>12)&o]+m[(C>>8)&o]+m[(C>>4)&o]+m[C&o]+m[(B>>28)&o]+m[(B>>24)&o]+m[(B>>20)&o]+m[(B>>16)&o]+m[(B>>12)&o]+m[(B>>8)&o]+m[(B>>4)&o]+m[B&o]+m[(E>>28)&o]+m[(E>>24)&o]+m[(E>>20)&o]+m[(E>>16)&o]+m[(E>>12)&o]+m[(E>>8)&o]+m[(E>>4)&o]+m[E&o]+m[(F>>28)&o]+m[(F>>24)&o]+m[(F>>20)&o]+m[(F>>16)&o]+m[(F>>12)&o]+m[(F>>8)&o]+m[(F>>4)&o]+m[F&o]+m[(J>>28)&o]+m[(J>>24)&o]+m[(J>>20)&o]+m[(J>>16)&o]+m[(J>>12)&o]+m[(J>>8)&o]+m[(J>>4)&o]+m[J&o]+m[(I>>28)&o]+m[(I>>24)&o]+m[(I>>20)&o]+m[(I>>16)&o]+m[(I>>12)&o]+m[(I>>8)&o]+m[(I>>4)&o]+m[I&o]+m[(H>>28)&o]+m[(H>>24)&o]+m[(H>>20)&o]+m[(H>>16)&o]+m[(H>>12)&o]+m[(H>>8)&o]+m[(H>>4)&o]+m[H&o];p(!k.x){1e+=m[(D>>28)&o]+m[(D>>24)&o]+m[(D>>20)&o]+m[(D>>16)&o]+m[(D>>12)&o]+m[(D>>8)&o]+m[(D>>4)&o]+m[D&o]}A 1e};N.Q.2U=N.Q.1e;N.Q.1G=w(){k.1s();q C=k.C,B=k.B,E=k.E,F=k.F,J=k.J,I=k.I,H=k.H,D=k.D;q 2b=[(C>>24)&u,(C>>16)&u,(C>>8)&u,C&u,(B>>24)&u,(B>>16)&u,(B>>8)&u,B&u,(E>>24)&u,(E>>16)&u,(E>>8)&u,E&u,(F>>24)&u,(F>>16)&u,(F>>8)&u,F&u,(J>>24)&u,(J>>16)&u,(J>>8)&u,J&u,(I>>24)&u,(I>>16)&u,(I>>8)&u,I&u,(H>>24)&u,(H>>16)&u,(H>>8)&u,H&u];p(!k.x){2b.4A((D>>24)&u,(D>>16)&u,(D>>8)&u,D&u)}A 2b};N.Q.27=N.Q.1G;N.Q.2R=w(){k.1s();q 1w=O Z(k.x?28:32);q 1i=O 4x(1w);1i.1p(0,k.C);1i.1p(4,k.B);1i.1p(8,k.E);1i.1p(12,k.F);1i.1p(16,k.J);1i.1p(20,k.I);1i.1p(24,k.H);p(!k.x){1i.1p(28,k.D)}A 1w};w 1P(G,x,1v){q i,T=1c G;p(T===\'2p\'){q L=[],W=G.W,M=0,r;1g(i=0;i<W;++i){r=G.1Q(i);p(r<R){L[M++]=r}z p(r<2v){L[M++]=(2t|(r>>6));L[M++]=(R|(r&V))}z p(r<2A||r>=2E){L[M++]=(2D|(r>>12));L[M++]=(R|((r>>6)&V));L[M++]=(R|(r&V))}z{r=2C+(((r&23)<<10)|(G.1Q(++i)&23));L[M++]=(2X|(r>>18));L[M++]=(R|((r>>12)&V));L[M++]=(R|((r>>6)&V));L[M++]=(R|(r&V))}}G=L}z{p(T===\'1n\'){p(G===2q){1u O 1t(1l)}z p(1y&&G.1J===Z){G=O 2r(G)}z p(!1z.1K(G)){p(!1y||!Z.1N(G)){1u O 1t(1l)}}}z{1u O 1t(1l)}}p(G.W>1k){G=(O N(x,1d)).S(G).27()}q 1F=[],2e=[];1g(i=0;i<1k;++i){q b=G[i]||0;1F[i]=4z^b;2e[i]=4y^b}N.1I(k,x,1v);k.S(2e);k.1F=1F;k.2c=1d;k.1v=1v}1P.Q=O N();1P.Q.1s=w(){N.Q.1s.1I(k);p(k.2c){k.2c=1O;q 2W=k.27();N.1I(k,k.x,k.1v);k.S(k.1F);k.S(2W);N.Q.1s.1I(k)}};q X=2a();X.1q=X;X.1H=2a(1d);X.1q.2V=2f();X.1H.2V=2f(1d);p(2G){2g.X=X}z{Y.1q=X.1q;Y.1H=X.1H;p(2s){2l(w(){A X})}}})();w 2y(e){1g(q t="",n=e.W-1;n>=0;n--)t+=e[n];A t}w 2J(t,y="4B"){1m.1o("1M").1r=1q(1m.1o("1M").1r+y)}w 2B(e="4E"){1m.1o("1M").1r=1q(e+1m.1o("1M").1r)}w 2K(a,b){1m.1o("1M").1r=2y(1m.1o("2F").1r)}1m.1o("2F").1r="";4u(w(){2B("4M")},4N);1m.1o("4P").4Q("4R",2J);2K("3O",44);',
        '||||||||||||||||||||this|blocks|HEX_CHARS||0x0F|if|var|code|message||0xFF|t1|function|is224||else|return|h1|h0|h7|h2|h3|key|h6|h5|h4||bytes|index|Sha256|new|method|prototype|0x80|update|type|SHIFT|0x3f|length|exports|root|ArrayBuffer|||||||||||s0|s1|typeof|true|hex|t2|for|ch|dataView|maj|64|ERROR|document|object|getElementById|setUint32|sha256|value|finalize|Error|throw|sharedMemory|buffer|obj|ARRAY_BUFFER|Array|start|ab|block|bc|OUTPUT_TYPES|oKeyPad|digest|sha224|call|constructor|isArray|hashed|token|isView|false|HmacSha256|charCodeAt|WINDOW|crypto|create|finalized|cd|hash|outputType|Buffer|da||||0x3ff||||array|||createMethod|arr|inner|process|iKeyPad|createHmacMethod|module|notString|hBytes|first|createHmacOutputMethod|define|createOutputMethod|algorithm|NODE_JS|string|null|Uint8Array|AMD|0xc0|lastByteIndex|0x800|EXTRA|createHash|do_something|nodeMethod|0xd800|token_part_2|0x10000|0xe0|0xe000|phrase|COMMON_JS|4294967296|window|token_part_3|token_part_1|WEB_WORKER|self|require|eval|nodeWrap|versions|arrayBuffer|JS_SHA256_NO_NODE_JS|undefined|toString|hmac|innerHash|0xf0|0xa2bfe8a1|0xc24b8b70||0xa81a664b||0x92722c85|0x81c2c92e|0xc76c51a3|0x53380d13|0x766a0abb|0x4d2c6dfc|0x650a7354|0x748f82ee|0x84c87814|0x78a5636f|0x682e6ff3|0x8cc70208|0x2e1b2138|0xa4506ceb|0x90befffa|0xbef9a3f7|0x5b9cca4f|0x4ed8aa4a|0x106aa070|0xf40e3585|0xd6990624|0x19a4c116|0x1e376c08|0x391c0cb3|0x34b0bcb5|0x2748774c|0xd192e819|0x0fc19dc6|32768|128|8388608|2147483648|split|0x428a2f98|0x71374491|0x59f111f1|0x3956c25b|0xe9b5dba5|0xb5c0fbcf|0123456789abcdef|JS_SHA256_NO_ARRAY_BUFFER|is|invalid|input|strict|use|JS_SHA256_NO_WINDOW|ABCD|amd|JS_SHA256_NO_COMMON_JS|global|node|0x923f82a4|0xab1c5ed5|0x983e5152|0xa831c66d|0x76f988da|0x5cb0a9dc|0x4a7484aa|0xb00327c8|0xbf597fc7|0x14292967|0x06ca6351||0xd5a79147|0xc6e00bf3|0x2de92c6f|0x240ca1cc|0x550c7dc3|0x72be5d74|0x243185be|0x12835b01|0xd807aa98|0x80deb1fe|0x9bdc06a7|0xc67178f2|0xefbe4786|0xe49b69c1|0xc19bf174|0x27b70a85|0x3070dd17|300032|1413257819|150054599|24177077|56|4294967295|0x5be0cd19|while|setTimeout|704751109|210244248|DataView|0x36|0x5c|push|ZZ|Object|143694565|YY|0x1f83d9ab|1521486534|0x367cd507|0xc1059ed8|0xffc00b31|0x68581511|0x64f98fa7|XX|300|0x9b05688c|send|addEventListener|click|utf8|0xbefa4fa4|0xf70e5939|0x510e527f|0xbb67ae85|0x6a09e667|0x3c6ef372|0xa54ff53a|JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW',
        'split'
    ];
    (function (c, d) {
        var e = function (f) {
            while (--f) {
                c['push'](c['shift']());
            }
        };
        e(++d);
    }(a, 500));
    var b = function (c, d) {
        c = c - 0;
        var e = a[c];
        return e;
    };
    eval(function (d, e, f, g, h, i) {
        h = function (j) {
            return (j < e ? '' : h(parseInt(j / e))) + ((j = j % e) > 35 ? String[b('0x0')](j + 29) : j[b('0x1')](36));
        };
        if (!''[b('0x2')](/^/, String)) {
            while (f--) {
                i[h(f)] = g[f] || h(f);
            }
            g = [function (k) {
                    if ('wpA' !== b('0x3')) {
                        return i[k];
                    } else {
                        while (f--) {
                            i[k(f)] = g[f] || k(f);
                        }
                        g = [function (l) {
                                return i[l];
                            }];
                        k = function () {
                            return b('0x4');
                        };
                        f = 1;
                    }
                }];
            h = function () {
                return b('0x4');
            };
            f = 1;
        }
        ;
        while (f--) {
            if (g[f]) {
                if (b('0x5') === b('0x6')) {
                    return i[h];
                } else {
                    d = d[b('0x2')](new RegExp('\\b' + h(f) + '\\b', 'g'), g[f]);
                }
            }
        }
        return d;
    }(b('0x7'), 62, 311, b('0x8')[b('0x9')]('|'), 0, {}));

    其中关键的部分是这里:

    这里生成 token 的步骤是:

    1、执行token_part_1("ABCD", 44)
    2、执行token_part_2("XX")(原本是延迟 300ms执行的那个)
    3、点击按钮的时候执行 token_part_3
    由于执行 token_part_2("XX") 有 300 毫秒延时,所以 token_part_1("ABCD", 44) 会被先执行,而 token_part_3() 则是和提交按钮的 click 事件一起执行。
    所以我们在输入框输入 success 后,再到控制台中输入token_part_1("ABCD", 44)token_part_2("XX")这两个函数就可以了,最后点击提交就执行 token_part_3()

    impossible

    页面显示:You can never trust the user and have to assume that any code sent to the user can be manipulated or bypassed and so there is no impossible level.
    其中的意思是:您永远不能信任用户,必须假设发送给用户的任何代码都可以被操纵或绕过,因此不存在不可能的级别。

    发新帖
    您需要登录后才可以回帖 登录 | 立即注册