basic

 · 2020-3-20 · 次阅读


写这篇文章的原因:
1.继续巩固自己的基础,俗话说地基不牢,地动山摇
2.有时候会有迷茫期,现在就是,那就把基础知识全部复习一遍,以便之后更好的学习新知识
3.很多基础知识,可能自己觉得当时没学好,也有可能是忘了的,温故而知新,这是极好的。
4.摒弃不求甚解,将就的思想,力争吃尽每一个字,学到每一个标点符号。

以下是需要复习的内容:
1.URL编码
2.HTML编码
3.Base64编码
4.数据包
5.HTTP响应头,都有哪些,都是做什么的
6.GET传参,POST传参,怎么传参
7.HTTP协议是什么
8.MD5是什么
9.github
10.writeup
11.webshell
——以上是非安全概念,下面是安全概念—–
12.信息泄露/源码泄露
13.暴力破解
14.SQL注入
15.XSS
16.CSRF
17.远程命令执行
18.代码执行
19.文件包含
20.任意文件上传/下载/删除
21.逻辑漏洞
22. XXE
23.SSRF
24.序列化漏洞/反序列化漏洞
25.变量覆盖
26.DDOS
27.CRLF
28.DNS协议
29.Apache/IIS/Tomcat/Nginx

1.URL编码(或者URI)

URI(Uniform Resource Identifier)统一资源标识符;URL,统一资源定位符。我以前不知道这两个是什么意思,有什么关系。直到看到了这篇文章:
讲URL编码的很好的一篇文章
URL其实是URI的一种,典型URL格式如下:

   foo://example.com:8042/over/there?name=ferret#nose 
   \_/  \______________/ \________/\_________/ \__/
    |          |              |          |       |
scheme     authority         path      query  fragment

