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
&#x11;(解码中文,乱码=>�) =>我 \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>
  • 2号:href中的r进行HTML编码; HTML页面解析r为r,破坏了HTML文档的DOM树格式,不认为href是一个超链接属性,即a标签失效; HTML编码破坏了<a>标签DOM树结构中的href属性;
    • HTML解析: 2号:<a href=“javascript:alert(1)”>href中的r进行编码 破坏了DOM树结构,但是还是会正常解析,认为是文本格式;
    • URL解析: 2号:<a href=“javascript:alert(1)”>href中的r进行编码
    • JavaScript解析: 2号:<a href="javascript:alert(1)">href中的r进行编码
  • 3号:JavaScript中的r进行编码; 正常访问,正常绕过;
    • 3号:<a href="javascript:alert(1)">javascript中的r进行编码
  • 4号:alert(1)中的r进行编码; 正常让问,正常绕过;
    • 4号:<a href="javascript:alert(1)">alert(1)中的r进行编码
编号 <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解析器识别不了,致使解析成为一个文本格式;
  • 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无法生效;
  • 5号
    • 5号对JavaScript代码中的控制字符进行了编码,导致解析失败;
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:ale&#114;t(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>标签

特别注意:

    1. 混淆解码需要注意页面解析顺序HTML<URL<JavaScript;
    2. 混淆加密顺序为JavaScript<URL<HTML
    3. 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_伪协议与编码绕过相关推荐

  1. WEB攻防-通用漏洞文件包含LFIRFI伪协议编码算法代码审计

    目录 知识概要 1.解释 2.实现漏洞的三种方式 3.本地包含LFI&远程包含RFI-区别 4.各类脚本语言包含代码写法 思路点 黑盒发现 白盒发现 CTF案例演示 CTF-78-php&am ...

  2. php伪协议读取目录,PHP文件包含,文件读取的利用思路,以及配合伪协议的trick...

    PHP的文件包含函数有两类,分三种:1 2file_get_contents() include()/include_once() require/require_once() 第一种用于获取文件的数 ...

  3. [羊城杯2020]easyphp --- 伪协议的使用时机,---python上传.htaccess的利用 -- preg_match绕过

    目录: 一. 自己做: 二.学到的.不足: 三. 1. 利用.htaccess来设置文件自动包含 2. 绕过 \n 的过滤 3. 绕过stristr的过滤. 4. 绕过preg_match 2.思路二 ...

  4. 使用data伪协议绕过圆括号、反引号被过滤

    文章目录 data协议常用数据格式 不使用编码的方式绕过圆括号过滤 data协议常用数据格式 不使用编码的方式绕过圆括号过滤 环境是https://xss.haozi.me/#/0x04 ,其中代码过 ...

  5. 【甄选靶场】Vulnhub百个项目渗透——项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析)

    Vulnhub百个项目渗透 Vulnhub百个项目渗透--项目十八:pwnlab_init(LFI本地文件包含,PHP伪协议,文件上传绕过,逆向分析) 靶场地址

  6. base64 转文件_PHP伪协议与文件包含

    PHP伪协议与文件包含 PHP伪协议与文件包含 php:// 协议 php://input php://filter data:// 协议 file:// 协议 zip://.bzip2://.zli ...

  7. php伪协议xss,XSS漏洞学习

    XSS漏洞的原理 XSS漏洞是发生在目标网站中目标用户的浏览层面上,当用户浏览器渲染整个HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就会发生. XSS漏洞的危害 获取用户或者管理员的 ...

  8. LFI(本地文件包含)、RFI(远程文件包含)、PHP封装协议(伪协议)安全问题学习

    友情链接:https://www.cnblogs.com/LittleHann/p/3665062.html 目录 一.文件包含的基本概念 1.要想成功利用文件包含漏洞,需要满足下面的条件 (1)in ...

  9. 第十天文件包含漏洞 php伪协议

    文件包含漏洞 PHP中常见包含文件函数 常见文件包含漏洞代码 文件包含漏洞的危害 伪协议 php使用input读取post请求体的内容 Data:// 数据 Zlib:// 压缩流 文件包含的漏洞的分 ...

  10. xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程)

    xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程) 注:本文通过研究各种情况下实体编码和JS编码是否生效,进而总结了哪些情况下能够进行编码后,javascript代码依然能够正常执行. 解 ...

最新文章

  1. 15张图来了解【树】,面试再也不怕被刷了
  2. linux+传输文件时卡住,linux - rsync 同步文件时卡住不动
  3. Android即时通讯与IOS端发送语音的问题。
  4. php 递归实现无限极分类和排序_PHP无限级分类实现层级值间用字符串拼接
  5. 杭电ACM刷题(1):1002,A + B Problem II
  6. 基于Arduino开发的简易“高水位报警系统解决方案”
  7. python socket监听端口_Python 用socket模块实现检测端口和检测web服务
  8. (转)CString工作原理和常见问题分析
  9. Code Forces 448C Painting Fence 贪婪的递归
  10. mysql 5.6一主两从_Centos7 下配置mysql5.6主从复制实例(一主两从)
  11. java课程设计仓库管理系统_Java课程设计-仓库管理系统
  12. matlab 粒子群应用,粒子群算法程序应用
  13. mac如果装win系统运行,虚拟机好还是双系统好?
  14. NetBeans IDE教程
  15. 纵横捭阖 《鬼谷子》
  16. OPPO系统推送SDK集成踩坑思路
  17. win7无线网显示小太阳
  18. lamp分离部署+phpmyadmian
  19. 怎么批量给图片加纯色边框?
  20. 步进电机的使用方法和控制方式基本介绍

热门文章

  1. debian-nagios3.2,linux+apache+mysql+php
  2. 深入理解HTTP消息头
  3. 易到起死回生的背后,谁在指点江山?
  4. redhat7.3-samba服务器配置
  5. 由DispatcherServlet看spring mvc请求处理过程
  6. Beyond Compare怎么查看合并文本后相同内容
  7. nginx 1.8.0下载
  8. Nginx安全配置标准(for proxy)
  9. ecplise反编译插件
  10. 北航计算机组成重修,北航计算机组成原理123希望大伙把作业上传.pdf