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平台的钩子我们应该怎么写呢?
那么我们可以在这里 闭合双引号 写事件:
οnerrοr=[html language="实体编码"][/html][/html]
比如我现在弹个窗:
<img src="x" οnerrοr="alert(1)">
原code:
<img src="x" οnerrοr="alert(1)">
这里我用的是html十进制编码 也可以使用十六进制的html实体编码!
但是为什么这里我没有用jsunicode 以及 js八进制跟js十六进制呢!
浏览器是不会在html标签里解析js中的那些编码的!所以我们在οnerrοr=后面放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页面加载时会对编码进行解码!那么' 已经是单引号了 但是并不会闭合! 然后在点击过程中执行javascript代码 这个时候由于html里'被解析成单引号但是没闭合 这个时候js被执行 这个我们提交的在html加载时解析成了字符串单引号但是不能闭合之前的引号 因为现在是把我们提交的编码了的单引号 当成字符串来显示 但是现在他是存在于a标签中的href里的 href链接里的地址是javascript伪协议,我们现在点击的时候 会执行里面的代码 关键来了 这个时候我们之前被当做字符串的单引号 被再次解析 这个时候就没任何过滤规则来过滤它 程序也没那么智能 之前当做字符串的单引号起作用了 javascript不知道他是个字符串 它只知道浏览器解析成了什么 他就带入进去!就在这个时候我们的字符串单引号就成功的闭合了!当点击go时 我们的代码执行!
上面这个例子讲了html编码 以及特殊情况下的编码那么再讲下当你的输入点存在于script标签中的时候!我们就应该用js中的编码了!
既然知道是如何解析的了 那么便又有了以下新的想法!
0x03 新增的实体编码与浏览器的工作原理
通常程序做 XSS 防御的时候会考虑到一些 HTML 编码的问题,会拦截或转义 " \ 这样的东西 那么我的双引号跟尖括号就被拦截了!
但基础这种黑名单方式可能出现的问题:
1. 不认识 HTML5 新增的实体命名编码,如
: =>[冒号]
 => [换行]
