web安全之XSS基础-常见编码科普

0x01常用编码

html实体编码(10进制与16进制):

如把尖括号编码[ < ]  -----> html十进制: <  html十六进制:<

javascript的八进制跟十六进制:

如把尖括号编码[ < ]  -----> js八进制:\74  js十六进制:\x3c

jsunicode编码:

如把尖括号编码[ < ]  ----->jsunicode:\u003c

url编码 base64编码:

如把尖括号编码[ < ]  -----> url: %22  base64: Ig==

0x02 html实体编码

html实体编码本身存在的意义是防止与HTML本身语义标记的冲突。

但是在XSS中却成为了我们的一大利器,但是也不能盲目的使用!

html中正常情况只识别:html10进制,html16进制!

现在介绍一下我们应该如何在xss过程中灵活的使用各种编码呢?

比如现在你的输出点在这:

<img src="[代码]">

在这里过滤了script  < > / \ http: 以及各种危险字符 比如创建一个html节点什么的!

有的站只允许你引用一个img文件夹里的图片 但是图片是你可以控的 可以通过抓包来修改的!

我们如果想加载外部js 或者一个xss平台的钩子我们应该怎么写呢?

那么我们可以在这里 闭合双引号 写事件:

onerror=[html language="实体编码"][/html][/html]

比如我现在弹个窗:

<img src="x" onerror="alert(1)">

原code:

<img src="x" onerror="alert(1)">

这里我用的是html十进制编码 也可以使用十六进制的html实体编码!

但是为什么这里我没有用jsunicode 以及 js八进制跟js十六进制呢!

浏览器是不会在html标签里解析js中的那些编码的!所以我们在onerror=后面放js中的编码是不会解析 你放进去是什么 解析就是什么!

大多数网站是不会&#号的,如果过滤了怎么办呢?

那么再来讲一下另外一个案例:

页面中的Go按钮中包含一个a标签 输入的值会存在于a标签的href属性中,href中用了javascript伪协议,可以在href跳转时执行js代码!

所以造成了xss!

我们提交的值如下:

%26%23x27,alert(1)%2b%26%23x27

由于页面对单引号 & 符号 以及 #符号过滤!但是html中可以识别html实体编码!但是实体编码是由&#组成!

这个时候&#已经被过滤 我们只能通过url编码来对 & # 两个符号进行编码!再让浏览器解码成 &# 然后拼接x27 最后就成为了单引号的html16进制编码!

解码后:我们的提交值为:

‘,alert(1)‘

href代码为:

<a href="javascript:location=‘./3.3.php?offset=‘+document.getElementById(‘pagenum‘).value+‘&searchtype_yjbg=yjjg&searchvalue_yjbg=‘">GO</a><a href="javascript:location=‘./3.3.php?offset=‘+document.getElementById(‘pagenum‘).value+‘&searchtype_yjbg=yjjg&searchvalue_yjbg=‘">GO</a>

ps:在之前说了html标签中识别html实体编码,并且会在html页面加载时会对编码进行解码!那么&#x27 已经是单引号了 但是并不会闭合! 然后在点击过程中执行javascript代码 这个时候由于html里&#x27被解析成单引号但是没闭合 这个时候js被执行 这个我们提交的在html加载时解析成了字符串单引号但是不能闭合之前的引号 因为现在是把我们提交的编码了的单引号 当成字符串来显示 但是现在他是存在于a标签中的href里的 href链接里的地址是javascript伪协议,我们现在点击的时候 会执行里面的代码 关键来了 这个时候我们之前被当做字符串的单引号 被再次解析 这个时候就没任何过滤规则来过滤它 程序也没那么智能 之前当做字符串的单引号起作用了 javascript不知道他是个字符串 它只知道浏览器解析成了什么 他就带入进去!就在这个时候我们的字符串单引号就成功的闭合了!当点击go时 我们的代码执行!



上面这个例子讲了html编码 以及特殊情况下的编码那么再讲下当你的输入点存在于script标签中的时候!我们就应该用js中的编码了!

既然知道是如何解析的了 那么便又有了以下新的想法!

