Javascript中parseInt在XSS中的应用

来源:互联网 发布:百度竞价推广优化 编辑:程序博客网 时间:2024/06/06 03:39

XSS挑战赛第12题:http://prompt.ml/12,用了parseInt这个函数,感觉是一个很好玩的东西

原题:

function escape(input) {    // in Soviet Russia...    input = encodeURIComponent(input).replace(/'/g, '');    // table flips you!    input = input.replace(/prompt/g, 'alert');    // ノ┬─┬ノ ︵ ( \o°o)\    return '<script>' + input + '</script> ';}

先直接上答案吧:

eval(630038579..toString(30))(1)// 或Hexadecimal alternative (630038579 == 0x258da033):eval(0x258da033.toString(30))(1)

parseInt函数,介绍如下(http://www.w3school.com.cn/jsref/jsref_parseInt.asp):

定义和用法

parseInt() 函数可解析一个字符串,并返回一个整数。

语法

parseInt(string, radix)
参数描述string必需。要被解析的字符串。radix

可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

返回值

返回解析后的数字。

说明

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

提示和注释

注释:只有字符串中的第一个数字会被返回。

注释:开头和结尾的空格是允许的。

提示:如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN。

实例

在本例中,我们将使用 parseInt() 来解析不同的字符串:

parseInt("10");//返回 10parseInt("19",10);//返回 19 (10+9)parseInt("11",2);//返回 3 (2+1)parseInt("17",8);//返回 15 (8+7)parseInt("1f",16);//返回 31 (16+15)parseInt("010");//未定:返回 10 或 8

可以看到,此函数的功能是将一个String转换成对数值(可以是2-36进制),如上述实例。

如果待转换字符串中有大于该进制的字母,则只会将第一个大于该字母前的字符串转换,如:


在这题中,prompt最大的字母为t,0~9+A~T的话,表示的是30进制,因此构造POC如下:

eval(630038579..toString(30))(1)




0 0
原创粉丝点击