XSS简介

XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,意思就是说可以任意执行js代码,包括js的而已代码

如何进行payload的构造:

我们知道xss漏洞不会这么简单的被你发现,通常来说开发者都会对用户输入的东西进行过滤,比如简单的就是 将<script> <ifraname>还有< 等进行过滤,用户输入的时候就可以防止js命令随意的执行,但是我们知道这种方法并不是绝对安全的,我们可以通过其他标签来构造payload,在ctf比赛中非常喜欢考察。

事件过滤:

例如:

1
2
3
4
5
6
7
8
9
10
11
onbeforeprint
onbeforeunload
onerror
onhaschange
onload
onmessage
onoffline
ononline
onpagehide
onpageshow
onpopstate

一些常见的fuzz,我们在渗透测试中可以进行输入测试,对它进行fuzz测试

测试到没有进行过滤的事件,那么我们可以用来构造payload

1
<a href="javascript:alert('xss')">点</a>

敏感关键词(字符串过滤)

关键字过滤大部分是针对敏感变量或函数而进行的,如cookie、eval等,这部分的过滤可通过字符串拼接、编码解码等方法进行绕过。

字符串拼接与混淆

在Javascript中可以通过调用 数组来执行xss命令,比如

1
window['alert'](/xss/)

将base64转换为原来的,输出的那么就是 alert 了

编码解码

1
2
3
4
5
6
7
8
9
10
11
xss漏洞中常见的编码方式

HTML进制编码:十进制(a)、十六进制

css进制编码: 兼容HTML中的进制表现形式,十进制、十六进制

Javascript进制编码:八进制、十六进制、Unicode编、ASCII

url编码:%61(包含%什么的,我们常在url栏可以看到)

JSFUCK编码

过滤“.”

在Javascript中使用with 可以设置变量的作用域,利用此特征可以对“.”进行过滤

1
with(document)alert(cookie);

空格过滤

在标签可以使用 0x09、0x10、0x12、0x13、0x0a 等代替空格进行过滤

1
https://xxx.com/xss.php?text=<img0x09src=javascript:alert('xss')>

SVG标签

svg标签和语句遵循的规则是直接继承xml而不是html,区别在于svg内部的script标签中允许在部分进制或编码后的字符(比如实体编码)

字符串集编码导致绕过
当字符集编码存在问题时常常会导致一些出乎意料的绕过。