Web学习+oj Web

通过视频学习了WEB,下面是做的笔记,供以后查阅,一个字一个字码的,omg。

HTTP协议

HTTP简介

  • HTTP(超文本传输协议)
  • HTTP设计用来将超文本标记语言(HTML)文档从Web服务器传送到Web浏览器
  • HTTP是一个请求和回应协议:客户机发送请求,服务器对请求给出回应
  • HTTP(应用层协议)使用可靠的TCP(传输层协议)连接,默认TCP端口是80(HTTP不安全)
  • 承载于TLS或SSL协议层之上,默认端口为443(HTTPS安全)

HTTP非持久连接

  • 浏览器首先初始化与运行http服务器主机的TCP连接,使用URL指定端口
  • 浏览器通过与TCP连接相关联的本地套接字发出一个HTTP请求信息
  • 服务器接收到请求后,解析请求并处理请求,然后通过一个套接字发出响应信息
  • 服务器通知TCP需要关闭连接(在浏览器收到响应消息后才会真正终止连接)
  • 浏览器收到响应消息,TCP终止连接
    这个就是平时访问一个静态页面,HTTP所做的工作,我们输入一个网址,期间有一个响应时间,一旦我们看到了我们访问的页面,服务器就会关闭TCP连接。

HTTP持久连接

  • 持久连接没有关闭连接这一步,服务器响应后会继续让TCP连接保持打开状态
    当我们请求一个大的文件或者观看视频的时候,服务器会让TCP连接打开,持续输出数据。(当看视频时,下边的缓存条就是说明TCP持续保持连接)

HTTP特点

  1. 支持客户/服务器模式(也就是浏览器/服务器模式)
  2. 简单快速
    客户向服务器请求服务时,只需传送请求方法和路径(URL),不需要等待很长的协议解析时间。
  3. 灵活
    HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记后,就可以被浏览器和服务器识别。
  4. 无连接
    每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
  5. HTTP协议是无状态协议
    无状态是指协议对于事务处理没有记忆能力。

URL:统一资源定位符

  • 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

URL标准格式:
schema://[user:password@]domain:port/path?query_string#fragments
字段解释:

  • schema:请求协议格式,例如http、php、JavaScript
  • user:password@:用户访问服务器时,输入用户名和密码,通过http协议进行身份验证,现在都不这么做了,并不是每个网站都需要实名认证的,都是匿名访问。
  • domain:域名,服务器的标识,如百度,还有直接是ip地址标识,都是一样的。(平常我们输入网址时,主要是输这一部分)
  • port:端口(输入时一般省略,默认80),但是在做渗透时,可能要用多个端口,为防止端口重用,要输入端口号。
  • path:路径,即页面的路径
  • query_string:web传输的参数,http中的get参数,例如搜索关键词时,服务器就是通过URL后的这个参数定位关键词的。
  • fragments:标记符,可以通过设置,让页面定位在不同的地方,例如top,让页面在顶部

注意:
URL中允许出现的字符是有限制的,URL的path开始允许直接出现A-Z,a-z,0-9以及半角连接(-,半角减号)、下划线(_)、点号(.)、波浪号(~)。其他字符均会被进行百分号编码。

抓包分析

HTTP报文

  • HTTP的一个会话,由Request和response组成(请求包和响应包)
  • HTTP请求(Requests)由请求行、消息报头、请求正文三部分组成
    请求行:请求方法、URL、协议/版本(一般用http1.0版本)
    消息报头/请求头,这是一个扩充选项,里边的内容可能不全,标识用户的一些请求状态
    请求正文,一般包含一些参数或者是上传给服务器的文件。不一定不存在
  • HTTP响应(Responses)也包含三个部分:状态行、消息报头、响应正文
    状态行:协议状态代码描述
    消息报头:描述服务器的一些信息
    响应正文:一定会有

设置代理

  • 知道HTTP协议分为两部分:请求和回应
  • 而平时浏览网页,请求报文是经过浏览器包装好的,不通过工具直接访问只能够控制很少的部分
  • 要想真正的认为控制与服务器的交互,只能通过代理抓包的方法
  • 代理:作为客户端和服务器的中间者,在利用http协议交互时,所有请求和回应都不会直接发送给目标,而是由代理接受和转发

