1.1 Burp Suite
Burp Suite(简称Burp)是一款Web安全领域的跨平台工具,基于Java开发。它集成了很多用于发现常见Web漏洞的模块,如Proxy、Spider、Scanner、Intruder、Repeater等。所有的模块共享一个能处理并显示HTTP消息的扩展框架,模块之间无缝交换信息,可以大大提高完成Web题目的效率。接下来将为大家介绍几个在CTF中常用的模块。
1.Proxy代理模块
代理模块是Burp的核心模块,自然也会是我们使用最多的一个模块。它主要用来截获并修改浏览器、手机App等客户端的HTTP/HTTPS数据包。
要想使用Burp,必须先设置代理端口。依次选择Proxy→Options→Proxy Listeners→Add增加代理,如图1-1所示。
在Bind to port一栏内填写侦听的端口,这里以8080端口为例。如果要在本机使用,可以将Bind to address设置为Loopback only;如果要让局域网内的设备使用代理,则应该选择All interfaces。点击OK按钮后勾选Running,如图1-2所示。
下面以IE浏览器为例,在浏览器上依次选择Internet选项→连接→局域网设置,然后在“代理服务器”一栏中填写前文配置的Burp代理IP地址和端口,配置界面如图1-3所示。
图1-1 设置代理
图1-2 代理监听状态
图1-3 IE浏览器代理设置界面
设置完成后就可以通过Burp代理来抓取IE浏览器的数据包了,如果使用的是Firefox或者是Chrome浏览器,则可在相应浏览器的配置项或插件中进行设置。
不过,以上方法会显得十分复杂,而且当我们不需要代理或需要切换代理时会非常不方便。这时候可以在浏览器中添加一些附加组件(在接下来的小节中将会介绍),从而可以方便地进行代理切换。
接下来,在Proxy→Intercept选项卡下设置Intercept is on,这样就能截获浏览器的数据包并进行修改等操作了。如果设置Intercept is off,则不会将数据包拦截下来,而是会在HTTP history中记录该请求。
在数据包内容展示界面上单击右键,可以将这个数据包发送给Intruder、Repeater、Comparer、Decoder等模块,如图1-4所示。
图1-4 发送数据包到其他模块
2.Repeater重放模块
在需要手工测试HTTP Header中的Cookie或User-Agent等浏览器不可修改的字段是否存在注入点,以及需要发现复杂的POST数据包中是否存在SSRF时,一般需要用到Repeater模块。
在Proxy中单击右键并选择Send to Repeater(或者Ctrl+r)就可以将截获的数据包发向Repeater模块,这个模块应属于实践中最常用的模块。在这个模块中,左边为将要发送的原始HTTP请求,右边为服务器返回的数据。在界面左侧可以方便地修改将要发送的数据包,用于手工测试Payload等操作,修改完成后点击Go按钮,即可在右侧收到服务器的响应。这里以笔者的一台虚拟机为例进行说明,如图1-5所示。
图1-5 Repeater模块
下面详细介绍左侧的Headers和Hex标签页。
Headers标签页既可以方便地添加HTTP头信息,又可以避免在手动修改HTTP头时因缺少空格等原因产生问题。例如,我们有时候会在CTF中遇到检查IP地址的题目,此时就可以添加X-Forwarded-For、X-Real-IP等HTTP头尝试绕过。在添加之后,可以在Raw标签页中发现这个新增加的HTTP头信息。
Hex标签页更多用于修改HTTP数据包的十六进制编码。比如,可以将其用在文件上传类型的CTF题目中以截断后缀,或者是使用这些编码来对WAF进行模糊测试,并让我们可以顺利上传Webshell,该部分的相关内容将会在后面的小节中提到。
3.Intruder暴力破解模块
暴力破解(以下简称“爆破”)是一种低成本但可能带来高回报的攻击方式。大家应该了解过近些年出现的各种撞库漏洞。当然,在撞库的时候需要考虑性能和效率以进行多线程并发。这时候可以用Python或其他语言编写脚本进行撞库。Burp中也提供了简单易用的Intruder模块来进行爆破。
Intruder模块包含Sniper、Battering ram、Pitchfork、Cluster bomb等四种攻击类型,可以方便地进行Fuzz等测试。在Proxy等模块中,在想要测试的数据包上点击右键并选择Send to Intruder(或者Ctrl+l)即可将数据包发向Intruder模块。Intruder模块中包含了Target、Position、Payload、Options这四个标签页,可分别用于设置不同的功能,下面笔者将依次对其进行介绍。
在Target标签页中可以设置攻击目标的地址(Host)和目标端口(Port),并且可以选择是否使用HTTPS,如图1-6所示。
图1-6 设置攻击目标
在Position标签页中可以设置攻击的位置和攻击的方法。攻击位置可以自动选择(一般自动选择的变量通常会比较多,不推荐自动选择)。手动选择的方法是:如果你的Burp已经进行了自动选择,那么先点击Clear§按钮,然后选择你要爆破的变量,再点击Add§按钮即可,如图1-7所示。
图1-7 设置方法与攻击位置
接下来笔者将介绍四种攻击类型(Attack type),下面以有两个要爆破的变量为例进行说明。
(1)Sniper型
只需要设置一个Payload set,在两个变量的位置逐一替换Payload,每次只替换一个位置,先替换前面再替换后面。如果你的Payload set中有两个Payload,那么在爆破时会发送四次请求,结果如表1-1所示。
表1-1 Sniper型攻击请求过程
(2)Battering ram型
只需要设置一个Payload set,在两个变量的位置同时替换相同的Payload。如果你的Payload set中有两个Payload,在爆破时会发送两次请求,结果如表1-2所示。
表1-2 Battering ram型攻击请求过程
(3)Pitchfork型
需要设置两个Payload set,这时候两个变量的位置和两个Payload set是一一对应的关系。这个类型可以用来进行撞库攻击等,用你已知的账号密码去测试其他网站。爆破时会发送两个请求,结果如表1-3所示。
表1-3 Pitchfork型攻击请求过程
(4)Cluster bomb型
需要设置两个Payload set,这时候每个位置的Payload将在Payload set中进行排列组合。在爆破时共要发送2×2=4个请求,结果如表1-4所示。
表1-4 Cluster bomb型攻击请求过程
接下来介绍Payload标签页,Payload set可用于设置每个位置使用的Payload集合。Payload type可用于设置这个Payload集合的内容。Payload type中常用的选项具体包含如下几种。
·Runtime file:用于从文件中加载Payload。
·Numbers:用于设置数字的开始和结束以及步长。
·Dates:用于设置日期及日期格式。
·Character blocks:用于设置长度爆破,Fuzz超长的Post变量,有时候可以绕过WAF等。
Burp里面还提供了很多其他的Payload类型,请读者自行探索。
最后是Options标签页,在Options标签页中通常需要对Request Engine中的参数进行设置。第一个参数为线程数量,默认值为1;第二个参数为网络连接失败时的重传次数,默认为三次;第三个参数为每次重传前的暂停时间;第四个参数为调节数据包发送速度的选项;第五个参数为开始时间。读者可以根据自己的电脑性能及网络状态等因素设置这些参数。
为了方便观察结果,一般会将响应信息按照请求的返回长度或响应状态码进行排序,或者在过滤器中设置匹配字符串或者正则表达式,以便对结果进行筛选和匹配。
4.Decoder解码模块
Decoder模块为我们提供了丰富的编码与解码工具,可以方便地对HTTP/HTTPS中需要的数据进行编码和解码,并且支持用文本格式或十六进制模式进行查看,如图1-8所示。
图1-8 解码模块
在这里,将需要处理的数据输入文本框中,然后选择编码或者解码的模式。除了编码和解码以外,Decoder模块还提供了如MD5、SHA等常见的哈希算法,十分方便。不过,在一般情况下笔者不推荐使用Smart decode进行解码,因为在CTF中智能解码一般都不准确。
5.Comparer比较模块
在某些诸如Bool盲注的正确和错误的回显题目中,有时候两次数据包之间的差别很小,比较难发现,这时可以使用比较模块来进行比较,以发现差异,如图1-9所示。
图1-9 比较模块
6.工程选项介绍
在工程选项中,这里只介绍一些比较常用的名称解析相关的模块,如图1-10所示。
图1-10 自定义名称解析
这里可以将域名(也可以是不存在的域名)与IP进行绑定,有时候会遇到一些有这方面需求的题目,而且后文中出现的example.com也都是在这里绑定的。
Burp的常用功能与基本的使用方式就介绍到这里,其他功能读者可以自行探索或查看官方提供的文档,文档地址为:https://portswigger.net/burp/help。