基本概念
XSS是一种将恶意脚本注入到其他用户浏览的网页中的攻击方式
分类
- 反射型
-
-
非持久化攻击
-
典型场景
恶意URL:http://example.com/search?q=<script>alert(1)</script>
当用户点击该链接时,服务器返回的页面中包含未转义的搜索词,导致脚本执行
-
-
存储型
-
-
持久化攻击
-
恶意脚本被永久存储再目标服务器上
-
当其他用户访问包含该脚本的页面时触发
-
典型场景
攻击者在论坛评论区提交:
<script>stealCookie()</script>该评论被存入数据库,每当其他用户查看该评论页面时恶意脚本都会执行
-
-
Dom型
-
-
完全在客户端执行,不涉及服务器
-
恶意代码通过修改DOM环境在客户端执行
-
典型场景
// 漏洞代码
document.write(location.hash.substring(1));
// 攻击者构造的URL
http://example.com#<script>alert(1)</script>
-
|------|------------|------------|---------------|
| 特征 | 反射型XSS | DOM型XSS | 存储型XSS |
| 持久性 | 非持久 | 非持久 | 持久 |
| 触发方式 | 需要用户点击恶意链接 | 需要用户点击恶意链接 | 自动触发(访问被污染页面) |
| 存储位置 | 不存储 | 不存储 | 服务器存储 |
| 传播范围 | 单个用户 | 单个用户 | 所有访问用户 |
| 防御难度 | 较易防御 | 较难检测 | 危害最大,需重点防御 |
常见位置
- 会回显搜索内容的搜索框
- 会回显用户数据的输入字段
- 返回用户提供文本的错误消息
- 包含用户提供数据的隐藏字段
- 任何显示用户提供数据的页面
- HTTP头部信息
危害
- 直接会话威胁
- 身份冒用风险
- 恶意代码执行
- 增强钓鱼攻击可信性
- 商业与法律风险
攻击流程
- 反射型
识别漏洞位置,构造漏洞->诱导用户点击->网站未过滤,嵌入->恶意代码执行->数据 回传、利用
- Dom型
区别在于漏洞构造和客户端执行阶段 纯客户端,完全不接触服务器
//构造恶意URL(通常包含hash或参数):
http://vulnerable-site.com#<img src=x onerror=stealCookie()>
// 漏洞代码示例
document.getElementById('content').innerHTML =
location.hash.substring(1); // 不安全地插入hash内容
CrossSiteScriptingLesson1
靶场


把选项勾上就成功了
审计

就是简单的检验一下传入的checkboxAttack1这个是否为空
CrossSiteScriptingLesson5a
一个基础的反射型XSS
靶场

先找一下漏洞点,发现在第一个输入框

直接写入**<script>alert(1)</script>**就行
审计

这里利用XSS_PATTERN判断语句是否有XSS尝试,如field2没有,field1有,则成功返回
XSS_PATTERN的定义

这是一个大小写不敏感,严格匹配 <script>...</script> 结构以及只判断alert和console.log()两个特定函数的用于XSS过滤的正则表达式
CrossSiteScriptingLesson6a
由于DOM类型是纯客户端的,所以代码审计需要在前端里
先把涉及到的代码找到



完整的攻击链:URL参数 → testRoute → testHandler → showTestParam → innerHTML

后端仅检查格式start.mvc#test/,不检查内容

通过
DOMCrossSiteScriptingVerifier
审计

重点看这个已经给出的函数,
发送POST请求到指定端点"CrossSiteScripting/phone-home-xss"
,携带固定此参数和特殊请求头,收到响应后在控制台输出结果··

"CrossSiteScripting/phone-home-xss"用于生成随机数

这里是对随机数的匹配判断
靶场

访问
http://127.0.0.1:8080/WebGoat/start.mvc#test/%3Cscript%3Ewebgoat.customjs.phoneHome%28%29%3C%2Fscript%3E
之后可以在控制台看到随机数,输入即可