0x03 新增的实体编码与浏览器的工作原理

通常程序做 XSS 防御的时候会考虑到一些 HTML 编码的问题,会拦截或转义 " \ 这样的东西 那么我的双引号跟尖括号就被拦截了!

但基础这种黑名单方式可能出现的问题:

1. 不认识 HTML5 新增的实体命名编码,

&colon; => [冒号]

&NewLine; => [换行]

case: <a href="javasc&NewLine;ript&colon;alert(1)">click</a>

2.对 HTML 编码的解析规则不够熟悉,就像十进制和十六进制编码的分号是可以去掉的。

还有,数字编码前面加「0」,这也是一条很好的绕过 WAF 的向量。

数字前面是可以加多个0的

<a href="javasc&NewLine;ript&colon;alert(1)">click</a>

这句代码能够执行么?

不知道那些不是很清楚浏览器工作原理的朋友,在最开始有没有怀疑这段代码能不能执行!

起码我最开始 怀疑过!即使编码被解析回来了 换行了还能执行么!

解析器-词法分析器Parser-Lexer combination

解析可以分为两个子过程——语法分析及词法分析

词法分析就是将输入分解为符号,符号是语言的词汇表——基本有效单元的集合。对于人类语言来说,它相当于我们字典中出现的所有单词。

语法分析指对语言应用语法规则。

解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。

然后我的理解是这样的:

<a href="javasc&NewLine;ript&colon;alert(1)">click</a>

首先html编码被还原出来 然后就成了换行 跟冒号

<a href="javasc

ript:alert(1)">click</a>

为什么换行后还能够执行 是因为浏览器中的解析器中词法分析器 起的作用会跳过空白跟换行之类的无效字符。

然后就构造成了一个完整的语句

<a href="javascript:alert(1)">click</a>

代码执行!

看完那些之后瞬间心里觉得原来跟原理性相关的东西真的很重要!能够让你写 xss payload更加灵活!

0x04 javascript编码

javascript中只识别几种编码:Jsunicode js8进制 js10进制

就拿下面这个例子来讲吧!

第一种情况 你输入的值存入某个变量 然后最后出现在某个能把字符串当做js代码来执行的函数里!

如:

eval()  setTimeout()   setInterval()

以上都是会将字符串当做js代码执行的函数! 如果是以下情况:

var search = "可控点";

document.getElementById().innerHTML=search;

以上情况很多都是出现在你搜索后 然后显示的 你所查询的关键字

如果过滤了 <> ‘ " & % 等等这些!然后再输出到页面上!

按理说这样是安全了!但是我们把输入的值改成 jsunicode 编码

如 我们改成 <img src=x onerror=alert(1)> 然后进行js八进制编码 然后服务器端接受后 经过过滤器 没有发现该过滤的就进入到了innerHTML中

现在我们来看看 输出是什么效果!

我就用chrome console来演示吧!

看到了把 经过js的解码 我们的代码又还原回来了 并且注入到了网页中!这时候代码执行!成功弹窗!

在js中是可以用jsunicode js16进制 js8进制的!

为什么这里不用16进制 跟unicode编码!是因为 八进制的相对而言最短!



在xss中字符数的长短 也是一个很重要的问题!越短越好!

在asp的站中插XSS代码的时候,存储型 会因为你数据库中字段的长度不够

而存不进去 然后报错!这种情况经常发生!所有养成用最少的字符 来达到你的目的 是最好的!

既然提到了js中的十六进制编码 跟js中的unicode编码 那么也上两张图吧!

十六进制在js中是\x[16hex] 来表示的 如:<  \x3c

大家看到跟八进制的用法也是一样的!只不过多了一个字符X 虽然我很喜欢这个字符 但是我更喜欢八进制的短小精悍!

下面再说说jsunicode编码:

他的表示方式是这样的:\uxxxx \uxxx < 转码后: /u003c

上图:

0x05 base64编码

到目前为止 我遇到使用base64编码的情况 大多数是这样!

<a href="可控点">

<iframe src="可控点">