可能英文还是不太懂,翻译一下就是:协议://域名:端口/虚拟目录(或者真实文件路径)/文件名?参数=参数值锚部分
这个锚是用来做什么的,是用来定位的,之前我搭建博客文章目录时候,发现了src=”#”这样的,但是如果url中含有锚部分,比如上面的nose.
那么就有只想页面的锚:href=”#nose”
当然我们平常见到的指向另一个页面,或者说叫点击跳转是以下格式:
绝对 URL - 指向另一个站点(比如 href=”http://www.example.com/index.htm")
相对 URL - 指向站点内的某个文件(href=”index.htm”)
好了接下来进入正题:

为什么需要url编码?

我看了很多文章后,发表一下自己观点:就比如现在国际通用语言:汉语,英语等。为什么要统一一种语言的道理,对于Url也一样。这就让我又想到了utf-8。但是url编码不仅解决统一问题,主要很多语言他不认识,语言最可怕的是产生歧义,但机器语言,编程语言比自然语言优秀的地方就在于不会有歧义。
为了解决这个问题就采用了一套同一的url编码对url中的某些符号等进行编码。
这里当然如果你有这个能力,你可以自己设计一套编码,也可以让Url中用你设计的无歧义,并且安全的编码规则。
关于歧义,举个简单的例子:
例如参数a=+5&&b=7=
这里面a中存在了+,&这些本来不应该为参数内容的非法字符,会出现安全问题,为了解决歧义,采用url编码是极好的。

url编码格式采用的是ASCII码,这里我又想到了一个有趣的东西,十六进制没有F之后的英文字母,因而如果哪个hex-string加密中突然出现个F之后的字母并且长度还不对,那就是考的这一个小知识点。

哪些字符需要编码

RFC3986文档规定,URL中只允许包含英文字母,数字,-_.~这四个特殊字符以及所有保留字符

当然在RFC3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。好了,我先去看一下这个文档。

如何对URL中的非法字符进行编码

url编码通常称为百分号编码,它的编码方式就是使用%加上两位的字符–0->F
代表一个字节的十六进制形式(我记得是两个十六进制一个字节吧。)这里应该是两个十六进制最终一个字节。

url默认使用的字符集是:US-ASCII.例如a在其中就是0x61,那么很简单url编码就是%61.我们去url中试试输入%61,哈,一下就变成a了。这也就说明url中还会自动解码,所以一些在url中想用url编码绕过的,还是编码两次url才行。
Url中只允许使用可打印字符。US-ASCII码中的10-7F字节全都表示控制字符,这些字符都不能直接出现在Url中。同时,对于80-FF字节(ISO-8859-1),由于已经超出了US-ACII定义的字节范围,因此也不可以放在Url中。

URL中的保留字有哪些

url中的保留字符大概有如下:
! * ‘ ( ) ; : @ & = + $ , / ? # [ ]

HTTP头中看到有一个Content-Type的header,值为application/x-www-form-urlencoded。这就是url编码的模范

2.HTML表单编码

enctype属性指定浏览器如何编码数据并将其呈现给服务器

此属性有三个允许值:
application/x-www-from-urlencoded
默认编码,此编码无法用于将文件上传到服务器
multipart/form-data
此编码用于将文件上传到服务器
text/plain
此编码因浏览器而异

3.BASE64编码

BASE64是不是一种加密算法,它是一种”二进制到文本”的编码方法,它能够将给定的任意二进制数据转化为ASCII字符串的形式,以便在只支持文本的环境中能够顺利地传输二进制数据。
例如支持MIME的电子邮件应用,或需要在XML中存储复杂数据(例如图片)时。

例如Man 经过base64编码后就变成了 TWFu

Man的ASCII十六进制分别是:4D,61,6E二进制编码是01001101 01100001 01101110
然后将他们合并:100011010110000101101110--->010011  010110 000101 101110
---->最后将他们补齐(即每一个前面补两位0)00010011 00010110  00000101 00101110
---->转换为十进制是(为了方便查找MIME表):19,16,5,46

补零操作:如果要转化的剩余字符数不够怎么办:01001101前面只能分六位出来,最后两位就填充为:010000
其他与其原理类似。

填充操作:
BASE64的=字符是怎么出现的呢?
还原时,依次将每4个字符还原成3个字节,最后会出现3种情况之一:

  1. 没有字符剩下
  2. 还剩下2个字符
  3. 还剩下3个字符
    填充就是当出现编码时的情况2和3时,在后面补上“=”字符,使编码后的字符数为4的倍数。

所以我们可以很容易地想到,情况2,即还剩下1个字节时,需要补2个“=”,因为此时最后一个字节编码为2个字符,补上2个“=”正好凑够4个。情况3同理,需要补1个“=”。

下面是MIME表:
编码 字符 编码 字符 编码 字符 编码 字符
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

摘自:https://www.cnblogs.com/antineutrino/p/3756106.html
上面这篇文章还有JAVA的加密算法。

4.数据包

TCP/IP协议数据包,一般由应用层,传输层,网络层,数据链路层封装而成。
四层协议各自作用:
数据链路层实现了网卡接口的驱动程序
网络层实现了数据包的选路和转发。
传输层为两台主机上的应用程序提供端到端的通信。
应用层负责处理应用程序的逻辑。

转载:https://www.cnblogs.com/itsad/p/7887248.html

GET or POST

get和post的区别

1.get直接在浏览器输入,post需要工具发送请求

2.get用url或者cookie传参,post将数据放在body中

3.get的URL有长度限制,post数据可以非常大

4.post比get安全,因为URL看不到数据

5.get用来获取数据,post用来发送数据

响应数据包包含什么

1.状态行:协议版本、数字形式的状态代码和状态描述,个元素之间以空格分隔

2.响应头:包含服务器类型、日期、长度、内容类型等

3.【空行】响应头与响应体之间用空行隔开

4.响应正文:程序处理后果,浏览器会将实体内容中的数据取出来,生成相应的页面

常见状态码

1**:提示信息-表示请求已收到,继续处理

2**:发送成功(200)

3**:重定向(302)

4**:客户端错误

  400.发送请求有语法错误

  401.访问页面没有授权

  403.没有权限访问该页面

  404.没有该页面

5**:服务端错误

  500.服务器内部异常

  504.服务器请求超时,没有返回结果

MD5

MD5是一种哈希算法,知道哈希算法是一种无法解密的算法即可,但可以碰撞。所以什么是碰撞?
就是使用两个不一样的明文得到了同样的hash值。hash碰撞带来的安全威胁也不容忽视。

MD5对待加密的字符串的处理是将一个字符串分割成每512位为一个分组,形如N*512+R,这里的R是余下的位数。这个R分为几种情况:

R=0时,需要补位,单补上一个512位的分组,因为还要加入最后64个位的字符串长度。

R<448时,则需要补位到448位,后面添加64位的字符串长度。

R>448时,除了补满这一分组外,还要再补上一个512位的分组后面添加64位的字符串长度。

补位的形式是先填充一个1,再接无数个0,直到补足512位。

参考链接:https://www.cnblogs.com/code-fly-blogs/articles/9869913.html

最后,其他的安全相关知识点,用CTF的方式去温习知识就不一一说明了,免得我的文章真是又丑又长,没营养的土豆文。