XSS Challenges stage1-10闯关详解
文章目录
- XSS Challenges stage1-10闯关详解
0x01 xss challenges 闯关环境准备
1.XSS challenges介绍
xss challenges 和 sqli-labs 一样是一个闯关式的安全技术联系平台,它是由一个日本的安全研究员开发的
官方网址 https://xss-quiz.int21h.jp/
2.配置burpsuite 加载证书用于截断 HTTPS协议
首先打开burpsuite 开始监听:
使用插件配置火狐代理
浏览器访问 http://burp/创建证书
保存在本地
浏览器导入证书
选择导入的证书
0x02 手动挖掘XSS漏洞 Stage # 1-10 关
1.stage #1 无过滤的XSS注入
document.domain 该属性是一个只读的字符串,包含了再入当前文档的 web 服务器的主机名
首先测试一下页面的逻辑结构
搜索框中进行搜索信息,在页面下方会显示出搜索内容
按 F12 分析源码
我们输入的信息会被加载到页面中,我们加载的<script>alert(document.domain);</script>
F12 看一下它在代码中的位置
按F12 检查查看代码
确实插入在b标签中,正常来说我们这样已经注入成功了
1.1 使用闭合标签方式进行反射型 XSS 注入
他和我们学习 SQL 注入时很像,可以使用对应的闭合方式进行插入代码
b 标签的结构 <b>
文本信息 </b>
作用是加粗文本信息
我们搜索时使用</b>
对 b 标签进行闭合,在输入栏,输入
fengzilin</b><script>alert(document.domain);</script>
可以看到b标签成功闭合了,b标签后的JavaScript代码执行了
2.Stage #2 属性中的 XSS 注入
2.1 使用闭合的input标签方式进行注入
输入测试数据,查看信息
分析源码:
fengzilin的为位置是在input中的 value 属性中,我们注入payload的到value 代码中不会触发JavaScript脚本,所以我们要闭合value将js代码插入到属性外面
原代码:<input type="text" name="p1" size="50" value="fengzilin">
使用">
闭合标签并插入js代码,在输入框中输入代码
fengzilin"> <script>alert(document.domain)</script>
成功了
我们查看源代码
发现input标签被闭合了,然后执行了,js代码从而弹出弹框,会发现">并未被执行,当做普通文本信息打印出来了
2.2 在input标签属性中注入事件
事件是指:可以是HTML事件触发浏览器中的行为,比如说当用户点击某个HTML元素时启动一段JavaScript
1)onmouseover事件:当鼠标指针移动到元素之上时触发脚本
构造payload
" onmouseover=alert(document.domain)>
分析:
可以看到当鼠标移动到输入框的时候就会触发 XSS,所以事件就需要用户手动触发才能够被执行
3.Stage #3 选择列表中的 XSS 注入
查看页面结构,表框中输入 fengzilin
在表框中输入 fengzilin 会在下面提示内容和右侧的搜索区域
发现是在b标签中
我们输入测试代码,判断是否过滤
fengzilin</b><script>alert(document.domain)</alert>
输入发现没有弹框,查看代码发现<括号被转为实体符号了。
查看网页代码
HTML表单用于搜集不同类型的用户输入,我们输入的信息都是以表单的方式提交到服务器
Form表单
代码中定了一个文本输入为 p1 然后使用 select 元素创建了一个下拉列表为 p2
下面我们对选择的列表进行注入
我们在输入的时,使用burpsuite截取数据包对右侧选择列表进行注入
开始截取,在输入框中 输入fengzilin
抓取到的内容我们看到提交了2个参数p1和p2,p1是我们输入的内容,p2是下拉菜单的选线
将截取的数据包,进行篡改
将p2的字段值改为:
<script>alert(document.domain)</script>
点击发送会发现弹出了,弹框说明代码执行成功了
4.Stage #4 在隐藏域中注入 XSS
隐藏域是用来收集或发送不可见元素的信息,对于网页的访问者来说,隐藏域是看不见的,当表单提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上
4.1 查看隐藏域传递数值的效果
在输入框中输入fengzilin 然后提交
抓取的数据包
正常我们可以看到的提交的数据是 p1=fengzilin,p2=Japan,但是实际上还提交了一个p3=hackme
为什么需要将参数隐藏呢,原因很简单,这样可以避免在 URL 中传递参数,传递的参数用户不可见
Stage #4 和 Stage #3 的页面结构是一致的所有我们直接查看源代码
页面中存在一个 p3参数 type类型为 hidden,闭合方式为双引号,所以p3为隐藏参数
我们将之前用 burpsuite 进行截断数据包进行分析
p3 的值为 hackme 我们直接插入代码"><script>alert(document.domain)</script>
,这里必须使用 "> 闭合,这样XSS代码才会被执行
我们直接在截断的POST请求中修改p3参数然后点击放行
发现弹窗了
按F12 查看注入情况
5.Stage #5 限制输入长度的解决方法
地址:https://xss-quiz.int21h.jp/stage–5.php?sid=65c87b362d7102962568ce4c3059851b5d7da80f
输入测试代码 fengzilin 按F12查看页面源码
构造payload
"><script>alert(document.domain)</script>
代码中定了文本框。类型为 text,最多允许输入15个字符
我们修改input标签的属性 maxlength 修改为150 按回车确定·
成功弹出
6.Stage #6 限制输入 <> XSS的注入
https://xss-quiz.int21h.jp/stage-no6.php?sid=804e625275e00c53cb52d87d2046ebc50253e6c3
HTML 时间中常见的鼠标事件:
属性 | 值 | 描述 |
---|---|---|
onclick | script | 当单击鼠标时运行脚本 |
ondbclick | script | 当双击鼠标时运行脚本 |
ondrag | script | 当拖动元素时运行脚本 |
ondragend | script | 当拖动操作时结束运行脚本 |
ondragenter | script | 当元素被拖动至有效的拖放目标时运行脚本 |
ondragleave | script | 当元素离开有效拖放目标时运行脚本 |
ondragover | script | 当元素被拖动至有效拖放目标上方式运行脚本 |
ondragstart | script | 当拖动操作开始运行脚本 |
ondrop | script | 当被拖动元素正在被拖放时运行脚本 |
更多事件参考https://www.runoob.com/tags/ref-eventattributes.html
第一步:输入测试数据,寻找位置
第二步:构造payload
"><script>alert(document.domain)</script>
测试发现<>被转换为实体符号了,那就不能使用括号了,使用 " 引号来构造payload
123 " οnmοusemοve="alert(document.domain)"
成功弹出,当鼠标移到输入框就会触发payload
查看源码
7.Stage #7 限制输入引号的 XSS 注入
Stage #7地址:
https://xss-quiz.int21h.jp/stage07.php?sid=27d0401f027248136e0baa63dcb51b0dc152dd20
7和6的页面一样,我们输入同样的payload按F12 查看效果
123 " οnmοusemοve="alert(document.domain)"
在输入测试数据发现,数据做了处理,在传输数据发现单引号,会自动加入一个双引号
我们根据这个构造payload,我们使用空格对payload进行分割
123 οnmοuseοver=alert(document.domain)
成功弹出
查看源码
8.Stage #8 JavaScript伪协议
Stage #8 地址
https://xss-quiz.int21h.jp/stage008.php?sid=e919fe3fd372837a81b8d4dd90089d5f91c8bc4c
表单输入数据查看构造
测试数据发现,我们输入的地址都被转换为了 <a>
标签 并生成了跳转属性,我们结合 Stage #8 输入一个 URL 在页面中添加一个 URL,这样我们可以输入一个 JavaScript:伪协议用户点击链接直接调用 JavaScript 代码,触发XSS攻击
构造payload
javascript:alert(document.domain)
点击JavaScript才会触发XSS
9.Stage #9 UTF-7编码注入(跳过,不常用)
第Stage #9 https://xss-quiz.int21h.jp/stage_09.php?sid=9b2d9e4488cc52c31d589d6f94a045ce6f25be08
直接使用payload
οnclick="alert(document.domain)"
在 Hint 标签后面添加然后点击 Hint ,就会触发
10.Stage #10 绕过关键字domain
Stage #10 地址:
https://xss-quiz.int21h.jp/stage00010.php?sid=14b1749ba6ca454be3aae20a98594ee379ced0f6
输入测试数据
构造payload
1234"><script>alert(document.domain)</script>
发现domain 被替换了,我们尝试绕过进行注入
1234"><script>alert(document.domadomainin)</script>
成功
查看源码
编码绕过
我们可以使用 base64 编码进行绕过站点防护机制
alert(document.domain)
输入
1234"><script>YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ==</script>
没有执行成功
我们在 SQL 注入时服务器端已经配置了解密函数进行解密,我们这里页面中是不会对我们加密的字符串进行解密的,所以直接使用加密后的代码是不能够被执行的,我们需要使用解密函数对字符串进行解密再进行执行
我们修改 payload
fengzilin"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
atob()函数将 base64 加密后的字符串进行解密还原为 alert(document.domain)
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
还原成明文是:
fengzilin"><script>eval(alert(document.domain));</script>
开始输入:
fengzilin"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
成功
代码成功执行弹出域名信息