在这种情况下 如果过滤了<> ‘ " javascript 的话 那么要xss可以这样写 然后利用base64编码!

<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>

这样当test A链接点击时 就会以data协议 页面以html/text的方式解析 编码为base64 然后单点击a链接时 base64的编码就被还原成我们原本的

<img src=x onerror=alert(1)>

然后成功弹窗!

如下图:

原文地址:https://www.cnblogs.com/-qing-/p/10921030.html

时间: 2024-10-14 00:59:06

web安全之XSS基础-常见编码科普的相关文章

Java web中常见编码乱码问题(二)

根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码,应该先检测系统编码是什么样的,看看是否支持中文编码的字符集. System.out.println(System.getProperty("file.encoding")); a1.如果是不支持中文的就要设置jvm编码了,设置方法: Windows环境就在catalina.bat配置: s

结合代码对xss基础的学习

前言:有人曾经说过,XSS之所以那么流行,就是因为每个网站,包括Google.Microsoft等,都会存在XSS漏洞!之前对XSS这块"肥肉"只是了解,没有系统的学习一下.趁着暑假赋闲,来系统的剖析一下这块'肥肉'. 0x01 xss基础 Cross Site Script For web client 来源于js / ActiveX / Flash - js xss使用场景 直接嵌入html: <script>alert(/xss/);</script> 元

XSS基础学习

XSS基础学习 By:Mirror王宇阳 什么是XSS XSS攻击是指在网页中嵌入一段恶意的客户端Js脚本代码片段,JS脚本恶意代码可以获取用户的Cookie.URL跳转.内容篡改.会话劫持--等. xss攻击手段本身对服务端没有直接的危害,xss主要是借助网站传播:一般通过留言板.邮件.等其他途径向受害者发送一段恶意的URL,受害者通过访问该恶意URL可能会导致恶意的xss脚步会在受害者的客户端浏览器中执行,实现自己的目的 XSS的攻击类别分为:反射型.存储型.DOM型等三大类攻击类别. 反射

XSS与字符编码的那些事儿

目录 0x00:基本介绍 0x01:html实体编码 0x02:新增的实体编码 实体编码变异以及浏览器的某些工作原理! 0x03:javascript编码 0x04:base64编码 0x05:闲扯 0x00基本介绍 提起XSS 想到的就是插入字符字符编码与各种解析了! 这也就是各种xss编码插件跟工具出世的原因!之前不懂浏览器是如何对我们编码过的代码进行解析的时候就是一顿乱插! 各种编码 各种插 没把编码还原就算了 还原了就算运气好!后来到PKAV经过二哥和短短的调教后才算是弄清楚了一点编码与

web安全之XSS注入

之前在做项目的时候有遇到一些安全问题,XSS注入就是其中之一 那么,什么是XSS注入呢? XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的. 跨站脚本攻击的危害:窃取cookie.放蠕虫.网站钓鱼 ... 跨站脚本攻击的分类主要有:存储型XSS.反射型XSS.DOM型XSS XSS漏洞是Web应用程序中最

WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案

对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门参考大量前辈们的心得,小小的总结一下,欢迎大家拍砖啊 一.跨站脚本攻击(XSS) 跨站脚本攻击的原理 XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时

Web开发者应知的URL编码知识

原文出处:http://blog.jobbole.com/42246/ 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们经常遇到的问题及其解决方案.本文并不特定于某类编程语言,我们在Java环境下阐释问题,最后从Web应用的多个层次描述如何解决URL编码的问题来结尾. 简介 当我们每天上网冲浪时,有一些技术我们无时无刻不在面对.有数据本身(网页),数据的格式化,能够让我们获取数据的传输机制,以及让Web网络能够真正成

Java基础常见英语词汇

(转自http://www.jianshu.com/p/2743fe834166) Java基础常见英语词汇(共70个) ['?bd?ekt] ['?:rientid]导向的 ['pr??ɡr?m??]编程OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程 [d?'vel?pm?nt][k?t]工具箱 ['v??tj??l]虚拟的JDK:Java development kit, java开发工具包 JVM:java

WEB开发中的字符集和编码

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption