Linux基础(17)HTTP及SSL解析
DNS( Domain Name Systme域名系统), 而DNS解析则是同过域名解析出其代表的IP地址
ISP(Internet Service Provider)互联网服务提供商,域名都是有备案的,所以ISP都会有保存其域名和服务器IP地址, .CN是向中国互联网管理局申请 .COM是向美国互联网管理机构申请 , 一般域名都是向代理商申请域名的,不然很麻烦
DNS解析流程: 本地主机(浏览器)---->先访问本地DNS是否有DNS解析出来的缓存-------->如果没有缓存则访问ISP的DNS服务器-------->ISP发送访问请求给目标的根服务器----------->目标根服务器返回给ISP一个域名服务器的IP----------->经ISP访问该IP可访问-------->ISP返回该IP给本地主机(浏览器)-------->本地主机(浏览器)缓存并访问ISP返回的目标IP(与服务器建立TCP连接), 经过该次后本地DNS会缓存该域名代表的IP
图片来源: https://www.zhihu.com/question/23042131/answer/1220848249
URL(Uniform Resource Location)译为 统一资源定位符 ,也可理解为服务器开放访问的路径(URL由协议,主机,端口(默认80)及文件名及其路径三部分组成)
HTTP报文结构
HTTP(HyperText Transfer Protocol, 超文本传输协议)是一种基于URL将超文本(视频,图片,音频,文本)从一台主机(web服务器)传输到另外一台主机(浏览器)的应用层协议,以实现超链接的的功能
报文的完全解析: https://www.cnblogs.com/xzsty/p/11452610.html
请求报文的解析:
请求报文的方法: 主要常用方法GET和POST
GET和POST的区别:
GET的请求数据会附加在请求行的URL之后以问号分割 , POST的请求数据会以表单的方式附加在首部行之后
Frame 4585: 573 bytes on wire (4584 bits), 573 bytes captured (4584 bits) on interface 0 Ethernet II, Src: IntelCor_6f:98:34 (58:91:cf:6f:98:34), Dst: Vmware_85:72:a5 (00:0c:29:85:72:a5) Internet Protocol Version 4, Src: 192.168.199.26, Dst: 192.168.199.183 Transmission Control Protocol, Src Port: 50780, Dst Port: 8000, Seq: 1, Ack: 1, Len: 519 Hypertext Transfer Protocol GET /cgi-bin/getAuth?email=1111%40qq.com&password=12345678 HTTP/1.1\r\n //请求行
//host关键字 一直到 Accept-Language关键字 都是首部行,首部行没有固定关键字数,都是需要什么就加什么,以\r\n表示换行 Host: 192.168.199.183:8000\r\n Connection: keep-alive\r\n Upgrade-Insecure-Requests: 1\r\n User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n Referer: http://192.168.199.183:8000/getAuth.html\r\n Accept-Encoding: gzip, deflate\r\n Accept-Language: zh-CN,zh;q=0.9\r\n \r\n [Full request URI: http://192.168.199.183:8000/cgi-bin/getAuth?email=1111%40qq.com&password=12345678] [HTTP request 1/1] [Response in frame: 4588]
Frame 1154: 712 bytes on wire (5696 bits), 712 bytes captured (5696 bits) on interface 0 Ethernet II, Src: IntelCor_6f:98:34 (58:91:cf:6f:98:34), Dst: Vmware_85:72:a5 (00:0c:29:85:72:a5) Internet Protocol Version 4, Src: 192.168.199.26, Dst: 192.168.199.183 Transmission Control Protocol, Src Port: 50872, Dst Port: 8000, Seq: 1, Ack: 1, Len: 658 Hypertext Transfer Protocol POST /cgi-bin/postAuth HTTP/1.1\r\n Host: 192.168.199.183:8000\r\n Connection: keep-alive\r\n Content-Length: 42\r\n Cache-Control: max-age=0\r\n Origin: http://192.168.199.183:8000\r\n Upgrade-Insecure-Requests: 1\r\n Content-Type: application/x-www-form-urlencoded\r\n User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\r\n Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3\r\n Referer: http://192.168.199.183:8000/postAuth.html\r\n Accept-Encoding: gzip, deflate\r\n Accept-Language: zh-CN,zh;q=0.9\r\n \r\n [Full request URI: http://192.168.199.183:8000/cgi-bin/postAuth] [HTTP request 1/1] [Response in frame: 1159] File Data: 42 bytes HTML Form URL Encoded: application/x-www-form-urlencoded Form item: "email" = "dasdsada@qq.com" Form item: "password" = "123456789"
主机 Host: 域名 或 ip:addr:port
____________________________________________
连接方式 Connection: keep-alive 或 close
长连接(keep-alive): 服务器需求 计时心跳,长时间的实时传输数据等 时 使用长连接
短连接(close): 请求的服务器资源较小,短时间内只请求一两次时就使用短连接(请求一次后就断开TCP的连接)
_____________________________________________________________
内容长度 Content-Length: 内容的长度(不包括首部行)
______________________________________________________________
缓存控制 Cache-Control: Max-age = 在设定时间内(单位是秒)都不会再 发送请求报文 到服务器, 数据由缓存返回给浏览器, 过了指定时间后再发送请求 由服务器决定是返回新数据还是仍然由缓存提供
___________________________________________________________________
请求信息 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\r\n
Mozilla/5.0指浏览器内核版本 (Windows NT 6.1; WOW64)指操作系统的版本
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36\r\n 指支持哪种浏览器访问
也是爬虫的手段 ,一般爬虫都会默认的告诉服务器 是一个python的爬取请求, 而网站服务器是禁止爬虫访问的,会通过更改User-Agent骗过服务器 取自:https://www.jianshu.com/p/c5cf6a1967d1 更可以识别出是移动端还是PC端, 根据客户端的不同展现出相应的页面
__________________________________________________________________________
Accept: 标识可接收或不可接收的数据类型(比如 text/html,application/xhtml+xml,application/xml;)
Accept-Encoding: 编码类型
____________________________________________________________________________
回应报文的解析:
状态码: 303是转载页面,钓鱼网站也是通过劫持服务器后返回一个钓鱼网页给浏览器访问在输入账户密码后又转载到被劫持的服务器的html里,从而进行非法行为
HTTP代理: 比如要访问谷歌,但是谷歌的IP被长城给封了, 这时可以访问一个没有被封的外网IP , 该服务器开启HTTP代理服务, 浏览器给代理发出HTTP请求,,代理把请求内容取下,代为给谷歌发送请求, 谷歌收到后给代理响应请求, 代理收到响应后再次把内容取下重新封装内容再返回给浏览器,从而绕过防火墙
_______________________________________________________________________
深度解析User-Agent
可以使用libuaparser动态解析User-Agent从而获得用户的详细信息
可以使用nmap修改User-Agent的信息 , https://www.cnblogs.com/yogah/p/9640178.html
在程序里如何快速的解析出HTTP协议? 可以根据 \r\n 来确定 首部行 里某一行字符行的内容, "空格 /" 用来区分字段(比如:方法 /url /版本\r\n)
void get_http_command(char *http_msg, char *command) { char *p_end = http_msg; char *p_start = http_msg; while (*p_start) //GET /url { if (*p_start == '/') { break; } p_start++; } p_start++; // /url... HTTP/1.1\r\n p_end = strchr(http_msg, '\n'); while (p_end != p_start) //end指向的url和协议版本直接的空格 { if (*p_end == ' ') { break; } p_end--; } strncpy(command, p_start, p_end - p_start); }
HTTPS
概念: HTTPS = HTTP + SSL(Secure Sockets Layer 安全/加密 套接字)
shell: apt-get install openssl
ssl加密使用openssl库, ssl库提供了两部分,加密套件(提供了加密API可以用MD5,对称,非对称等加密方式) 和 https的通信
加密基础知识:
现在主要的加密技术有3种: 1.对称加密 2.非对称加密 3.单向加密
2.非对称加密:非对称加密方式解决了对称加密的缺陷,它的加密和解密密钥是不同的,比如对一组数字加密,我们可以用公钥对其加密,然后我们想要将其还原,就必须用私钥进行解密,公钥和私钥是配对使用的,常见的非对称加密算法有: 优点: 加密和解密 用不同密钥 缺点:加密速度非常慢 RSA:既可以用来加密解密,又可以用来实现用户认证 DSA:只能用来加密解密,所以使用范围没有RSA广 非对称加密长度通常有512,1024,2048,4096位,最常用的就是2048位,长度固然可以增加安全性但是需要花费很长时间来进行加密/解密,和对称加密相比,加密/解密的时间差不多是对称加密的1000倍,所以我们通常用其作为用户认证,用对称加密来实现数据的加密/解密
3.单项加密: 单向加密就是用来计算一段数据的特征码的,为了防止用户通过“暴力破解”的方式解密,所以单向加密一般具有“雪崩效应”就是说:只要被加密内容有一点点的不同,加密所得结果就会有很大的变化。单项加密还有一个特点就是无论被加密的内容多长/短,加密的结果(就是提取特征码)是定长的,用途:用于验证数据的完整性,常用的单项加密算法 特点:加密后的数据长度固定:128 雪崩效应 MD5:这种加密算法固定长度为128位
https的加密方式: 一般都是复式的加密方式, 先使用单向加密对真实数据进行加密(保证数据的完整性,防止暴力破解) , 再使用对称加密对单向加密的特征码进行加密(每个对称加密都是随机数生成的,所以每一个包的对称秘钥都是不同的), 而对称加密的秘钥则被非对称加密, 让后客户端把加密好的数据包连同(服务端提供的)公钥发送给服务端, 服务端收到后使用私钥对数据包一层一层的解密
HTTPS的通信流程: TCP建立连接后经过如下图所示的一系列认证后才开始应用数据的交互