浏览器设置代理

  • 进入浏览器的“选项”
  • 配置网络代理“设置”,手动配置代理(一般不用代理服务器,浏览器直接和服务器对话)
  • 通常在本机进行抓包(代理在本机上)
  • 设置ip地址为127.0.0.1(本机寻回测试的地址)端口为任意空闲端口并记录(代理模式为http代理)
    怎么查看端口是否空闲??(一般用8080端口)
    在cmd里输入 netstat -an命令,即可查看用了的端口

burpsuite代理设置

在浏览器中设置好了代理(就是127.0.0.1),那么还得告诉这个中间人,让他给浏览器和服务器传话,接下来对这个代理进行设置。(用burpsuite工具)

  • 进入burpsuite的proxy选项
  • 点击Option设置栏
  • 选中需要设置的代理地址点击edit进行配置
  • 将IP和端口设置为与浏览器中相同的选项

当设置完代理后,界面上IP地址前有一个小框,如果端口空闲,可以打上对号,如果发现打不上对号,说明当前使用的端口被占,只要换一个端口就行,注意这里改了,浏览器那里也得改。

抓包实践

  • 切换到proxy功能中的Intercept窗口
  • 将intercept选项设置为on开启状态
  • 浏览器访问任意网页,burp即可抓取到请求报文

    请求回应

    HTTP请求报文

    如上图所示
    第一行GET,那是请求行
    下边红框里的全是消息报头
    这里没有请求正文,因为这里只访问了一个静态页面

    HTTP请求方法

GET GET方法用于获取请求页面的指定形式 (通过URL)
POST POST可以向服务器传输一些加密信息,也可以传输文件,POST方法与GET方法相似,但是最大的区别在于GET方法没有请求内容,而POST是有请求正文的,且GET请求会将发送的数据显示在浏览器端,而POST请求不会
HEAD HEAD方法除了服务器不能在响应里返回消息正文主体,其他的与GET方法相同
PUT PUT相当于往服务器上传资源。PUT方法用于请求服务器把请求实体存储在请求资源下,如果请求资源已经存在服务器中,将会用此请求中的数据替换原先的数据,作为指定资源的最新修改版

以下HTTP方法可能会对服务器造成损害

DELETE 与PUT方法相反,DELETE方法用于请求资源服务器删除指定的资源
TRACE TRACE方法一般用于激发一个远程应用层的请求消息回路。回显服务器收到得到请求。可用于监测除了自己以外,还有没有代理截取了自己的返回包
CONNECT 为了用于能动态的切换到隧道的代理
OPTIONS OPTIONS方法用于请求获取URL标识的资源在请求/响应的通信过程中可以使用的功能选项

HTTP请求首部

  • Host:主要用于指定被请求资源的Internet主机和端口号
  • User-Agent:向服务器端传递客户端操作系统、浏览器、和其他的属性
  • Referer:包含一个URL,代表当前URL上的一个URL,比如点击了百度的页面,再从百度页面中进入下一个页面,就又referer,第一个页面没有referer
  • Cookie:是一段文本,通常来表示请求者身份
  • Range:Range可以请求实体部分内容,不下载整个文件内容,多线程下载一定会用到此请求头
  • x-forward-for:即XFF头,代表请求端的IP,也可以是多个,中间用逗号隔开
  • Accept:用于指定客户端接收哪些MIME类型的信息
  • Accept-Charset:用于指定客户端接收的字符集

下面是用POST发起请求时,才会有的请求正文的信息头,会标识我们要上传的文件,会用到以下几个字段:
(信息:就是实体内部的属性,包括实体信息类型、长度、压缩方法,最后一次修改时间等)

  • Content-Type:用于向接收方指示实体的介质类型(上传的文件类型)
  • Content-Encoding:被用作媒体类型的修饰符,表示了已经被用到实体正文的附加内容编码,想要获得content-type报头域中所引用的媒体类型,必须采用相应的解码机制。(标识加密编码的模式)
  • Content-Length:用于指明实体正文的长度,以字节方式存储的十进制数字来表示
  • Last-Modified:用于指示资源的最后修改时间和日期

HTTP响应报文

  1. 状态行:由三部分组成:(如上图红框所示)
    HTTP-Version:表示服务器HTTP协议的版本
    Status-Code :表示服务器发回的响应状态代码
    Reason-Phrase:表示状态代码的文本描述
    状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
  • 1xx:指示信息–表示请求已接收,继续处理,范围是100~101
  • 2xx:成功–表示请求已被成功接收、理解、接受,范围是200~206
  • 3xx:重定向–要完成请求必须进行更进一步操作,范围是300~305
  • 4xx:客户端错误–请求有语法错误或请求无法实现,范围是400~415
  • 5xx:服务器端错误–服务器未能实现合法的请求,范围是500~505