case: <a href="javasc
ript:alert(1)">click</a>
2.对 HTML 编码的解析规则不够熟悉,就像十进制和十六进制编码的分号是可以去掉的。
还有,数字编码前面加「0」,这也是一条很好的绕过 WAF 的向量。
数字前面是可以加多个0的
<a href="javasc
ript:alert(1)">click</a>
这句代码能够执行么?
不知道那些不是很清楚浏览器工作原理的朋友,在最开始有没有怀疑这段代码能不能执行!
起码我最开始 怀疑过!即使编码被解析回来了 换行了还能执行么!
解析器-词法分析器Parser-Lexer combination
解析可以分为两个子过程——语法分析及词法分析
词法分析就是将输入分解为符号,符号是语言的词汇表——基本有效单元的集合。对于人类语言来说,它相当于我们字典中出现的所有单词。
语法分析指对语言应用语法规则。
解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。
然后我的理解是这样的:
<a href="javasc
ript: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 οnerrοr=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 οnerrοr=alert(1)>
然后成功弹窗!
如下图:
转载于:https://www.cnblogs.com/-qing-/p/10921030.html
web安全之XSS基础-常见编码科普相关推荐
- [ 常见漏洞篇 ]常见web漏洞总结------XSS跨站脚本漏洞
本文简单的总结了一下XSS的知识点 主要是从面试的角度来总结的 如果想从事安全方向,那么这些基本的漏洞都是需要掌握的 目录 一.XSS形成原因: 二.XSS分类: 1. 反射型XSS 2. 存储型XS ...
- 网络安全-WEB中的常见编码
目录 简介 ASCII编码 URL与URL编码 URL详解 URL编码 Unicode编码 HTML编码 Base编码 参考 简介 编码(encode)和解码(decode)是相当广泛的话题,设计计算 ...
- java 问号乱码_Java web中常见编码乱码问题(一)
最近在看Java web中中文编码问题,特此记录下. 本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法: 一.常见编码方式: 1.ASCII 码 众所周知,这是最简单的编码. ...
- 计算机常见编码一. 有关编码的基础知识字符集
计算机常见编码一. 有关编码的基础知识 1. 位 bit 最小的单元 字节 byte 机器语言的单位 1byte=8bits 1KB=1024byte 1MB=1024KB 1GB=1024MB 2. ...
- 限制会话id服务端不共享_【干货分享】Web安全漏洞深入分析及其安全编码
阅读: 13,003 超全Web漏洞详解及其对应的安全编码规则,包括:SQL注入.XSS.CSRF.文件上传.路径遍历.越权.XML以及业务安全等,实例告诉你各个漏洞对应的编码规则.给你的代码加把安全 ...
- WEB安全性测试测试用例(基础).doc
原文地址为: WEB安全性测试测试用例(基础).doc 建立整体的威胁模型,测试溢出漏洞.信息泄漏.错误处理.SQL注入.身份验证和授权错误. 1.输入验证 客户端验证服务器端验证(禁用脚本调试,禁用 ...
- WEB安全:XSS漏洞与SQL注入漏洞介绍及解决方案
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,希望大家多多提意见. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避 ...
- XSS跨站脚本(web应用)——XSS跨站脚本防御(三)
本章目的 普及xss攻击常见防御方法与web安全编码规范 XSS Filter 什么是XSSFilter XSSFilter的作用是通过正则的方式对用户(客户端)请求的参数做脚本的过滤,从而达到防范X ...
- Web应用进行XSS漏洞测试
对 WEB 应用进行 XSS 漏洞测试,不能仅仅局限于在 WEB 页面输入 XSS 攻击字段,然后提交.绕过 JavaScript 的检测,输入 XSS 脚本,通常被测试人员忽略.下图为 XSS 恶意 ...
最新文章
- 【原创翻译】The Case for the Reduced Instruction Set Computer
- 结合案例深入解析:抽象工厂模式
- ios3怎么取消长按弹出菜单_苹果:iOS13取消3D-Touch重压改为长按只是个BUG~
- vue-cli新建的项目webpack设置涉及的大部分插件整理
- Codeforces Round #720 (Div. 2) C. Nastia and a Hidden Permutation 交互
- leetcode 1482. 制作 m 束花所需的最少天数(二分查找)
- netty : websocketx.WebSocketHandshakeException: not a WebSocket handshake request: missing upgrade
- 剑指offer——面试题41-2:和为S的两个数字
- “考虑对方的感受”之案例
- IT 人的国庆大阅兵,太好好好好好好看了吧 ……
- 在中国从事什么职业最赚钱_中国最好的十大职业2(转)
- Error:java.lang.RuntimeException: Some file crunching failed
- TMS320C6748_ECAP_APWM
- [QDialog]qt虚拟键盘的实现以及qdateedit实现打开虚拟键盘
- Esxi5.5添加4T报错的问题
- IIS 站点配置文件
- 基于PLUS模型+InVEST模型 生态系统服务多情景模拟预测
- 检验信息系统源码 LIS源码 医院管理系统源码
- java使用Jodd-http发送http请求
- 快速实现内网穿透已成功(巧妙绕过路由器)
热门文章
- mysql5.1修改登陆密码_mysql 5.1版本 修改密码,及远程登录mysql数据库
- bubbo调用Failed to invoke remote method异常解决
- SQL2K数据库开发二十一之索引操作创建索引
- ASP.NET Core 源码阅读笔记(1) ---Microsoft.Extensions.DependencyInjection
- 【翻译】在Ext JS应用程序中构建可维护的控制器
- ACL访问控制列表【笔记|实验】
- 你把别人看透了 别人就看不透你了
- mysql sql优化_MySQL优化SQL语句的步骤
- cassandra 数据库_使用Apache Cassandra构建分布式NoSQL数据库
- opensource项目_Opensource.com的写作主题从A到Z