10.25(1)XFF头(2)unescape()函数(3)编码与加解密

1.HTTP请求头中的XFF

 在Java代码实践中,有两种方式可以从HTTP请求中获得请求者的IP地址。一个是从Remote Address中获得,另一个是从X-Forward-For中获得,但他们的安全性和使用场景各有不同。一旦用错,就可能为系统造成漏洞。因此,需要开发者对这两个参数深入的理解。
 Remote Address代表的是当前HTTP请求的远程地址,即HTTP请求的源地址。HTTP协议在三次握手时使用的就是这个Remote Address地址,在发送响应报文时也是使用这个Remote Address地址。因此,如果请求者伪造Remote Address地址,他将无法收到HTTP的响应报文,此时伪造没有任何意义。这也就使得Remote Address默认具有防篡改的功能。
 在一些大型网站中,来自用户的HTTP请求会经过反向代理服务器的转发,此时,服务器收到的Remote Address地址就是反向代理服务器的地址。在这样的情况下,用户的真实IP地址将被丢失,因此有了HTTP扩展头部X-Forward-For。当反向代理服务器转发用户的HTTP请求时,需要将用户的真实IP地址写入到X-Forward-For中,以便后端服务能够使用。由于X-Forward-For是可修改的,所以X-Forward-For中的地址在某种程度上不可信。
 所以,在进行与安全有关的操作时,只能通过Remote Address获取用户的IP地址,不能相信任何请求头。
 当然,在使用nginx等反向代理服务器的时候,是必须使用X-Forward-For来获取用户IP地址的(此时Remote Address是nginx的地址),因为此时X-Forward-For中的地址是由nginx写入的,而nginx是可信任的。不过此时要注意,要禁止web对外提供服务。

2.JavaScript unescape() 函数

定义和用法         unescape() 函数可对通过 escape() 编码的字符串进行解码。
语法              unescape(string)       string 	必需。要解码或反转义的字符串。
返回值            string 被解码后的一个副本。
说明              该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。
提示和注释        注释:ECMAScript v3 已从标准中删除了 unescape() 函数,并反对使用它,因此应该用 decodeURI() 和 decodeURIComponent() 取而代之。

实例

 在本例中,我们将使用 escape() 来编码字符串,然后使用 unescape() 对其解码:
 <script type="text/javascript">
 var test1="Visit W3School!"
 test1=escape(test1)
 document.write (test1 + "<br />")
 test1=unescape(test1)
 document.write(test1 + "<br />") 
 </script>

输出

 Visit%20W3School%21
 Visit W3School!

3.编码&加解密

前言

 玩过CTF的小伙伴会经常遇到类似这样的问题:dalao这是啥编码方式啊?怎么解密啊?其实CTF中的脑洞密码题,通常是非现代加密方式,一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但都会留下不少线索,当然也需要参赛者对于各种编码方式有所了解,这样更有利于快速入手解密,结合一定的脑洞,拿到Flag就so easy了.

编码方式汇总
常见编码

 ASCii编码
 Base64/32/16编码
 shellcode编码
 Quoted-printable编码
 XXencode编码
 UUencode编码
 URL编码
 Unicode编码
 Escape/Unescape编码
 HTML实体编码
 Tap Code敲击码
 Morse Code摩尔斯电码

各种文本加密

换位加密

 Rail-fence Cipher栅栏密码
 Curve Cipher曲路密码
 Columnar Transposition Cipher列位移加密

替换加密

 Atbash Cipher埃特巴什码
 Caesar Cipher凯撒密码
 ROT5/13/18/47
 Simple Substitution Cipher简单换位密码
 Hill Cipher希尔密码
 Pigpen Cipher猪圈密码
 Polybius Square Cipher波利比奥斯方阵密码
 夏多密码(曲折加密)
Playfair Cipher普莱费尔密码
 Vigenere Cipher维吉尼亚密码
 Autokey Cipher自动密钥密码
 Beaufort Cipher波弗特密码
 Running Key Cipher滚动密钥密码
 Porta Cipher
 Homophonic Substitution Cipher同音替换密码
 Affine Cipher仿射密码
 Baconian Cipher培根密码
 ADFG/VX Cipher ADFG和ADFGVX密码
 Bifid Cipher双密码
 Trifid Cipher三分密码
 Four-Square Cipher四方密码
 Checkerboard Cipher棋盘密码

