目录
一、概述与核心概念
1.1什么是XSS
XSS全称Cross Site Scripting(跨站脚本攻击),为了与CSS区分而缩写为XSS。它是一种代码注入攻击,攻击者将恶意脚本注入到网页中,当其他用户浏览该网页时,恶意脚本在受害者浏览器中执行。
1.2为什么叫“跨站”
虽然攻击脚本来源于当前站点(同源),但攻击目标跨越了用户对“当前站点可信”的心理边界——用户以为在访问可信站点,实际执行了攻击者的恶意代码。
二、XSS三大类型
| 类型 | 存储位置 | 危险等级 |
|---|---|---|
| 反射型 | URL参数 | 诱导用户点击恶意链接 |
| 存储型 | 服务器数据库 | 访问含恶意数据的页面即触发 |
| DOM型 | URL(前端解析) | 前端DOM操作导致代码执行 |
2.1反射型XSS
原理:用户输入的数据被服务器直接拼接进HTML响应中返回,未做过滤或编码。攻击者将恶意参数构造在URL中,诱导受害者点击。
攻击流程:
1.攻击者构造恶意URL:http://target.com/search?q=
2.服务器将直接输出到页面
3.受害者点击链接,恶意脚本在浏览器中执行
2.1.1pikachu实战演示(GET反射型XSS)
打开皮卡丘靶场的XSS关卡,首先是这样的页面

我们尝试提交内容Celandine

发现输出的是Who is Celandie,i don't care!
打开网页开发者工具,发现网站是把我们的输入作为了一个变量放入句子"who is ___,i don't care!"里面,我们可以尝试进行XSS攻击了,尝试输入<script>alert(1)</script>

又发现输入20个长度内容后就无法输入了
我们审查一下元素,修改元素限制长度

将审查元素扩大至100,即将上图中的20修改为100长度。再次尝试输入<script>alert(1)</script>

弹窗1,说明反射型xss利用成功。
2.1.2pikachu实战演示反(POST反射型XSS)
打开靶场出现了一个登陆界面,在右上角拿到提示,登陆用户名为admin,密码为123456
登录之后显示如图

输入Celandine,回显who is Celandine,i don't care!

此时尝试攻击,输入<script>alert(1)</script>

弹窗回显1,xss攻击成功。
2.2存储型XSS
原理:恶意代码被持久化存储在服务器端(数据库、文件等),所有访问该页面的用户都会遭受攻击。
攻击流程:
1.攻击者在留言板提交包含恶意脚本的内容。
2.服务器将内容存入数据库
3.其他童虎访问留言板时,服务器从数据库中取出内容并输出
4.恶意脚本在所所有访问者浏览器中执行
2.2.1pikachu实战演示(存储型XSS)
打开靶场是一个留言板的界面,这个关卡是不允许进行sql注入的,我们尝试xss攻击。
输入攻击代码<script>alert(1)</script>,点击提交,这段恶意脚本就被注入到了数据库中,以后所有的用户浏览该网页时,浏览器都会从数据库中读取恶意代码并解析,那么用户的浏览器上就会执行该恶意脚本。
模拟被攻击者:先打开别的页面,再点击被攻击网站,触发弹窗1,说明恶意脚本执行了。

2.3DOM型XSS
DOM全称Document Object Model中文译为文档对象模型。HTML DOM树,可以理解为DOM为一个一个访问html的标准变成接口。

原理:纯前端漏洞,不涉及服务器端相应。恶意代码通过修改DOM环境导致有效载荷执行。
关键特征:没有向后端发送请求,攻击完全发生在客户端。通过document.write、innerHTML、eval等前端操作将恶意内容注入DOM
2.3.1pikachu实战演示
打开对应靶场,随机输入内容,查看网页源码

可以看到网页是把我们的输入当成了一个网址跟在href属性后面。现在有两种思路进行攻击。
1)第一种就是不闭合标签,利用javascript伪协议或者onlick事件执行命令。payload1:javascrip:alert(1)点击蓝色字体触发伪协议中的命令。

payload2:' onclick="alert(1)"点击蓝色字体执行命令。
2)第二种就是提前闭合a标签,使得我们的输入能被独立解析。payload:'"><img src="#" onmouseover="alert(1)">,利用onmouseover标签属性来触发代码,onmouserover就是将鼠标移动到这个上面。

三、xss盲打
xss盲打就是攻击网站后台管理系统,比如说有个提供建议的网站,当管理员想去查看这些建议时就要网站去请求服务器,然后服务器去数据库拿取这些建议输出到客户端浏览器中。
2.5XSS过滤
2.5.1标签与事件绕过
很多浏览器过滤了<script>,却忽略了其他标签。
- 利用其它标签
<img src=x onerror=alert(1)>
- 利用伪协议
<a href="javascript:alert(document.cookie)">点击</a>
2.5.2关键字绕过
大小写混淆、双写/多写过滤、利用注释
2.5.3JS环境中绕过
单引号被过滤,使用反引号`
eval被过滤,使用Function构造函数
2.5.4htmlspecialchars转义
在默认情况下hemlspecialchars()只转义这5个字符:
| 原始字符 | 转移后 | 说明 |
|---|---|---|
& |
& | |
" |
" | |
' |
默认不转义 | 需额外设置 |
< |
< | |
> |
> |
3.防御策略
这里重点讲一下httponly和csp
3.1HttpOnly
HttpOnly是Cookie的一个属性标志。设置了HttpOnly的Cookie,无法被JavaScipt的document.cookieAPI读取,只能通过HTTP请求自动携带。它只防御通过XSS窃取Cookie进行会话劫持。
3.2CSP(内容安全策略)
3.2.1CSP是什么
CSP(Content Security Policy)是一个HTTP响应头,它告诉浏览器哪些资源可以加载和执行,形成一个白名单机制。
3.2.2常用指令
| 指令 | 作用 |
|---|---|
script-src 'self' |
仅允许同源JS |
script-scr 'none' |
禁止所有JS |
script-src 'nonce-xxx' |
仅允许带指定的nonce的script标签 |
