渗透测试靶场PortSwiggerLabs-xss(1-10)lab详解
Lab 1:将 XSS 反射到未编码的 HTML 上下文中
输入字符显示在页面上
<h1>test</h1>
对于 html 标签没有编码,可执行
插入弹窗<script>alert(1)</script>
Lab 2:将 XSS 存储到 HTML 上下文中,无需任何编码
这关室存储型 xss,将 script 代码插入到数据库中,常见留言板功能
这样每次访问留言板都会弹窗
Lab 3:document.write使用源的接收器中的 DOM XSS location.search
当我们输入 相关字符搜索时,请求 urlhttps://0ac800bb03d854e5805403a5005900d2.web-security-academy.net/?search=bucket
,search 传参
图中 javascript 代码定义query
,通过window.location.search
定位到?search=bucket
通过get('search')
拿到我们输入的bucket
,传递给query
,即 query=bucket
之后通过 trackSearch(query)
方法,定义了document.write()
在页面写入一个img 标签
同时请求一个链接,链接中拼接了query
,就是我们输入的字符
当我们插入world" onload="alert(1)
时触发弹窗
Lab 4:innerHTML使用源的接收器中的 DOM XSSlocation.search
当我们输入查询字符,值被赋给 query,然后执行doSearchQuery方法,将query的值通过innerHTML将参数值 query 插入到ID为 searchMessage 的HTML元素中
插入<img src=# onerror=alert(1)>
Lab 5:使用源在 jQuery 锚点href属性接收器中进行 DOM XSSlocation.search
$(function() { ... })
表示 dom 加载完后自动执行内部函数
$('#backlink').attr("href",...)
表示选中 ID 为 backlink的元素,并修改 href属性
于是点击 back 按钮就会访问网站根目录href="/"
于是我们直接输入javascript:alert(1)
,点击 back 按钮即可执行 javascript
也可直接输入一个网址,点击即可跳转
Lab 6:使用 hashchange 事件在 jQuery 选择器接收器中引发 DOM XSS
这段代码是一个基于jQuery的哈希变化监听器,用于在URL的哈希部分(#后面的内容)发生变化时,自动滚动页面到匹配的博客标题位置
但是当我们刷新页面时他不会再滚动,因为逻辑是当哈希发生变化时才执行视图滚动
window.location.hash.slice(1)
:获取哈希值并去掉开头的 #(例如 #标题1 → 标题1)。
decodeURIComponent
:对哈希值解码,处理可能被编码的特殊字符(如中文或空格)。
$('section.blog-list h2:contains(...)')
:在 section.blog-list 容器中查找 <h2>
标题内容包含解码后哈希值的元素
在利用时需要考虑如何让#后的数据发生变化,利用到
this.src+=
<iframe src="https://0a4600e8046d180080a08af4002b00f0.web-security-academy.net/#" onload="this.src+='<img src=# onerror=print()>'"></iframe>
这样会先请求https://0a4600e8046d180080a08af4002b00f0.web-security-academy.net/#
然后再请求 https://0a4600e8046d180080a08af4002b00f0.web-security-academy.net/#<img src=# onerror=print()>
,就会执行我们的 javascript 代码
Lab 7:将反射式 XSS 注入带有尖括号的 HTML 编码属性
注入" onmouseover="alert(1)
进行拼接,鼠标移动即可执行弹窗
Lab 8:存储型 XSS 到href带有双引号 HTML 编码的锚点属性中
测试留言板的位置,可以看到我输入的网址http://abc.com
,这里是要求输入作者的名字和一个网址
点击作者名字即可跳转网址
插入javascript:alert(1)
点击即可弹窗
Lab 9:将反射式 XSS 注入带有尖括号 HTML 编码的 JavaScript 字符串
输入的 script 标签被 HTML编码
使用';alert();'
绕过,将;
替换为+``*``-``/
都可以
Lab 10:在select 元素中document.write使用源的 DOM XSSlocation.search
进来以后有个点击切换商店的功能,我们看下实现逻辑
var store = (new URLSearchParams(window.location.search)).get('storeId');
用来在 url 中查找参数,找到storeId
的值赋给store
document.write('<select name="storeId">')
会在脚本执行位置插入一个<select>
标签,用于表单提交时标识该字段(如提交到服务器时参数名为storeId)
如果存在store
,就自动给下拉框加个选项
if(store) {document.write('<option selected>'+store+'</option>');
}
这段是便利商店列表,如果输入的 storeId
在商店列表就回到循环开始,如果不存在, 则添加到下拉列表
最后document.write('</select>');
闭合下拉框
for(var i=0;i<stores.length;i++) {if(stores[i] === store) {continue;}document.write('<option>'+stores[i]+'</option>');
}
此时我们已经知道我们可以控制的参数是storeId
,直接输入<script>alert()</script>
直接执行了 javascript