HTTP常见响应状态码

  1. 响应报头
  2. 响应正文就是服务器返回的资源的内容

HTTP响应首部

响应头:是服务器根据客户端发送的请求返回的内容

  • Sever:服务器所使用的Web服务器的名称
  • Set-Cookie:向客户端设置Cookie
  • Last-Modified:服务器通过这个头信息告诉浏览器,资源的最后修改时间
  • Location:告诉浏览器去访问哪个页面,浏览器接收到这个请求后会立刻访问Location头所指向的页面
  • Refresh:服务器通过Refresh头告诉浏览器定时刷新浏览器

HTTP安全机制

HTTP安全问题

HTTP没有考虑到信息的加密和验证问题,面临着数据明文传送和缺乏对消息完整性的验证这两个问题。
HTTP协议在数据传输过程中,只要攻击者能够控制到受害者的网络,便可以轻易的嗅探、修改HTTP传输的内容。HTTP协议在传输客户端请求和服务端响应时,仅仅在报文头部包含了传输数据长度,没有任何校验数据完整性的机制。

HTTP安全协议

HTTPS协议,通过在TCP层与HTTP层增加一个SSL(安全套接字)来增强数据传输时的安全性。
使用HTTPS时,数据的传输的加解密均由SSL进行,与上层HTTP无关。

HTTP与HTTPS的区别

HTTPS是在HTTP协议的基础上,HTTP请求与响应都是以相同的方式进行工作,主要区别如下:

  • HTTP是超文本传输协议,信息明文传输。HTTPS是由安全性的SSL加密传输协议
  • HTTP与HTTPS采用完全不同的连接方式,HTTP是80端口,HTTPS是443端口
  • HTTPS协议需要到CA申请证书,而HTTP不需要
  • HTTP连接相对简单,是无状态的,而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输,身份认证的网络协议。

    Cookie与session

    会话(session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。

Cookie通过在客户端记录信息确定用户身份(会话信息存储在客户端)
Session通过在服务器端记录信息确定用户身份(会话信息存储在服务器端)
Session和Cookie的作用都是为了保持访问用户与后端服务器的交互状态。

Web calculator

由于之前的request库导入不成功,一直出错,今天把pycharm重装,把电脑上多个版本的Python卸载之后,可以正常使用requests库了。
于是接着把之前做的calculator题解完。
爬取页面数据可以用requests 与 beautiful soup,具体例子https://www.jianshu.com/p/9c266216957b。,很详细,适合新手。
然后用正则表达式来匹配数字,创建一个列表(相当于C中的数组),把需要计算的数字存到列表中,计算结果。

根据提交ip地址,提交结果,打印页面,即得到flag。
下面是我的解题脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import requests
from bs4 import BeautifulSoup
import re
s = requests.Session()
t = s.get('http://123.207.149.64:23331/calculator/')
print(t.text)
soup = BeautifulSoup(t.text,'lxml')
a = soup.find_all(id="exp")
equ = a[0].string
pattern = re.compile(r'\d+')
num = re.findall(pattern,equ)
print(num)
j = 0
dic=[0,0,0,0]
for i in num:
dic[j] = int(i)
j=j+1
result = dic[0]+dic[1]*dic[2]-dic[3]
print(result)
canshu = {'answer':str(result)}
r =s.get('http://123.207.149.64:23331/calculator/', params=canshu)
print(r.text)

文章目录
  1. 1. HTTP协议
    1. 1.1. HTTP简介
    2. 1.2. HTTP非持久连接
    3. 1.3. HTTP持久连接
    4. 1.4. HTTP特点
    5. 1.5. URL:统一资源定位符
  2. 2. 抓包分析
    1. 2.1. HTTP报文
    2. 2.2. 设置代理
    3. 2.3. 浏览器设置代理
    4. 2.4. burpsuite代理设置
    5. 2.5. 抓包实践
  3. 3. 请求回应
    1. 3.1. HTTP请求报文
    2. 3.2. HTTP请求方法
    3. 3.3. HTTP请求首部
    4. 3.4. HTTP响应报文
    5. 3.5. HTTP响应首部
  4. 4. HTTP安全机制
    1. 4.1. HTTP安全问题
    2. 4.2. HTTP安全协议
    3. 4.3. HTTP与HTTPS的区别
    4. 4.4. Cookie与session
  5. 5. Web calculator