基础知识
URL:统一资源定位符,表明所请求资源的位置和请求方法
格式:schema://host[:port#]/path/.../[?query-string][#anchor]
含义:底层协议://服务器域名或IP[:端口#]/路径/.../[发送给服务器的数据][锚]
其中域名结构为:[子域名].[域名].[根域名]
Web通信基本流程
- 建立连接。在浏览器打开www.baidu.com,本机会把这个url发给DNS服务器,如果能够解析到域名对应的ip则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS服务器,整个DNS可以看做是一个树状结构,该请求将一直发送到根域名服务器直到得到结果。DNS服务器通过域名找到服务器ip地址后,建立一个socket连接。socket是通过ip和端口建立的,如果url里不包含端口号,则会使用该协议的默认端口号。http默认端口号为80,https为443
- Web浏览器发送请求
- Web服务器做出响应, 语言解释器执行脚本,从数据库调取相应的数据返回给服务器,服务器组装成HTML页面再返回给客户端
- 关闭连接
Web服务端组成
- 操作系统
- Web服务器
- 语言解释器
- 数据库
流行的Web服务端架构:操作系统+WEB服务+解释执行环境+数据库服务
- .NET:Windows+IIS+ASP(.NET) +MSSQL
- LAMP:Linux +Apache+PHP+MySQL
- LNMP:Linux +Nginx+PHP+MySQL
- J2EE:UNIX/Windows +Tomcat +JSP +Oracle
HTTP:超文本传输协议,基于请求和响应模式,是一种是无状态的应用层协议,下一次请求与上一次请求无关
HTTP请求报文组成:请求行(请求方法)、请求头(消息报头)、请求正文。请求头后面以空白行代表请求头结束
HTTP响应报文组成:响应行、响应头、响应正文。响应头后面以空白行代表响应头结束
请求报文的第一行为请求行,格式通常为:请求方法/所请求资源的路径/HTTP协议版本
如:GE/index.php HTTP/1.1
HTTP请求方法
GET(直接在url显示):请求获取由Request-URL所标识的资源
POST(登录时较多):在Request-URL所标识的资源后附加新的数据
HEAD:请求获取由Request-URL所标识的资源的响应消息报头
OPTIONS:请求查询服务器的性能,或查询与资源相关的选项和需求
PUT:请求服务器存储一个资源,并用Request-URL作为其标识
DELETE:请求服务器删除由Request-URL所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:要求用隧道协议连接代理
日常绝大多数请求方法为GET或POST,但是对其他请求方法也要了解
请求行和空白行之间的全部属于请求头的内容,请求头的参数在不同场景不尽相同,我们抓个完整的数据包分析
HTTP请求报文
POST /dvwa/login.php HTTP/1.1
Host: 192.168.3.113
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Content-Type: application/x-www-form-urlencoded
Content-Length: 88
Referer: http://192.168.3.113/dvwa/login.php
Cookie: security=low; PHPSESSID=9uh9403hnaesaomusm5l0d1673
Connection: close
username=admin&password=password&Login=Login&user_token=0405b0cd775307c0bd91e28779c2db94
请求头参数含义
Host:指定请求的主机地址和端口号
User-Agent:用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及 版本、浏览器渲染引擎、浏览器语言、浏览器插件等
Accept:代表客户端希望接受的数据类型
Accept-Language:指定一种客户端希望接受的自然语言
Content-Type:向接受端表明发送的介质类型
Content-Length:用于描述HTTP消息实体的传输长度
Referer:包含一个URL,告诉服务器该请求的来源,可用来判断来源的合法性,防止盗链和CSRF
Cookie:一段文本,表示请求者身份。Cookie 重要字段:名称[name]值[value]所属域名[domain]所属相对根路径[path]过期时间[expires][http-only][secure]。若没设置cookie过期时间则为内存Cookie :浏览器关闭而消失;本地Cookie :保存在本地;部分cookie具有httponly属性,目的是阻止客户端脚本访问Cookie,防止XSS攻击
Connection:当前链接是否保持
初此之外还有其他重要参数
X-Forward-for:XFF头,代表请求端的IP,可以有多个,以逗号隔开,用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段
HTTP响应头报文
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 30 Jul 2017 09:22:41 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Vary: Accept-Encoding
X-Powered-By: PHP/7.0.7
Link: <http://www.hzwang.top/wp-json/>; rel="https://api.w.org/"
Content-Length: 40228
第一行为响应行,表明了HTTP协议版本和服务器响应状态
状态码第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值:
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求
server:包含了服务器用来处理请求的软件信息及其版本
Set-Cookie:向本地保存cookie
下面使用telnet模拟http
先编写请求报文
GET(POST或HEAD) / HTTP/1.1
HOST:www.baidu.com
DOS命令窗口执行:telnet www.baidu.com 80
按下ctrl + ]
然后回车
粘贴我们编写好的请求报文
连续两次回车
可以看到成功获取到了响应报文信息,还可以将GET方法改为POST或HEAD,这里不再赘述,大家自行尝试
HTTPS协议是比HTTP更为安全的一种协议,这种关系可以比喻为telnet和ssh,HTTP和telnet的数据都是明文进行传输的,例如我们上面抓取的登录DVWA的数据包,用户名和密码都是明文的,而HTTPS和ssh都是加密传输的。HTTPS是在传输层和应用层之间加了一层SSL,所有的信息都会进行加密传输,并且在数据开始传输之前要互相进行身份认证。SSL是通过证书来验证服务器的身份的,因此HTTPS需要申请CA证书,一般是需要付费的
SSL协议提供的安全通道有以下三个特性
机密性:SSL协议使用密钥加密通信数据
可靠性:服务器和客户都会被认证,客户的认证是可选的
完整性:SSL协议会对传送的数据进行完整性检查