复现20字符短域名绕过以及xss相关知识点

本文详细介绍了HTML实体编码在XHTML和HTML中的应用,讨论了其在防止XSS攻击中的角色,以及在JavaScript、URL解析和不同元素中的行为差异,包括字符转义、Unicode编码和自动化工具实例。
摘要由CSDN通过智能技术生成

HTML实体编码介绍

在XHTML中,这些保留字符出现在标签里会立刻报错,但是HTML解析器太懒了,容错性大,并不会出现语法报错

要想安全的使用<,&,>,"等字符,就需要使用一套实体编码(entity encoding)的简单编码策略

这套HTML实体编码策略是以&符号开头,以;分号结尾的

在XML中只有少数几个这种编码,而在HTML中,存在数百个这种实体编码,并且常用的浏览器都支持这种用法

HTML编码有以下几种方式

HTML实体编码,格式 以&符号开头,以;分号结尾的

HTML实体编码参考手册 
<textarea name="" id="textarea" cols="30" rows="10">
    &lt;img src=&quot;localhost&quot;&gt;
  </textarea>

结果是:

<img src="localhost">

十进制的ASCLL编码,格式: 以符号&#开头,分号;结尾

ascll编码对照表

<textarea name="" id="textarea" cols="30" rows="10">
    &#60;&#105;mg src&#61;"localhost"&#62;
  </textarea>

结果是:

<img src="localhost">

Unicode字符编码,格式: 以符号&#开头,分号;结尾

另外,下面的unicode编码参考表的数字对应的是十六进制的,但是我们需要先转换为十进制再显示!

unicode编码参考
首先把0022转换为十进制是0034;003D转换为十进制是0061

  <textarea name="" id="textarea" cols="30" rows="10">
    <img src&#0061;&#0034;localhost&#0034;>
  </textarea>

结果是:

<img src="localhost">

十六进制的ascll码,格式: 以&#x开头,分号;结尾

参考上面的ascll表,但是注意需要先转换为十六进制。

<textarea name="" id="textarea" cols="30" rows="10">
    <img src&#x3D;&#x0022;localhost&#x0022;>
  </textarea>

结果是:

<img src="localhost">

最后综合几种写法看看

  <textarea name="" id="textarea" cols="30" rows="10">
    &lt;&#64;&#0033;&#x3c;&gt;
  </textarea>

最后在textarea中显示

<@!<>

也就是<被解析为"<“;&#64被解析为”@“;&#0033被解析为”!“;&#x3c被解析为”<“;>被解析为”>"

HTML实体编码使用

使用在标签的双引号内部 

HTML实体编码不可用于javascript

HTML实体编码的范围是HTML文档,不包括javscript执行环境,因为javascript执行环境的解析器不是HTML解析器!

接下来看个代码

document.write('&lt;img src=@ οnerrοr=alert(123) /&gt;') // <img src=@ οnerrοr=alert(123) />
console.log('&lt;img src=@ οnerrοr=alert(123) /&gt;') // &lt;img src=@ οnerrοr=alert(123) /&gt;
console.log('\<img src=@ οnerrοr=alert(123) \/\>') // <img src=@ οnerrοr=alert(123) />_
  1. document.write由于最后的字符串被输出到html页面,所以还是会被html实体解码为对应标签
    2. 由于只是在js环境中打印,所以最后没有进行html实体编码,字符串不变
    3. 由于js的自解码机制会对纯转义字符添加反斜号,所以最后被解析为没有反斜号的形式

URL解析

URL解析器也是一个状态机模型,从输入流中进来的字符可以引导URL解析器转换到不同的状态;
URL资源类型必须是ASCII字母,不然就会进入“无类型”状态。简单来说就是不可以将协议也写成编码;并且在URL编码过程中使用utf-8编码类型来编码每一个字符,如果尝试将URL连接做了其他编码类型的编码,URL解析器就不会正确识别。

JavaScript解析

JavaScript解析过程与HTML解析过程有点不一样。JavaScript语言是一门内容关于语言无关的语言。
像\uXXXX一样的字符被称作Unicode转义序列。可以将转义序列分为3个部分:分别是:

字符串中:当Unicode转义序列存在再字符串中的时候,他只会被解释为正规字符,而不是单引号,双引号等一些其他能够打破字符串上下文的字符。
标识符名称:他会被解码解释为标识符名称的一部分。

Unicode转义序列中也被允许用在表示符名称,被当做名称中的一个字符;但是将符号前置在Unicode转义序列串中不可以作为表示符名称中的字符。并且将Unicode转义序列串放在表示符名称中是非法的。

控制字符:例如单引号、双引号、括号等都不会被解释成控制字符,而被解码并解析为表示符名称或字符串常量。7

所以总结下来就是:Unicode转义序列只有在标识符名称里不会被当做字符串,而且争优在标识符名称里的编码字符能够被正常的解析。

从 XSS Payload 学习浏览器解码

(1)

<a href="%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29"></a>

