文章目录
XSS(跨站脚本)概述
1.反射型xss(get)
2.反射型xss(post)
3.存储型XSS
4.DOM型xss
5.DOM型XSS-X
6.xss之盲打
7.xss之过滤
8.xss之htmlspecialchars
9.xss之href输出
10.xss之js输出
XSS(跨站脚本)概述
Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
1.反射性XSS;
2.存储型XSS;
3.DOM型XSS;
XSS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。
因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;
输出转义:根据输出点的位置对输出到前端的内容进行适当转义;
1.反射型xss(get)
构造payload
<script>alert('xss')</script>
我们发现输入完('xss')就不能输入了,明显超过长度限制的
我们此处F12,选择这个输入框 ,将最大长度改为100,我们就可以正常输入内容了
2.反射型xss(post)
我们发现一个登录框,我们在暴力破解那一关,获取到了管理员账号和密码,即
账号:admin
密码:123456
如果没做暴力破解我们也可以点一下提示看一下
输入账号密码后来到输入框,依旧输入我们的payload
<script>alert('xss')</script>
可能有人会疑惑,这一关和上一关不是一样吗,不是这样的哦
3.存储型XSS
我们先看一下post和get请求的区别
数据传输方式:
GET请求:数据通过URL中的查询参数附加在URL后面,以明文形式传输数据。
POST请求:数据作为请求的正文发送,而不是通过URL传递。
数据长度限制:
GET请求:有长度限制,受浏览器和服务器对URL长度的限制。
POST请求:没有固定的长度限制,适合传输大量数据。
数据安全性:
GET请求:数据以明文形式暴露在URL中,容易被窃听和拦截。
POST请求:数据在请求正文中传输,并可以使用加密协议(如HTTPS)进行传输,相对更安全。
数据缓存:
GET请求:可以被浏览器缓存,可以提高性能。
POST请求:通常不被浏览器缓存。
仔细观察就会发现,get型的那一关,我们输入的payload在url中有显示,而post则没有显示
payload
<script>alert('xss')</script>
提交时,会有xss弹窗
并且当我们切换页面,再切换回来时,也会有xss弹窗,这说明我们的数据被存储起来了,也就是存储型的xss
4.DOM型xss
首先我们先看下什么是DOM,简单来说就是
DOM是一种用于表示和操作HTML、XML等文档结构的编程接口,通过它可以使用代码来访问、修改和操作Web页面的内容和结构。
回到题目,我们先随便输入一串内容,F12检查一下,顺找我们输入的语句
找到我们输入的内容,我们就要想办法构造payload了,首先我们需要先闭合我们的语句,然后构造一个onclick。
这里我本来以为是双引号闭合,构造出来不对查看源代码发现,外面还有一个单引号
所以我们的payload应该是
' οnclick=alert('xss')>
闭合后语句为
<a href='' οnclick=alert(‘xss’)>'>what do you see?</a>
5.DOM型XSS-X
payload和上一关一样
' οnclick=alert('xss')>
和上一关唯一的区别就是,这一关是从url中获取我们提交的参数,体现的题目上就是我们多点了一下
因为dom型都是前端操作,比较鸡肋,这里就不多说了
6.xss之盲打
这一关是什么意思呢,盲打也就是我们在前端并不能看到我们的代码,无法判断xss是否成功,只有在后台才能看到
我们构造payload
<script>alert('xss')</script>
根据提示登录后台地址
成功弹窗俩次,发现俩个框都存在xss漏洞。
7.xss之过滤
首先试下我们之前的payload
<script>alert('xss')</script>
我们提交后发现只有'>'了
发现<script>标签被过滤,采用其他方法绕过
构造payload
<a href="" οnclick="alert('xss')">
成功绕过弹窗
8.xss之htmlspecialchars
试下我们之前的payload
<script>alert('xss')</script>
没有效果,查看源码
尝试使用a标签
Payload
' οnclick='alert("xss")
闭合后的语句为
<a href='' οnclick='alert("xss")'>
成功弹窗
9.xss之href输出
还是先试下我们之前的payload
<script>alert('xss')</script>
没有效果,查看源码
尝试使用a标签
' οnclick='alert("xss")
依旧没效果
检查源代码发现左右尖括号和单双引号都被html编码了
使用jsp代码
Payload
javascript:alert(1)
成功弹窗
10.xss之js输出
依旧试下之前的payload
<scirpt>alert('xss')</script>
没有反应,我们查看源代码发现,<script>标签对应关系有问题,那么我们只需要闭合掉第一个<script>就可以了
</script><script>alert('xss')</script>
成功弹窗