============================
Base64

 ZXZhbCgkX1BPU1RbcDRuOV96MV96aDNuOV9qMXVfU2gxX0oxM10p
 NTU2NJC3ODHHYWJIZ3P4ZWY=

 Base64编码要求把3个8位字节转化为4个6位的字节,之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用’=’,因此编码后输出的文本末尾可能会出现1或2个’=’

Base32

 Base32和Base64相比只有一个区别就是,用32个字符表示256个ASC字符,也就是说5个ASC字符一组可以生成8个Base字符,反之亦然。

编解码

希尔密码
 密文: 22,09,00,12,03,01,10,03,04,08,01,17
 明文:wjamdbkdeibr

 解题思路:
 a b c d e f g h i j k l m n o p q r s t u v w x y z
 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
 把字母用数字表示,解密时把数字转换成字母

栅栏密码
 把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。

凯撒密码
  通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

Unicode
  Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布。
  一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码
  如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
  为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
 形式:
  在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。
  在Unicode中:汉字“字”对应的数字是23383(十进制),十六进制表示为5B57。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“Unicode Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。
  
  例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
 char      data_utf8[]={0xE6,0xB1,0x89,0xE5,0xAD,0x97};//UTF-8编码
 char16_t data_utf16[]={0x6C49,0x5B57};        //UTF-16编码
 char32_t data_utf32[]={0x00006C49,0x00005B57};//UTF-32编码
 这里用char、char16_t、char32_t分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以char、char16_t、char32_t作为编码单位。

 例1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

 例2:Unicode编码0x20C30在0x010000-0x10FFFF之间,使用4字节模板:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

 Brainfuck
 类型:++++++++++[>+++++++>++++++++++>+++>+<<<<-]
 
 摩斯密码
 密文样例:– — .-. … .
 
 jsfuck
 密文样例:()[]{}!+
 如果jsfuck定义的是一个函数并且最后以()结尾,则在火狐console中运行时函数也会运行,就会错掉什么提示。这时候需要把最后的()换成.toString()

 培根密码
 培根所用的密码是一种本质上用二进制数设计的。不过,他没有用通常的0和1来表示,而是采用a和b。对照培根密码表进行解密。
 
 费娜姆密码(异或)
  已知将一个flag以一种加密形式并使用密钥进行加密,使用密钥WELCOMETOCFF加密后密文为 000000000000000000000000000000000000000000000000000101110000110001000000101000000001 请分析出flag。
  密钥为12位,密文为84位,可能是异或:

 解:
 7位二进制可能表示字母顺序:
 W E L C O M E T O C F 
 密文
 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0010111 0000110 0010000 0010100 0000001
 密钥
 0010111 0000101 0001100 0000011 0001111 0001101 0000101 0010100 0001111 0000011 0000110 0000110
 Xor
 0010111 0000101 0001100 0000011 0001111 0001101 0000101 0000011 0001001 0010011 0010010 0000111
 W E L C O M E C I S R G
 flag:WELCOMECISRG

 猪圈密码,又称共济会密码

 CRC32
 密文样例:4D1FAE0B
 CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。

 颜文字加密(aaencode)
 这个好萌啊>.<
 颜文字js加密:明文alert(“flag”);
 密文:゚ω゚ノ= /`m´)ノ ~┻━┻ //´∇`/ [‘’]; o=(゚ー゚) ==3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); (゚Д゚) =(゚Θ゚)= (o_o)/ (o_o);(゚Д゚)={゚Θ゚: ‘’ ,゚ω゚ノ : ((゚ω゚ノ==3) +’’) [゚Θ゚] ,゚ー゚ノ :(゚ω゚ノ+ ‘’)[o^^o -(゚Θ゚)] ,゚Д゚ノ:((゚ー゚==3) +’’)[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +’’) [c language=”_o”][/c];(゚Д゚) [‘c’] = ((゚Д゚)+’’) [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];(゚Д゚) [‘o’] = ((゚Д゚)+’’) [゚Θ゚];(゚o゚)=(゚Д゚) [‘c’]+(゚Д゚) [‘o’]+(゚ω゚ノ +’’)[゚Θ゚]+ ((゚ω゚ノ==3) +’’) [゚ー゚] + ((゚Д゚) +’’) [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +’’) [゚Θ゚]+((゚ー゚==3) +’’) [(゚ー゚) – (゚Θ゚)]+(゚Д゚) [‘c’]+((゚Д゚)+’’) [(゚ー゚)+(゚ー゚)]+ (゚Д゚) [‘o’]+((゚ー゚==3) +’’) [゚Θ゚];(゚Д゚) [‘’] =(o_o) [゚o゚] [゚o゚];(゚ε゚)=((゚ー゚==3) +’’) [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+((゚Д゚)+’’) [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +’’) [o^^o -゚Θ゚]+((゚ー゚==3) +’’) [゚Θ゚]+ (゚ω゚ノ +’’) [゚Θ゚]; (゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]=’\’; (゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o_o -(゚Θ゚)];(o゚ー゚o)=(゚ω゚ノ +’’)[c language=”^^o”][/c];(゚Д゚) [゚o゚]='”‘;(゚Д゚) [‘’] ( (゚Д゚) [‘’] (゚ε゚+(゚Д゚)[゚o゚]+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o_o) +(o_o))+ ((o_o) – (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((o_o) +(o_o))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (c_o)+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o_o) – (゚Θ゚))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((o_o) +(o_o))+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ ((゚ー゚) + (゚Θ゚))+ (゚ー゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+(゚Θ゚)+ (゚ー゚)+ ((゚ー゚) + (o_o))+ (゚Д゚)[゚ε゚]+(゚ー゚)+ ((o_o) – (゚Θ゚))+ (゚Д゚)[゚ε゚]+((゚ー゚) + (゚Θ゚))+ (゚Θ゚)+ (゚Д゚)[゚ε゚]+((゚ー゚) + (o_o))+ (o_o)+ (゚Д゚)[゚o゚]) (゚Θ゚)) (‘_’);
 
 Jjencode
 密文:$=~[];$={:++$,$$$$:(![]+””)[$],$:++$,$$:(![]+””)[$],$:++$,$$$:({}+””)[$],$$$:($[$]+””)[$],$$:++$,$$$:(!””+””)[$],$:++$,$$:++$,$$:({}+””)[$],$$:++$,$$$:++$,$:++$,$$:++$};$.$=($.$=$+””)[$.$$]+($.$=$.$[$.$])+($.$$=($.$+””)[$.$])+((!$)+””)[$.$$]+($.=$.$[$.$$])+($.$=(!””+””)[$.$])+($.=(!””+””)[$.$])+$.$[$.$$]+$.+$.$+$.$;$.$$=$.$+(!””+””)[$.$$]+$.+$.+$.$+$.$$;$.$=($.)[$.$][$.$];$.$($.$($.$$+”””+$.$$+(![]+””)[$.$]+$.$$$+”\”+$.$+$.$$+$.$+$.+”(\”\”+$.$+$.$+$.+$.$$$+(![]+””)[$.$]+(![]+””)[$.$]+$.$+”,\”+$.$+$.+”\”+$.$+$.$+$.$+$.$$+”\”+$.$+$.$$+$.$$+$.$$+”\”+$.$+$.$+$.$$+$.$$+”\”+$.$+$.$$+$.$+”\”+$.$+$.$$+$.$+”\”+$.$+$.$$+$.+$.+”\”\”+$.$+$._+”)”+”””)())();

 Utf-7编解码
 原文:gdfgdfg
 密文:+AGcAZABmAGcAZABmAGc-
 无论何种,都是+开头-结尾
 
 RC4
 RC4(来自Rivest Cipher 4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。
 
 曼彻斯特编码
曼彻斯特编码(Manchester Encoding),也叫做相位编码( Phase Encode,简写PE),是一个同步时钟编码技术,被物理层使用来编码一个同步位流的时钟和数据。

 HEX编码
 https://blog.csdn.net/lzwglory/article/details/19971347
 
 仿射密码
 https://blog.csdn.net/qq_41725312/article/details/81067248
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值