这里采用URL编码的方式将javascript:alert(1)转成了上面的样子

(2)

<a href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:%61%6c%65%72%74%28%32%29">

先HTML解码在进行URL解码

<a href="javascript:alert(2)">

(3)

<a href="javascript%3aalert(3)"></a>

和之前的一样使用URL编码

(4)

<div>&#60;img src=x οnerrοr=alert(4)&#62;</div>

这里包含了HTML编码内容,反过来以开发者的角度思考,HTML编码就是为了显示这些特殊字符,而不干扰正常的DOM解析,所以这里面的内容不会变成一个img元素,也不会被执行.

(5)

<textarea>&#60;script&#62;alert(5)&#60;/script&#62;</textarea> 

<

是RCDATA元素(RCDATA elements),可以容纳文本和字符引用,注意不能容纳其他元素,HTML解码得到于是直接显示RCDATA元素(RCDATA elements)包括textarea和title,所以不会弹窗

(6)

<textarea><script>alert(6)</script></textarea>

和第五个一样,textarea和title里会有HTML解码操作,但不会有子元素,所以不会弹窗

(7)

<button onclick="confirm('7&#39;);">Button</button>

这里onclick中为标签的属性值(类比2中的href),会被HTML解码,得到

<button onclick="confirm('7');">Button</button>

在这里插入图片描述
(8)

<button onclick="confirm('8\u0027);">Button</button>

onclick中的值会交给JS处理,在JS中只有字符串和标识符能用Unicode表示,也不能编码符号,'显然不行,JS执行失败,所以不会弹窗

(9)

<script>&#97;&#108;&#101;&#114;&#116;&#40;&#57;&#41;</script>

script属于原始文本元素(Raw text elements),只可以容纳文本,注意没有字符引用,于是直接由JS处理,这里全部到作文本,,JS也认不出来,执行失败,所以不能弹窗
原始文本元素(Raw text elements)有

(10)

<script>\u0061\u006c\u0065\u0072\u0074(10);</script>

和上面第二个一样,函数名alert属于标识符,没有编码符号编码的字符,直接被JS执行,所以可以弹窗

(11)

<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0031\u0029</script>

在JS中只有字符串和标识符能用Unicode表示,这个编码了符号,JS执行失败,不能弹窗

(12)

<script>\u0061\u006c\u0065\u0072\u0074(\u0031\u0032)</script>

这里看似将没毛病,但是这里\u0031\u0032在解码的时候会被解码为字符串12,注意是字符串,不是数字,文字显然是需要引号的,JS执行失败

(13)

<script>alert('13\u0027)</script>

编码的 ‘ 是个符号,所以无法弹窗

(14)

<script>alert('14\u000a')</script>

\u000a在JavaScript里是换行,就是\n,虽然换行了,但是引号都在,没有被编码,能直接执行,所以可以弹窗

(15)

<a
href="&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3a;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x31;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x36;&#x33;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x36;&#x25;&#x33;&#x35;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x32;&#x25;&#x35;&#x63;&#x25;&#x37;&#x35;&#x25;&#x33;&#x30;&#x25;&#x33;&#x30;&#x25;&#x33;&#x37;&#x25;&#x33;&#x34;&#x28;&#x31;&#x35;&#x29;"></a>

先用HTML解码和URL解码

javascript:\u0061\u006c\u0065\u0072\u0074(15)

识别JS协议,然后由JS模块处理,解码得到

javascript:alert(15)

总结

<script>和<style>数据只能有文本,不会有HTML解码和URL解码操作

<textarea>和<title>里会有HTML解码操作,但不会有子元素

其他元素数据(如div)和元素属性数据(如href)中会有HTML解码操作

部分属性(如href)会有URL解码操作,但URL中的协议需为ASCII

JavaScript会对字符串和标识符Unicode解码

3.本机搭建galleryCMS的服务器

打开PHPstudy,将galleryCMS文件放入根文件下,并修改配置文件

在这里插入图片描述
打开数据库,添加数据库galleryCMS
在这里插入图片描述到浏览器刷新一下,进入galleryCMS网页

在这里插入图片描述我们在源码中把限制长度改成35
虽然xss-clean过滤了很多标签,但是他还没有过滤掉< svg >标签,所以我们使用< svg>标签进行一个测试。

在这里插入图片描述

在这里插入图片描述

发现我们添加成功,所以我们用svg标签来进行绕过,接下来就是解决字符的长短问题

在这里插入图片描述

我们能看到就这些已经29个字符了,所以我们只能通过修改域名长度,通过一个字符来代替三个字符,用来实现短域名绕过。

℠ expands to sm
㏛ expands to sr
st expands to st
㎭ expands to rad
℡ expands to tel
ff expands to ff

当我在kali上准备安装一下beef-xss的时候,安装的时候总是发生错误,我也试着尝试过使用apt-get update更新
在这里插入图片描述
但更新速度太太太太太太太慢了,然后我就放弃了。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值