前端工程师们注意啦,尤其是做网站安全的工程师。想必XSS都耳熟能详了吧,即使不知道这具体是什么,也听过它,它可是和DDoS齐名的攻击手段。
What do you know about non-alphanumeric XSS?
一、是什么
非字母数字JS,顾名思义,就是不包含字母或者数字的JavaScript。那除了字母和数字的字符还有些什么呢?
这里拿(“索引非字母数字字符Indexing non-alphanumeric characters”)中的概念来说:
二、现成的工具
那这些字符在 JavaScript 能工作吗?是如何工作的呢?
阿根廷的程序员Patricio Palladino 发布过一款工具,可以将JavaScript 代码转为 ()[]{}!+ 字符。
网站地址:
http://patriciopalladino.com/files/hieroglyphy/
将转化为 String 的代码复制在浏览器控制台:
三、工作原理
这里只是给出其中的一种实现方式,实现的方法有很多种
0 | "+[]", |
---|---|
1 | "+!![]", |
2 | "!+[]+!![]", |
3 | "!+[]+!![]+!![]", |
4 | "!+[]+!![]+!![]+!![]", |
5 | "!+[]+!![]+!![]+!![]+!![]", |
6 | "!+[]+!![]+!![]+!![]+!![]+!![]", |
7 | "!+[]+!![]+!![]+!![]+!![]+!![]+!![]", |
8 | "!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]", |
9 | "!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]" |
2. 关键字
_object_Object = "[]+{}"; |
---|
_NaN = "+{}+[]"; |
_true = "!![]+[]"; |
_false = "![]+[]"; |
_undefined = "[][[]]+[]"; |
3. 字母
characters[" "] = "(" + _object_Object + ")[" + numbers[7] + "]"; |
---|
characters["["] = "(" + _object_Object + ")[" + numbers[0] + "]"; |
characters["]"] = "(" + _object_Object + ")[" + characters[1] + "+" + |
characters[4] + "]"; |
characters["a"] = "(" + _NaN + ")[" + numbers[1] + "]"; |
characters["b"] = "(" + _object_Object + ")[" + numbers[2] + "]"; |
characters["c"] = "(" + _object_Object + ")[" + numbers[5] + "]"; |
characters["d"] = "(" + _undefined + ")[" + numbers[2] + "]"; |
characters["e"] = "(" + _undefined + ")[" + numbers[3] + "]"; |
(想了解更多的可以在GitHub上查找,或者直接联系我)
根据上面的对照表就可以实现自己想要的字符串了。