Fiddler官网:
https://www.telerik.com/fiddler
Fiddler Forum:
https://www.telerik.com/forums/fiddler?searchText=winconfig
Fiddler 插件下载:
https://www.telerik.com/fiddler/add-ons
Firebug:是 Mozilla Firefox 网页浏览器扩展,也是一个网页开发工具。
httpWatch:是强大的网页数据分析工具,集成在Internet Explorer工具栏。包括网页摘要Cookies管理,缓存管理,消息头发送/接受,字符查询,POST 数据和目录管理功能,报告输出,HttpWatch 是一款能够收集并显示深层信息的软件。
charles:界面相较与fiddler要简洁,主要用于Mac平台。
Wireshark:网络包分析工具,也是通用抓包工具,抓取信息量庞大且详细;是需要过滤信息才能得到有用信息,基本所有的通信抓包都可以抓取。
Fiddler :使用比较简单,很好用的Web调试工具之一,记录所有客户端和服务器的http和https请求,允许监视,设置断点,甚至修改输入输出数据等。
Fiddler是C#语言开发;http协议调试代理工具,能够记录电脑与互联网之间http通讯,同时可设置断点,查看所有通讯的Fiddler数据(指cookie,html,js,css等文件)。
Fiddler是以代理web服务器的形式工作的,在客户端和服务器之间建立一个代理服务器,监听客户端发出的请求和服务器返回的响应结果,默认端口8888。
客户端将请求数据发送出去后,会先经过代理服务,代理服务可以对请求处理再发送给服务器;
服务器的响应数据返回给客户端,也会先通过代理服务,也可做相应的修改,返回给客户端。
工作于七层中的应用层,也可以捕获通过的HTTP(S)请求。
解析过程如下:
客户端请求建立HTTPS连接,发送客户端支持的加密协议和版本列表等信息给服务器;
Fiddler接受客户端的请求并伪装成客户端发送相同的请求给Web服务器;
Web服务器收到Fiddler的请求后,从请求中筛选出合适的加密协议并返回服务器CA证书,证书中包含公钥信息;
Fiddler收到服务器响应之后,保存服务器证书并自签名一个证书,伪装成服务器将该证书下发给客户端;
客户端验证证书的合法性(Fiddler能否抓取到HTTPS报文关键就看这一步了);
客户端生产对称密钥并使用自签名证书的公钥进行加密,发送给服务器;
Fiddler拦截客户端的请求之后,使用私钥解密该报文,获取对称密钥并使用CA证书的公钥加密,再发送给Web服务器;
Web服务器接收到客户端加密后的对称密钥,采用私钥解密,并使用对称密钥解密测试数据传给客户端;
Fiddler使用前面获取的对称密钥解密报文;
客户端验证数据无误后,HTTPS连接建立完成,此时客户端开始向服务器发送使用对称密钥加密的业务数据;
Fiddler使用前面获取的对称密钥解密客户端发送的数据并重新加密转发给客户端。
官网下载后,直接打开安装即可。
相关链接:https://cloud.tencent.com/developer/article/1342186
第一步:先安装Mono安装
首先,Mac下需要使用.Net编译后的程序,需要用到跨平台的方案Mono(现阶段微软已推出跨平台的方案.Net Core,不过暂时只支持控制台程序)。安装程序可以从http://www.mono-project.com/download/#download-mac地址下载。
安装完后,在Terminal里执行以下命令:
/Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import --sync
此步是为了从Mozilla LXR上下载所有受信任的root证书,存于Mono的证书库里。
root证书能用于请求https地址。
接下来如果想要运行Fiddler,还需要把Mono加入到环境变量中。
编辑.bash_profile文件:
sudo vi ~/.bash_profile
加入文本:
export MONO_HOME=/Library/Frameworks/Mono.framework/Versions/5.0.1
export PATH=$PATH:$MONO_HOME/bin
保存后重新打开Terminal,Mono环境已装好。
第二步:Fiddler的安装
从Fiddler官网https://www.telerik.com/download/fiddler下载fiddler-mac.zip的压缩包。
解压到非中文字符的路径下。
Fiddler运行
打开Terminal,进入到刚才解压的Fiddler路径,执行命令运行:
sudo mono Fiddler.exe
总结:没有设置允许跨域访问,但是依然请求到了数据。
这说明跨域访问的限制并不是浏览器限制发送请求,而是浏览器阻止了请求后数据的加载渲染。
1)、请求允许跨域的访问的url
响应头带有"Access-Control-Allow-Origin","*",告知浏览器可以跨域访问。
浏览器收到response信息,并且检查到响应头中有"Access-Control-Allow-Origin", “*”,因此将数据展示出来。
2)、请求不允许跨域的访问的url
响应头不带有"Access-Control-Allow-Origin","*",没有表示能够跨域访问的请求头信息,所以浏览器不可以跨域访问。
页面收到了信息,但是没有检查到响应头中有允许跨域访问的设置,因此没有对数据进行加载渲染。并且报出下面的异常:No 'Access-Control-Allow-Origin' header ispresent on the requested resource。
前端跨域
跨域的来源是同源策略,为什么要有同源策略也是为了安全着想,防止遭受一些网络攻击,比如:csrf(跨站请求伪造)等。
一句话总结:跨域的拦截不是浏览器在请求前拒绝访问不同源URL而是在请求非同源URL后拒绝加载数据!!!
浏览器发送跨域请求
接收response数据
看看响应头是否带有"Access-Control-Allow-Origin","*"这类允许跨域的字样
检查响应头
如果响应头中没有允许跨域访问的配置,则请求到的数据不进行加载,并报出响应异常
如果响应头中有允许跨域访问的设置,正常加载数据
iddler简介
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件)。 Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式.
Fiddler使用c#语言开发,是一个开源软件。它包含一个简单却功能强大的基于JScript .NET 事件脚本子系统,它的灵活性非常棒,可以支持众多的http调试任务,并且能够使用c#语言进行扩展。他还提供一系列接口以支持插件开发。
Fiddler是基于代理模式工作的,简单来说,当你打开Fiddler软件,他会开始监听本机8888端口。然后将系统默认代理设置为127.0.0.1:8888。这样本机所有使用系统代理的软件包括浏览器会先把数据发送到Fiddler,然后Fiddler再将数据发送到服务器。服务器返回的数据先发送给Fiddler,再由Fiddler发送到指定的程序。在这个过程中Fiddler起到了转发数据(代理)的作用。由于数据无论是请求还是响应都通过Fiddler进行转发,所以Fiddler有权限对数据进行获取、存储、修改等操作。
Fiddler安装
打开https://www.telerik.com/fiddler,点击Free download进行下载。
安装过程很简单绿色,选择好安装路径,点击Install就可以了。这里特别注意下,你要记住你的安装路径,因为Fiddler默认不会创建桌面快捷方式,需要你去安装目录打开程序或者手动创建快捷方式。
Fiddler安装
界面简介
Fiddler界面
使用及设置
Fiddler功能繁杂,不好以图文的形式把每一项讲清楚。下面我讲一些日常使用的、关键的按钮、功能和设置。
安装完成后我们一般先进行几项很重要的设置,首先点击Tools->options->Connections
Fiddler
在这里我们可以修改Fiddler监听的端口,勾选红圈标示出来的这项,允许远程计算机连接。以便在以后我们抓取手机等移动设备的数据包。勾选之后在手机Wifi设置里设置代理为 “内网IP:8888"(如 192.168.1.2:8888)就可以抓取手机的HTTP数据包。
然后再将标签页切换到HTTPS,以设置Fiddler可以抓取https数据包
Fiddler设置
勾选以上几项,期间会弹出证书安装,一路确认下去。完成之后,你的Fiddler就可以抓取本机的https数据包
Fiddler工具栏
工具栏中我们主要介绍红圈选中的几个功能。X是用来清空当前数据记录的。
Decode选中之后会自动尝试解压响应的内容,包括但不限于以下格式(gzip、deflate、bzip2、brotli)。
"Keep 1000 sessions"表示显示多少条数据记录,默认显示全部,这里建议设置为500或者1000,默认全部的话,时间久了会把你电脑内存耗光.
Any Process 这个按钮可以拖动选择抓指定应用程序的包,比如拖动到firefox就只显示firefox的数据包。默认显示全部应用程序。
Save按钮可以把当前的数据记录保存到硬盘,以便在方便的时候重新打开分析
Clear Cache是清除浏览器缓存,基本不用
TextWizard是个功能非常强大的编码解码工具,支持多种格式。会经常用到
TextWizard
鼠标放到Online按钮上,会显示你当前的网卡信息、内网IP。方便给手机设置代理的时候查看。
当在左侧选择一条数据记录时,右侧会显示该请求的具体信息
请求数据
Headers会显示请求头的一些信息,例如是GET还是POST、浏览器UA、cookie等
Textview和SyntaxView功能基本一样,用来显示post数据的原始明文格式(UTF-8),如果是二进制数据则显示乱码
WebForms会更清晰的展示你的post内容(仅限于&连接格式的post内容,如果是json格式,这里不显示)
HexView,以16进制显示你的整个请求包
Auth,显示授权信息
Cookie,用来显示请求携带的cookie信息
raw,以明文(utf-8)显示整个请求头信息包含post内容
json,以json格式显示post内容
xml,以xml格式显示post内容
以下是服务器响应的响应信息截图
Headers显示响应头信息
TextView和SyntaxView作用相似,用来显示服务器返回的具体内容。当返回内容非常大的时候TextView会卡死很久才显示。SyntaxView比TextView响应快很多
ImageView,如果服务器返回的是图片流的话,会在这个标签显示图片
HexView,以16进制显示返回内容
WebView,如果返回的是html代码,这个标签会解析html并显示网页
Auth,显示返回的授权信息
Caching,显示缓冲
Cookie,显示服务器返回的cookie
Raw,以明文(utf-8)显示完整的响应数据包
Json,以json格式显示返回内容
XML,以xml格式显示返回内容
Composer工具介绍
Composer工具在Fiddler中使用率非常高,常常用来模拟一些数据的提交
上图我们使用Composer工具,模拟提交了百度翻译的数据包。我们提交一个请求,询问服务器China的意思是什么?
服务器给我们返回以上词义。返回格式为json格式。
Fiddler命令行
在命令行中我们基本只需要掌握bpu命令就可以了,这是一个数据劫持命令
我们在命令行中输入bpu http://fanyi.baidu.com/sug 然后回车,Fiddler会监听并劫持发往和返回http://fanyi.baidu.com/sug的所有数据,并支持中途编辑修改。
我们把我们提交的china关键词改成japan,发现服务器给我们返回了japan的翻译
通过这个命令,我们既可以修改请求,也可以修改响应。常常用来劫持数据,例如你玩的某个游戏里,你有100个金币,通过劫持数据,你可以吧自己的金币数量修改成1万甚至更多。
抓包实战
我们通过一个示例,来强化上面的学习。我们来使用Fiddler抓取百度翻译输入china的数据包,然后使用我们熟悉的编程语言来写一个翻译软件。
首先我们打开百度翻译(http://fanyi.baidu.com/#en/zh/),输入china,观察Fiddler中抓到的数据。
通过逐条查看,或者搜索china字样,我们找到了一个异步请求数据包,这个包是用来做词义联想的,虽然不是最终的翻译数据包,但是该包相对简单也可以实现翻译功能,我们就来模拟这个包实现翻译功能。
我们按住这条记录,拖动到Composer工具里,简单调试去除一下无用的头部信息,看浏览器是否能正常返回。我们精简后的请求为下图示例
下面我们使用python编程模拟这个请求
import http
import json
from urllib import parse
keyword=input('请输入要翻译的单词:')
#构造请求头信息
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36\
(KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36'
,'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}
conn=http.client.HTTPConnection("fanyi.baidu.com") #创建HTTP连接
body={'kw': keyword} #构造post信息
body=parse.urlencode(body) #对post内容进行url编码
conn.request("POST","/sug",body=body,headers=headers) #开始请求
response=conn.getresponse() #获取响应
if(response.status==200): #判断服务器响应代码为200的话即返回正常
result=response.read().decode('utf-8'); #获取响应数据
result=json.loads(result) #解析json
print('翻译内容为:',result['data'][0]['v']) #输出翻译内容
else:
print('出现错误') #如果服务器响应代码不是200,是500或者404或者其他错误代码,都显示为错误
下篇文章会详细讲解如何使用Fiddler抓取手机包,如何设置代理,安装证书等。
喜欢的请关注我,转载请注明出处
多时候,我们使用抓包工具抓取和分析的为HTTP协议,所以,必须要了解HTTP协议。否则抓包工具无从学起。
HTTP协议
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
1、支持客户/服务器模式。 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2.灵活: HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3.无连接: 无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4.无状态: HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
请求类型:
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF, 其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
请求方法(所有方法全为大写)有多种,各个方法的解释如下:
请求方法 | 说明 |
---|---|
GET | 请求获取Request-URI所标识的资源 |
POST | 在Request-URI所标识的资源后附加新的数据 |
HEAD | 请求获取由Request-URI所标识的资源的响应消息报头 |
PUT | 请求服务器存储一个资源,并用Request-URI作为其标识 |
DELETE | 请求服务器删除Request-URI所标识的资源 |
TRACE | 请求服务器回送收到的请求信息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态代码、状态说明: 200 OK //客户端请求成功 400 Bad Request //客户端请求有语法错误,不能被服务器所理解 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden //服务器收到请求,但是拒绝提供服务 404 Not Found //请求资源不存在,eg:输入了错误的URL 500 Internal Server Error //服务器发生不可预期的错误 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
请求头信息与响应头信息:
请求头信息
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头:
Accept:请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Encoding:请求报头域类似于Accept,但是它是用于指定可接受的内容编码。
Accept-Language:请求报头域类似于Accept,但是它是用于指定一种自然语言。
Connection:允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性。
Host(发送请求时,该报头域是必需的),Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的。
User-Agent:请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。
响应头信息
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
常用的响应报头:
Location:响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
Server:响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。
WWW-Authenticate:响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
X-Frame-Options: 有三个值:DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。SAMEORIGIN表示该页面可以在相同域名页面的 frame 中展示。ALLOW-FROM uri 表示该页面可以在指定来源的frame中展示。
Fildder是一款免费的web调试代理工具,支持任何浏览器、系统或平台。
官方网站:https://www.telerik.com/fiddler
Fiddler是以代理Web服务器的形式工作的,浏览器与服务器之间通过建立TCP连接以HTTP协议进行通信,浏览器默认通过自己发送HTTP请求到服务器,它使用代理地址:127.0.0.1
端口:8888
开启Fiddler后,通过浏览器访问:http://127.0.0.1:8888
点击这里下载Fiddler。不过,更简单的方式是直接在百度中搜索,通过百度软件中心下载。
安装过程这里省略。启动Fiddler,主界面如下:
*请认真填写需求信息,我们会在24小时内与您取得联系。