概述
全称:Cross-Site Scripting,简称“CSS”;取名XSS为了与CSS(层叠样式表)区分
本质:攻击者将恶意脚本注入到正常网页中,当用户访问该页面时,脚本在受害者浏览器内执行
注意:web漏洞,前端,攻击目标是访问网站的用户,不是网站服务器本身
原理:网站没有对用户输入的内容做足够过滤/转义,直接把用户可控数据输入到HTML页面里,受害者打开页面,浏览器分不清这段内容是正常代码还是恶意脚本,就会执行恶意JS
输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入
输出转义:根据输出点的位置对输出到前端的内容进行适当转义
常见危害:1.盗取用户Cookie、Session,劫持账号、页面操作 2.窃取页面敏感信息(手机号、卡号、密码) 3.伪造页面弹窗,欺骗用户输入账号密码(钓鱼) 4.诱导跳转至恶意网站 5.配合其他漏洞进一步内网渗透
目的:攻击者输入内容,被浏览器弹出弹窗,证明此处可以执行JS,存在XSS漏洞
反射型XSS(get)
定义:非持久型,恶意代码放在GET请求的URL参数中
原理:攻击者构造恶意URL,把payload放在GET参数里,把这个链接发给受害者,通过聊天、邮件、钓鱼等,服务器代码直接取出GET参数请求,q参数携带恶意脚本传给服务器,服务器不经转义拼到HTML页面中返回,受害者浏览器收到页面,解析标签,执行恶意JS
步骤:
1.F12打开查看器,定位到,发现最大长度只有20,修改为100
<input class="xssr_in" type="text" maxlength="20" name="message">
2.常用测试语句
<script>alert('123')</script>
3.输入语句到输入框,出现弹窗
知识:
一.URL→统一资源定位符,结构【协议://域名:端口/路径?查询参数#片段】
二.?q=xxx→GET查询参数;多个参数值用&隔开;可以直接写在URL出现在浏览器地址可复制转发
三.HTML脚本<script>开始/结束</>标签,目的告诉浏览器里面的内容是JavaScript代码,需要执行
四.alert(‘123’):JS内置函数,作用是浏览器弹出弹窗,显示内容123(显示内容可随意,无危害只证明)
反射型XSS(post)
定义:非持久型,恶意payload放在POST请求的表单参数里,提交表单后服务器读取,直接反射输出到页面,恶意代码不会存入数据库
原理:恶意代码不会出现在浏览器地址,不能直接把带payload的链接发给别人
两者比较:本质一样,服务器直接回显用户输入,只是传参方式不同
步骤:
1.输入暴力破解的账号密码admin/123456,Login
2.输入常用测试语句,出现弹窗
查看POST参数:
放在HTTP请求体(body)
一.浏览器
打开网页,按 F12(右键→检查)调出开发者工具,切换到 Network(网络)面板
勾选 Preserve log(保留日志),防止页面跳转后请求消失,在页面提交表单(输入 payload,点提交)
在网络列表找到Method 为 POST的那一条请求,点击它切换到 Payload(载荷) 标签:普通表单(
application/x-www-form-urlencoded):Form Data(表单数据)
二.抓包工具
Burp Suite:抓包代理,浏览器流量经过 Burp,可以直接查看 / 修改 POST 请求体,改 payload 测试 POST XSS
存储型XSS
定义:也叫持久型XSS,攻击者提交恶意payload,恶意脚本被保存到服务器的数据库/文件中。当其他用户访问该页面时,服务器从数据库读取恶意内容输出网页,浏览器执行JS,触发XSS
与反射型XSS比较:在服务端保存,不是一次性的,所有访问页面的用户都会中招,不需要钓鱼链接
场景:留言板、评论区、发帖论坛、个人签名、博客评论
步骤:
1.输入常用测试语句<script>alert('123')</script>
2.出现弹窗
辅助判断:查看页面源代码(F12),源码可以找到<script>alert('123')</script>存入数据库
DOM型XSS
定义:基于文档对象模型的XSS,整个过程恶意代码不会传给服务器,服务器返回正常页面。漏洞发生在浏览器前端,由JavaScript操作DOM时把可控数据插入页面,导致JS执行
步骤:
1.随便输入一串字符串456,在(F12)页面源代码可以发现,超链接标识
<a href="456"> what do you see? </a>
2.点开超链接,发现页面跳转404
3.直接在页面源代码进行注入(超链接标签改动),构造onclick(点击时触发),让XSS弹窗在点击超链接后面
<input id="text" name="text" type="text" value=""> 空白 <input id="button" type="button" value="click me!" οnclick="domxss()">
4.上面代码是提示,输入框输入
' οnclick=alert('123')>5.出现 '>what do you see? ,点击超链接出现弹窗
知识:
在XSS攻击事件处理器常用于触发恶意JS代码
①onclick(点击时触发)②onerror(加载失败时触发)③onmouseover(鼠标悬停时触发)
DOM型XSS-X
定义:DOM型XSS-X属于DOM型XSS的变种,其核心是把URL参数直接拼到<a href='用户可控数据'>里面
步骤:
1.输入框输入
' οnclick=alert('123')>2.点击文字,出现弹窗
两者对比
| 项目 | 普通 DOM XSS | DOM 型 XSS-X |
|---|---|---|
| 数据来源 | location.hash(#,不发给服务器) | location.search(?,GET 参数发给服务器) |
| 注入位置 | 页面文本内容 | a 标签 href 属性内 |
| 触发方式 | 页面加载完成自动执行 | 需要用户点击生成的链接 |
| Payload | <script>alert(1)</script> | javascript:alert(1)伪协议 |
XSS盲打
定义:属于特殊场景的存储型XSS,其特点是注入点和触发页面分开,前端提交完看不到弹窗,攻击者不知道payload有没有生效,等管理员去后台查看数据触发
步骤:
1.留言板输入恶意payload,大名随意
<script>alert('123')</script>
2.只提示谢谢参与,没有弹窗
3.最右边的提示信息中有后台地址,进入,有新提示信息登录账号和密码admin/123456
4.登录成功出现弹窗
知识:
盲打用alert只能管理员自己看到弹窗,攻击者拿不到信息,实战多用脚本把管理员Cookie发送到攻击者服务器,管理员一打开后台页面,Cookie自动发送到攻击者接收平台
XSS过滤
定义:输入层防御,服务器在接收用户提交的数据时,对输入内容进行检查、删除、替换等,试图阻止恶意payload提交到服务器
之前的<script>alert('123')</script>被过滤掉没有用了
可用示例(还有其他):
1.大小写绕过:<sCrIPT>alert(123)</ScRiPt>
2..事件绕过:过滤 script 标签,用<img src=x onerror=alert(123)>
都分别出现弹窗
知识:
输入过滤不能作为防御XSS的唯一手段,很容易被绕过,攻击者可以构造变形payload绕过正则过滤
正则过滤:正则表达式(Regular Expression)
XSS 过滤 和 输出转义 的区别
输入过滤:在接收用户输入的时候做,清洗危险内容;容易被绕过,是辅助防御
输出转义(HTML 实体编码):在数据输出到 HTML 页面时做,把
< > & " '转成实体;让浏览器把内容当成纯文本,从根源阻止浏览器解析标签,是最可靠的主防御方案
XSS之htmlspecialchars()
定义:htmlspecialchars()是PHP的函数,输出转义函数
作用:把HTML特殊字符转换成HTML实体编码,让浏览器只当成纯文本显示,不会解析成HTML标签
转换规则:&→&;// <→<;// >→>;// "→";// '→';
原始payload:<script>alert('123')</script>转义后
<script>alert(1)</script>
输入:'οnclick='alert(123)即可出现弹窗
利用单引号闭合原有的属性,注入新事件
XSS之href输入
定义:可控输入写入a标签href属性,通过JavaScrit:伪协议执行JS,,专门在链接属性中使用
输入:Javascript:alert(123)或者Javascript:alert(" '123' "),点击后出现弹窗
知识:alert函数只会弹出对话框,只显示字符串内容,不显示引号,如需应在外加一层
XSS之js输入
定义:用户可控数据,放到<script></script>标签内部
解释:'→闭合前面字符串,//→注释掉后面剩余引号
步骤:
1.根据提示输入tmac
2.右键查看页面源代码在923行之后可以看到有输入变化,利用此进行标签闭合
3.输入';javascript:alert(123)//出现弹窗
部分内容由AI辅助生成
个人观点仅供参考