web是通过http传输信息的,用户上网浏览网页时,首先通过浏览器向对方的web服务器发送http请求,接着web服务器收到请求后就会检索相应的页面,一旦检索到相应页面,web服务器就会向浏览器回送该页面。具体来说,一次通信,从浏览器发送请求到服务器响应请求,大致分为9步:
1.浏览器地址栏中输入请求页面的url(发送用户请求)
2.浏览器浏览系统hosts文件解析ip,如果没能查到,则请求dns域名服务系统,把域名解析为ip地址
3.根据解析出来的ip,浏览器与服务器建立连接
4.浏览器发送http请求报文
5.web服务器响应请求,找到相应的html资源文件
6.如果html文件中嵌入了jsp、asp、asp.net或php程序,则web服务器运行这些程序,并将结构嵌入页面。如果应用程序包含有对数据库的操作,则应用程序服务器把查询指令发送给数据库驱动程序,由数据库驱动程序对数据库执行查询操作,查询结果返回给数据库驱动程序,并由驱动程序返回给web服务器,web服务器将数据结果嵌入页面。
7.web服务器把结果页面发送给浏览器
8.浏览器与服务器断开连接
9.浏览器解释html文档,在客户端屏幕上显示结果
我们可以通过浏览器上网看到精美页面,一般都是浏览器渲染过的html页面。其中包括css等前端技术。多个网页的集合就是网站。
也叫web服务器,主要提供web服务,也就是常说的http服务。
常见的web容器有:Apache、IIS、Nginx等。
静态网页一般都是.html文件,可以理解为纯文本文件,这些文件中包含了html代码。html是hypertext markup language的缩写,翻译为超文本标记语言,在浏览器中解释运行。
静态网页只能单向给用户展示信息,而无法与用户产生交互。随着web的发展,信息需要双向流动,产生了交互的需求,也即是动态网页的概念;所谓动态就是利用flash、php、asp、java等技术在网页中嵌入一些可运行的脚本,用户浏览器在解释页面时,遇到脚本就启动运行它。
脚本的使用让web服务可以与用户交互。即信息的双向传递,web服务模式也可以像传统软件一样进行各种事务处理,如编辑文件、利息计算、提交表单等,web架构的适用面大大拓展。
这些脚本可以嵌入在页面中,如js等,也可以以文件的形式单独存放在web服务器的目录中,如.asp,.php,.jsp文件等。这样功能性的脚本越来越多,形成常用的工具包,单独管理,web业务开发时,直接使用就可以了,这就是中间件服务器,它实际上是web服务器处理能力的拓展。
静态网页与脚本都是事先设计好的,一般不经常改动,但是网站上很多内容需要经常的更新,如新闻、博客文章、互动游戏等,这些变动的数据放在静态的程序中显然不适合,传统的办法是数据与程序分离,采用专业的数据库。web开发者在web服务器后面增加了一个数据库服务器,这些经常变化的数据存放进数据库,可以随时更新。当用户请求页面时,脚本根据用户请求的页面,涉及到动态数据的地方,利用sql数据库语言,从数据中读取最新的数据,生成”完整“页面,最后送给用户。
hypertext transfer protocol,超文本传输协议,是浏览器与web服务器之间的通信协议
用来将html文档从web服务器传输到web浏览器。是一个请求和响应的协议。客户端发出请求,服务器端对请求给出回应。http使用可靠的tcp连接,默认端口80.
特点是支持b/s架构;简单快速,可以传输任意类型的数据对象,比如html、jpg、mp3等,http是无状态的协议。
完整的URL地址
schema://login:password@address:port/path/to/resource/?query_string#fragment
比如
ftp://admin@passwd@192.168.1.1:21
fragment是锚点,实现页面内定位。
url中允许出现的字符是有限制的,url中path允许直接出现A-Z a-z 0-9 半角减号(-)、下划线句点(.)、波浪号(~)。其他字符会被百分号编号。
如:
“#”-----%23
[]------%20
原理是%+ASCII码的十六进制形式
在进行编程的时候,会用[+]代替空格
ASCii打印字符对照表
十进制 | 十六进制 | 字符/缩写 | 解释 |
0 | 00 | NUL (NULL) | 空字符 |
1 | 01 | SOH (Start Of Headling) | 标题开始 |
2 | 02 | STX (Start Of Text) | 正文开始 |
3 | 03 | ETX (End Of Text) | 正文结束 |
4 | 04 | EOT (End Of Transmission) | 传输结束 |
5 | 05 | ENQ (Enquiry) | 请求 |
6 | 06 | ACK (Acknowledge) | 回应/响应/收到通知 |
7 | 07 | BEL (Bell) | 响铃 |
8 | 08 | BS (Backspace) | 退格 |
9 | 09 | HT (Horizontal Tab) | 水平制表符 |
10 | 0A | LF/NL(Line Feed/New Line) | 换行键 |
11 | 0B | VT (Vertical Tab) | 垂直制表符 |
12 | 0C | FF/NP (Form Feed/New Page) | 换页键 |
13 | 0D | CR (Carriage Return) | 回车键 |
14 | 0E | SO (Shift Out) | 不用切换 |
15 | 0F | SI (Shift In) | 启用切换 |
16 | 10 | DLE (Data Link Escape) | 数据链路转义 |
17 | 11 | DC1/XON (Device Control 1/Transmission On) | 设备控制1/传输开始 |
18 | 12 | DC2 (Device Control 2) | 设备控制2 |
19 | 13 | DC3/XOFF (Device Control 3/Transmission Off) | 设备控制3/传输中断 |
20 | 14 | DC4 (Device Control 4) | 设备控制4 |
21 | 15 | NAK (Negative Acknowledge) | 无响应/非正常响应/拒绝接收 |
22 | 16 | SYN (Synchronous Idle) | 同步空闲 |
23 | 17 | ETB (End of Transmission Block) | 传输块结束/块传输终止 |
24 | 18 | CAN (Cancel) | 取消 |
25 | 19 | EM (End of Medium) | 已到介质末端/介质存储已满/介质中断 |
26 | 1A | SUB (Substitute) | 替补/替换 |
27 | 1B | ESC (Escape) | 逃离/取消 |
28 | 1C | FS (File Separator) | 文件分割符 |
29 | 1D | GS (Group Separator) | 组分隔符/分组符 |
30 | 1E | RS (Record Separator) | 记录分离符 |
31 | 1F | US (Unit Separator) | 单元分隔符 |
32 | 20 | (Space) | 空格 |
33 | 21 | ! | |
34 | 22 | " | |
35 | 23 | # | |
36 | 24 | $ | |
37 | 25 | % | |
38 | 26 | & | |
39 | 27 | ' | |
40 | 28 | ( | |
41 | 29 | ) | |
42 | 2A | * | |
43 | 2B | + | |
44 | 2C | , | |
45 | 2D | - | |
46 | 2E | . | |
47 | 2F | / |
使用burpsuite对报文进行抓包。
当Burp Suite 运行后,Burp Proxy 开启默认的8080 端口作为本地代理接口。通过设置一个web 浏览器使用其代理服务器,所有的网站流量可以被拦截,查看和修改。默认情况下,对非媒体资源的请求将被拦截并显示(可以通过Burp Proxy 选项里的options 选项修改默认值)。对所有通过Burp Proxy 网站流量使用预设的方案进行分析,然后纳入到目标站点地图中,来勾勒出一张包含访问的应用程序的内容和功能的画面。在Burp Suite 专业版中,默认情况下,Burp Scanner是被动地分析所有的请求来确定一系列的安全漏*洞。
我们使用社区版burpsuite进行测试。
下载地址为:https://portswigger.net/burp/communitydownload
burpsuite需要java环境支持,jdk7或者jdk8都可以。
下载地址为:https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
浏览器需要针对burpsuite进行一些配置。
打开工具--internet选项--连接--局域网设置,配置代理服务器,勾选为LAN使用代理服务器。
打开burpsuite,进入proxy选项。intercept is on表示拦截浏览器数据,并显示在burpsuite中,forward表示转发。不转发浏览器就无法正常工作,无法得到请求的数据。
GET /test/1.php HTTP/1.1 Accept: */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Accept-Encoding: gzip, deflate Host: 192.168.189.148 Pragma: no-cache Cookie: PHPSESSID=pt5bvc0pu8s2d72si3cl8nslfv Connection: close
HTTP请求由请求行、请求头、请求正文三个部分组成。
1、请求行包括以下内容
方法:GET
资源路径:/test/1.php
协议/版本:HTTP/1.1
2、请求头包括以下内容
从请求报文第二行开始到第一个空行为为止之间的内容。
其中包括很多字段。
3、GET报文没有请求正文,只有POST报文有请求正文
请求方法
GET
最常用的方法,通常用于请求服务器发送的某个资源。
POST
可以向服务器提交参数以及表单,包括文件流等。
HEAD
与GET类似,但是在服务器响应中只返回首部。
PUT
与GET方法相反,PUT方法可以向服务器中写入文档。
TRACE
回显浏览器的请求。
OPTIONS
请求WEB服务器告知器支持的各种功能。
DELETE
请求服务器删除请求URL所指定的资源。
HTTP/1.1 200 OK Date: Sat, 08 Jan 2022 13:58:31 GMT Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1b mod_fcgid/2.3.9a mod_log_rotate/1.02 X-Powered-By: PHP/7.1.9 Connection: close Content-Type: text/html; charset=UTF-8 Content-Length: 13 array(0) { }
cmd---telnet 192.168.189.148 80,回车
ctrl+]
回车
复制
GET /php/test/1.php HTTP/1.1 HOST:192.168.189.148
粘贴,回车
有响应,表示成功。
我们使用相同的方法对百度进行测试
获得了百度首页的源代码,将该源代码保存为2.html。进行访问。