Encoding and Filtering
URL编码:https://perishablepress.com/stop-using-unsafe-characters-in-urls/
HTML编码:需要知道如何编码以及如何解码
-
文档字符编码:HTTP协议或指令
https://datatracker.ietf.org/doc/html/rfc2616 Content-Type:text/html; charset=utf-8
如果未定义则默认发送:https://en.wikipedia.org/wiki/ISO/IEC_8859-1
使用HTTP协议定义字符编码:
PHP:header('Content-type: text/html; charset=utf-8’);
asp.net:<%Response.charset="utf-8"%>
JSP:<%@ page contentType="text/html; charset=UTF-8" %>
HTML指令:<meta http-equiv="Content-Type" Content='text/html; charset=utf-8'>
或 HTML5<meta charset="utf-8"'>
-
Character References 字符引用
HTML的特殊字符多含义:比如 <,表示标签和比较运算符符号
HTML4:https://www.w3.org/TR/1998/REC-html40-19980424/charset.html#h-5.3
HTML5:https://html.spec.whatwg.org/#character-references
< 的编码
命名实体 <
十进制 <
十进制:<
十进制:< 或 <
十六进制 < 或 <
十六进制:< 或 <
十六进制:�x3c 或 �x3c
base 36进制编码(web应用在使用它:reddit或域名缩短服务等,https://www.reddit.com/ https://tinyurl.com/)
PHP:<?=base convert("OHPE",36,10);?>
http://www.php.net/manual/en/function.base-convert.php
JavaScript编码:(1142690).toString(36)
或 1142690..toString(36)
JavaScript解码:parselnt("ohpe",36)
base64进制编码
[0-9][a-zA-Z]再加上 + 和 /
共计64个字符来表示。
实现时:但是不同的实现对两个相近的或填充的地方使用 = https://en.wikipedia.org/wiki/Base64#Implementations_and_history
如果总比特数不是6的倍数,则需要添加空比特,直到总数既是6的倍,结果长度也是4的倍数。如果最新的组是“空”(000000),编码值是=,如果后面的“空组”是两个,将被编码为==。
PHP编解码:<?=base64 encode('encode this string")?>
或 <?=base64 decode(ZW5jb2RllHRoaXMgc3RyaW5n')?>
JavaScript编解码:window.btoa('encode this string');
或 window.atob('ZW5ib2RlHRoaXMgc3RyaW5n');
https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa
字符超出范围的异常(要处理Unicode字符串,需要在使用 Base64 函数之前对Unicode字符串进行编码。):https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa
Unicode编码
因为你在某个输入框使用了AES加解密,所以payload(恶意输入123456)自带绕waf,以上编码的应用同理(说白了就是web应用或中间件本身存在解码)
如果你很无聊的话,论文指导一切:http://www.joelonsoftware.com/articles/Unicode.htm
映射unicode的三个点:UTF-8,UTF-16,UTF-32,utf表示Unicode转换格式,后面的数字表示表示代码点的比特数。