开始读《HTTP抓包实战》,在这个作业满天飞的日子里,计划1周读完,本篇博文对其中的部分知识点做一下简单的记录。
1、HTTP抓包分析使用的工具不再是wireshark(研究TCP/IP协议使用),而是使用 fiddler,版本4。其实 fiddler 做HTTP数据包分析的原理就是相当于一个web代理,如下图:
fiddler在中间,可以记录所用的HTTP流量。fiddler启动时,会偷偷把 Internet 选项中的代理修改为 :127.0.0.1,端口: 8888; fiddler在关闭时,会自动在Internet选项中取消代理,这样就不会对其他程序产生影响。如下图:
fiddler界面如下图,使用方法请自行百度或google.
2、在 fiddler
中抓取 https
的流量,需要做如下图配置并安装证书。
像 IE
,chrome
等浏览器都是使用windows
证书库来验证证书,但是firefox
浏览器是自己维护一个证书列表,所以需要在firefox
中单独安装 fiddler
证书。在上图中的action
选项中可以下载fiddler
的根证书到桌面,firefox >> 工具 >> 选项 >> 隐私与安全 >> 证书 >> 查看证书 >> 证书机构
中可以导入证书,这里,fiddler
的作者开了个玩笑,证书名叫DO_NOT_TRUST_FiddlerRoot
。
3、在抓包时,我们经常能看到 tunnel to
的握手包,这对我们分析数据包没啥作用,可以在fiddler >> rules >> hide connects
中设置其隐藏掉。
4、Win+R输入certmgr.msc
查看windows
证书管理库
5、https://www.wangjibao.com.cn/2018/11/13/HTTP%E6%8A%93%E5%8C%85%E5%AE%9E%E6%88%98/#more
上面是个url
的例子,https
协议,www.wangjibao.com.cn
为域名,这里使用的是默认80
端口,所以省略端口显示,后面的/2018/11/13/HTTP%E6%8A%93%E5%8C%85%E5%AE%9E%E6%88%98/
代表资源的路径,后面的#
号代表啥呢,其实这是个 锚点(anchor)
,我们知道,当一个页面非常长的时候,我们可以在页面中根据锚点直接定位到我们需要的地方。
6、HTTP的状态码,200类是成功,300类代表重定向,400类代表客户端错误,500类错误代表服务器错误。
其中的206(Partial Content)
代表的是部分内容,迅雷、HTTP下载工具就是使用206
状态码来实现的断点续传。
当遇到301 或 302
的响应时,浏览器会自动根据response
中的重定向url
重新访问资源地址。如下图(京东之前叫360buy
):
先访问www.360buy.com
返回301
说这个网址已经move permanently
了,给了个http://www.jd.com
,然后,浏览器就是访问这个网址,但是服务器说302
,代表说,这次对了,但是为了安全,去访问另一个网址吧https://www.jd.com
吧,接着就会发现,129号中显示了tunnel to
,代表开始握手协商了。
其实,这里301或302
还是有区别的,301
代表旧url
已经永久移除了,搜索引擎会把权重计算到新的url
上。但302
代表旧url
还在,只是临时重定向到新url
上,搜索引擎会把权重计算到旧url
上。
7、常用的HTTP请求方法就是 get
和post
。
我们登录国科大的选课网站,在 fildder
中,可以清楚的看到,用户名和密码被包含在post
请求的body
中,发送给了服务器。同样,如果是get
请求,包含在url
中?
后面的字段可以在QueryString
中看到对应的Name--Value
字段。
8、可以在fiddler >> tools >> user-agent
中修改User-Agent
字段的值,如下图,再浏览某些网页时,就变成了对应的显示模式。
9、Ajax (Asynchronous Javascript And XML”: 异步 JavaScript 和 XML),是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
10、在 Rules >> Automatic Breakpoint >> after/before Response
中可以设置拦截HTTP
请求。比如,我可以设置拦击HTTP的响应,然后在raw
中修改页面的title
字段,点击Run to Completion
发成修改后的发送。
1号包中的红色代表拦截到了,这时别忘了,之前设置的全局断点给取消掉,不然会影响其他请求的发送和接收。效果如下图:
注意:修改操作必须在raw
选项框里。当然,也可以设置局部断点,bpu www.baidu.com
设置只拦截百度的请求,取消拦截在页面左下角的命令框中输入bpu
即可;bpafter www.baidu.com
拦截响应,bpafter
取消拦截响应。
11、浏览器中的缓存
如下图,浏览器想请求某个资源的时候,先检查本地缓存,如果本地缓存存在这个文件的时候,直接获取该文件的最后修改时间等信息,构造数据包发送请求(内含有If-Modified-Since
字段和If-None-Match
字段)给服务器,服务器根据这两个值,结合自身的Last-Modified
字段和Etag
字段来判断需不需要发送数据给浏览器,如果不需要(1、Request中的If-Modified-Since的时间大于或等于Resonse中的Last-Modified的时间;2、ETag值和If-None-Match相匹配,说明hash值不变文档没改变),则服务器发送 304 Response
给浏览器,告诉它,直接使用缓存就行了,节省时间加快网页加载速度。
当然,我们也可以 ctrl + F5
强制刷新浏览器,告诉服务器,我不使用缓存,请发送最新的数据资源给我。
其中的pragma
是HTTP1.0中使用的,Cache-Control
是现在HTTP1.1用的,同时存在这两个字段,完全是为了兼容。
12、URL
只能使用英文字母、数字或者某些标点符号,URL Encode(URL 编码)就是把所有非英文字母、数字字符都替换成百分号(%)后加两位十六进制数。如:
https://www.wangjibao.com.cn/2018/11/13/HTTP抓包实战
编码后变成了如下模式,
1 | https://www.wangjibao.com.cn/2018/11/13/HTTP%E6%8A%93%E5%8C%85%E5%AE%9E%E6%88%98/ |
13、Fiddler
提供了丰富的插件,可以在https://www.telerik.com/fiddler/add-ons中下载安装使用,如`Java Script Formatter、
Gallery、
WinDiff`(比较两个session的不同)等等。
14、 Fiddler
中可以在线调试 JavaScript
文件,使用的是AutoResponder
功能,如下图,其原理就是当命中某个文件时,自动替换成我们设置的文件返回给客户端,就不去服务器索取了。
当然,不仅可以替换 JS
文件,还可以替换网页中的图片为本地我们设置的图片。
15、我们还可以直接编辑Fiddler Script
来修改HTTP请求或者响应,并且不中断程序(之前介绍的设置断点的方式,会使得程序中断)。Rules >> Coustomize Rules
中,打开Fiddler ScriptEditor
来编辑CustomRules.js
文件,如图:
16、HTTP的Cookie
机制
因为HTTP
协议是无状态的,可以通过Cookie
来维持会话。登录 http://piaoweb.sstm.org.cn
,可以在fiddler
中看到cookie
的运行机制,如下图:
浏览器把Cookie
通过HTTP请求中的Header
发送给服务器,同时,服务器通过HTTP响应中的Header
(Set-Cookie机制)把Cookie
发送给浏览器。
上图中的 HttpOnly
字段是说通过JavaScript
脚本无法读取到Cookie
信息,可以有效防止XSS
攻击。
浏览器根据服务器返回的Set-Cookie
设置好本地Cookie
以后,浏览器每次请求服务器的资源时,就在Header
中将Cookie
附加上,这样,服务器就认为浏览器是登录状态。
17、Cookie劫持攻击
这里我们使用豆瓣
网为例,演示一下Cookie
劫持攻击。
(1)登录豆瓣网,用Fiddler
抓取登录过程产生的数据包,可以看到一个如下图中的包,里面含有我们需要的cookie
。
(2)我们打开这个会话的session
,可以看到用户的cookie
,其中的dbcl2
是和用户登录相关的。
(3)我们在该会话上右键,replay >> Reissue and Edit
,将cookie中的此字段删除,然后Run to Completion
放行,可以看到此时我们现在是非登录状态,并且跳转到了登录界面,服务器返回302
。
(4)现在我们知道,这个cookie
字段就是和用户登录相关的,并且已经劫持到了,那么如何利用它呢?可以利用之前提到的Fiddler Script
,编写脚本,每次发送数据包的时候,自动加上这个cookie不就行了,并且这个操作不会有任何中断。
在 Fiddler Script
中的OnBeforeRequest
函数中添加如下代码段:
1 | if(oSession.uriContains("douban.com")){ |
再次访问豆瓣网,发现自己已经处于登录状态了。
18、HTTP
基本验证
把用户名+冒号+密码
用Base64
编码后生成字符串,放在header
中的Authorization
字段中,发送给服务器。
19、手机Fiddler
抓包
手机和电脑处于同一局域网中,在fiddler >> Tools >> Options >> Connections
中将allow remote computers to connect
勾选上,同时在手机的wlan
设置中,将其代理设置成电脑,IP
为电脑IP,端口为8888
;同时,在手机的安全设置中可以安装之前下载的fiddler root
根证书,这样,就可以捕获到手机的https
数据包了。
20、Replay
菜单的详细说明:
Reissue Requests
:重新发送请求,和菜单栏上的Replay
按钮是一样的功能。
Reissue Unconditionally
:无条件反复发送选中的请求。
Reissue and Edit
:把选中的请求以原来的形式重新发送,在每个新的Session
中设置断点,在请求发送给服务器之前,可以修改请求。
Reissue and Verify
:重新发送请求,检查响应,如果响应和上一个请求一样,就会变成绿色。
Reissue Sequentially
:选中多个Session
会按顺序一个一个重新发送请求,是单线程模式。
Reissue from Composer
:在Composer
中编辑该请求。
Revisit in IE
:在IE
浏览器中用Get
方法访问这个请求。
21、重放攻击,在Fiddler
中,可以使用Composer
编辑数据包并进行发送。
其实,重放攻击危害很大,比如说,某网站的投票或者点赞功能,当我们抓取到某个点赞的包时,我们可以重复发送这个数据包来进行刷票。再比如说,某些软件的注册,当我们抓取到某个注册请求包的时候,我们进行大量重复发送,对app
造成的损失还是很大的。
解决方案:在HTTP
请求中,添加时间戳stamp
和数字签名sign
。数字签名保证有效性,时间戳保证时效性。
22、后面的3–4个章节是使用JMeter
对网站做自动化测试和压力测试的,在此略过。