web小白级理解
Posted 敲代码的xiaolang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web小白级理解相关的知识,希望对你有一定的参考价值。
笔者就web的基本知识进行了一定的总结,但是由于web的知识体系庞大,若要做到每个点面面俱到,恐怕以笔者现在的实力还很困难,故笔者以CTF为切入点,将web中最常用的基础知识进行一定的总结,因笔者能力有限,若有错误,恳请各位师傅指正。
CTF中的web是指?
先聊一聊CTF,CTF是一种流行的信息安全竞赛形式,其英文名可直译为“夺得Flag”,也可意译为“夺旗赛”。其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数。为了方便称呼,我们把这样的内容称之为“Flag”。
CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式。
CTF的题目主要有五个方向,WEB,MISC,RE,PWN,CRYPTO
那么里面的Web便是我们所关注的。
WEB 类的题目种类繁多,主要关注WEB漏洞及利用,知识点细碎,时效性强,能紧跟时下热点漏洞,贴近实战
WEB 类的题目包括但不限于:SQL 注入、XSS 跨站脚本、CSRF 跨站请求伪造、文件上传、文件包含、框架安全、php 常见漏洞、代码审计等。
web的基础是指?
- TCP/IP 五层协议
- 端口 及 IP
- TCP 及 UDP分别是什么?各自优势和用途
- HTTP协议 , DNS协议
- 路由
起码你应该知道这些是个啥,不要求你像背政史一样倒背如流,但是应该拿出来反复查看
正文
如果只是一个个知识单独去看,那么估计你最后啥也记不住,所以笔者将这些基础的东西又加以排序,笔者认为按照这个顺序,可以使大家更好的理解,闲话不多说,开始。
浅识URI和URL和URN
我们不妨举个例子:动物住址协议://地球/中国/浙江省/杭州市/西湖区/某大学/14号宿舍楼/525号寝/张三.人
可以看到,这个字符串同样标识出了唯一的一个人,起到了URI的作用,所以URL是URI的子集。
URL是以描述人的位置来唯一确定一个人的。
在上文我们用身份证号也可以唯一确定一个人。
对于这个在杭州的张三,我们也可以用:身份证号:123456789来标识他。
所以不论是用定位的方式还是用编号的方式,我们都可以唯一确定一个人,都是URl的一种实现,而URL就是用定位的方式实现的URI。
再接着,比如一个网址:http://bitpoetry.io/posts/hello.html#intro
我们可以把它分解开:
http://
是定义如何访问资源的方式。
bitpoetry.io/posts/hello.html
是资源存放的位置
#intro
是资源
URL是URI的一个子集,告诉我们访问网络位置的方式。(URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。)
http://bitpoetry.io/posts/hello.html(URL)
URN是URI的子集,包括名字(给定的命名空间内),但是不包括访问方式
bitpoetry.io/posts/hello.html#intro
或许你对这三者的概念还是有些懵懂,没关系,现在你会拆解一个网址,并能把每一块划分就OK了
域名是个?
可能没学过web的人,大概也知道有域名这么个玩意,这里笔者同样使用一个网址来解释
我们知道虽然可以通过IP地址来访问每一台主机,但是要记住那么多枯糙的数字串显然是非常困难的,为此,Internet提供了域名(Domain Name)。
域名也由若干部分组成,各部分之间用小数点分开,例如“4399小游戏”主机的域名是4399,有时可能是会用到拼音,这里就是“4399.com”
域名前加上传输协议信息及主机类型信息就构成了网址(URL),例如“4399小游戏平台”的www主机的URL就是:“http://www.4399.com”。
这里就要引入一个概念——————DNS
笔者认为,你可以把它看作翻译软件。
域名解析服务(DNS)
人们习惯记忆域名,但机器间互相只认IP地址,域名与IP地址之间是一一对应的,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,整个过程是自动进行的。
DNS使用TCP和UDP端口53。
这里我们再补充一下端口的概念:
端口,在网络技术中,端口(Port)有好几种意思。集线器、交换机、路由器的端口指的是连接其他网络设备的接口,而TCP/IP协议中的端口,是逻辑意义上的端口
如果把IP地址比作一间房子,端口就是出入这间房子的门,端口是通过端口号来标记的,端口号只有整数,范围是从0到65535。
DNS记录
- A记录:把一个域名解析到一个IP地址,提供了标准的主机名到IP地址的映射 (s1ne.com,145.34.25.127, A)
- NS记录:域名服务器记录,用来指定该域名由哪个DNS服务器进行解析,在注册域名时,总是有默认的DNS服务器,即告知主机去哪里找权威DNS服务器
- CNAME记录:别名记录,允许您将多个名字映射到一台计算机
- MX记录:允许邮件服务器具有简单的别名
我们最熟悉的http
关于http协议,它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
.HTTP(超文本传输协议)
HTTP定义了Web客服向Web服务器请求Web页面的方式
状态码:
Status-Code:表示服务器发回的响应状态代码
1xx:指示信息–表示请求已接受,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
笔者上面提到了TCP协议,那么TCP协议是什么呢?
用不太严谨的话来说,但易于理解
TCP涉及握手协议,握手协议是指主要用来让客户端及服务器确认彼此的身份的一类网络协议,包括主动发出信息方与被动接受信息方交流
第一次握手,客户端发送数据包到服务器,等待服务器确认。第二次握手,服务器收到数据包后,确认,同时自己发送一个包。
第三次握手,客户端收到服务器的包后,向服务器发送确认收到包的状态。三次握手包里不包含数据,三次结束后,开始传数据。
四次挥手断开连接,第一次,主动关闭方发送请求,用来关闭主动方到被动关闭方的数据传送。第二次,被动方收到后,发送给主动方一个请求
第三次挥手,被动方发送请求,告知主动方,数据传输完毕。第四次,主动方收到后,发送信息给被动方,完成四次挥手。
(握手中涉及到FIN和ACK的概念,FIN表示关闭连接,ACK表示响应,SYN表示建立连接)
----------对于初入门的小白来说,知道流程即可,对于每个过程详细传输的东西先不必了解-----------
TCP与UDP的区别
首先我们引入UDP的定义:
UDP是一个非连接的协议,传输数据之前源端和终端不建立连接, 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。
简单比较一下两者
TCP与UDP的区别
1、基于连接与无连接;
2、对系统资源的要求(TCP较多,UDP少);
3、UDP程序结构较简单;
4、流模式与数据报模式 ;
5、TCP保证数据正确性,UDP可能丢包;
6、TCP保证数据顺序,UDP不保证。
TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。
UDP 是不需要和 TCP一样在发送数据前进行三次握手建立连接的
在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了
在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作
PS:报文(Message)报文是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
UDP无连接,不可靠运输,支持一对一,一对多,多对一,多对多,面向报文,首部开销小
TCP面向连接,可靠传输,只能一对一,面向字节流,首部最小20字节,最大60字节
补充一个小概念,笔者认为作为入门小白,暂时把这7层记住即可
OSI七层模型
(7)应用层
(6)表示层
(5)会话层
(4)传输层
(3)网络层
(2)数据链路层
(1)物理层
(应,表,会,传,网,数,物)
IP你应该知道的是…
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网际层协议。(补充一个知识 :在计算机二进制中,1个字节 = 8位 = 8bit(比特))
还有一个与其类似的概念----host字段,这里简单写一下定义:host.com,Host的字段的作用在于指明http报文的方向,访问的地点,作用与IP类似
IP地址对应于OSI参考模型的第三层网络层
IP地址(IPv4)由32位二进制数组成,分为4段(4个字节),每一段为8位二进制数(1个字节)
每一段8位二进制,中间使用英文的标点符号“.”隔开(IP地址=网络地址+主机地址)这里需要知道的是IP地址有唯一性
上面这张图已经被许多博主在很多平台引用过,这里笔者还是打算用这张图来让大家更好的理解IP地址分类,本文作为小白级理解,许多特殊的情况或者更深的知识笔者不再谈论,若有什么不解,可以留言或者私信博主,亦或借助谷歌或百度自行参悟。
路由很苦涩?
路由就是URL到函数的映射。
route就是一条路由,它将一个URL路径和一个函数进行映射
/users -> getAllUsers()
/users/count -> getUsersCount()
这就是两条路由,当访问 /users 的时候,会执行 getAllUsers() 函数;
当访问 /users/count 的时候,会执行 getUsersCount() 函数。
服务器路由
当接收到客户端发来的HTTP请求,会根据请求的URL,来找到相应的映射函数,然后执行该函数
比如以Express
app.get(’/’, (req, res) => {
res.sendFile(‘index’)
})
app.get(’/users’, (req, res) => {
db.queryAllUsers()
.then(data => res.send(data))
})
当访问 / 的时候,会返回 index 页面
当访问 /users 的时候,会从数据库中取出所有用户数据并返回(由于笔者初学web时,习惯用记事本记录,所以现在整理时,代码部分可能并没有使用编译器处理,所以这里简单弥补了一下,以后会加以注意)
还有一些让人理解起来苦涩的路由,这里简单罗列,作为小白的入门,笔者因为能力有限,也暂时无法详细讲解,等笔者更深入了解后,会单独进行总结整理
比如:
客户端路由
对于客户端(通常为浏览器)来说,路由的映射函数通常是进行一些DOM(一般指文档对象模型)的显示和隐藏操作。这样,当访问不同的路径的时候,会显示不同的页面组件。
基于Hash
URL中 # 及其后面的部分为 hash
hash仅仅是客户端的一个状态,也就是说,当向服务器发请求的时候,hash部分并不会发过去。
基于History API
通过html5 History API可以在不刷新页面的情况下,直接改变当前URL(详细方法暂未了解)
基于Hash的路由,兼容性更好;基于History API的路由,更加直观和正式。
基于Hash的路由不需要对服务器做改动,基于History API的路由需要对服务器做一些改造
动态路由
比如获取某个用户的信息,我们不可能为每个用户创建一条路由,而是在通过捕获路径中的参数(例如用户id)来实现
(此处涉及Express和Flask两个,暂未深入了解,仅知道是两个框架)
严格路由
在很多情况下,会遇到 /foobar 和 /foobar/ 的情况,它们看起来非常类似,然而实际上有所区别,具体的行为也是视服务器设置而定。
在 Flask的文档 中,提到,末尾有斜线的路径,类比于文件系统的一个目录;末尾没有斜线的路径,类比于一个文件。因此访问 /foobar 的时候,可能会重定向到 /foobar/,而反过来则不会。
如果使用的是 Express,默认这两者是一样的,也可以通过 app.set 来设置 strict routing,来区别对待这两种情况。
DHCP
dhcp是什么?
动态主机分配协议,用于动态分配ip地址
为什么使用dhcp?
减少工作量
减少输入错误
避免ip冲突
动态分配ip
提高ip地址利用率
不用重复配置ip信息
dhcp怎么样工作?
实现方法
当一台dhcp客服端启动时,该客户端将在网络中请求ip地址,当dhcp服务器收到申请ip地址请求后,将从可用的地址中选择一个提供dhcp客户端
基本过程(作为小白此处不做硬性要求,但是上面的实现方法应当理解)
(1)dhcp client 在网络中广播dhcp discover包(使用udp端口为67,源ip 0.0.0.0 目标ip 255.255.255.255,包含client的mac地址、计算机名),以便dhcp server接收dhcp discover包后确认发送方
(2)dhcp client从接收的第一个dhcp offer包中选择ip地址,并发送dhcp Request包广播(使用udp端口为67,源ip 0.0.0.0,目的ip255.255.255.255),表明使用ip地址的提供服务器
dhcp server收到dhcpRequest包后,会以dhcpACK包向客户端广播确认成功(udp端口为68,源ip是dhcp server 的ip,目的ip 255.255.255.255),当客户端收到dhcp ACK后,会使用得到的ip地址,至此整个租约结束
CDN的相爱相杀
内容分发网络(Content Delivery Network,简称CDN)
(1)CDN的加速资源是跟域名绑定的。
(2)通过域名访问资源,首先是通过DNS分查找离用户最近的CDN节点(边缘服务器)的IP
(3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。
笔者举个例子:
当终端用户(北京)向www.a.com下的指定资源发起请求时
首先向LDNS(本地DNS)发起域名解析请求。
LDNS检查缓存中是否有www.a.com的IP地址记录。
如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。
当授权DNS解析www.a.com时,返回域名CNAME www.a.tbcdn.com对应IP地址。
域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
LDNS获取DNS返回的解析IP地址。用户获取解析IP地址。
用户向获取的IP地址发起对该资源的访问请求。
PS:笔者自学时的记事本:
笔者将自己琐碎记录的知识加以归类,希望能让小白快速入门web,文章开头已经说过了,笔者打算以CTF作为切入点,那么如果你掌握了以上的内容,可以按笔者推荐的路线进行深入学习:
SQL注入
XSS
文件上传
文件包含
CSRF
SSRF
框架漏洞(fastjson,struts2,weblogic, shiro, thinkphp…)
XXE
ssti
http请求走私
目录遍历
敏感信息泄露
命令执行
php相关
笔者之后也会以小专题的形式进行深入思考,这里大概了解即可,如果你按笔者的思路学下去,可能学习周期比别人要长一点点,但是就这么稳扎稳打的走,1年时间足够让你成长为一个理论与实践都碾压别人的大佬。(虽然笔者还没有实现,不过能做到这些,绝对可以让你小有名气)笔者能力有限,可能对知识的理解或者分析有不足,欢迎各位师傅留言或私信,若是觉得文章有写的有误的地方,恳请各位师傅指正。
最后送给大家一句话:真正的黑客从来不信邪,他们只信自己,信自己手中的键盘。
以上是关于web小白级理解的主要内容,如果未能解决你的问题,请参考以下文章