Burp Intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击,Burp Intruder 是高度可配置的,并被用来在广范围内进行自动化攻击。你可以使用 Burp Intruder 方便地执行许多任务,包括枚举标识符,获取有用数据,漏洞模糊测试。合适的攻击类型取决于应用程序的情况,可能包括:缺陷测试:SQL 注入,跨站点脚本,缓冲区溢出,路径遍历;暴力攻击认证系统;枚举;操纵参数;拖出隐藏的内容和功能;会话令牌测序和会话劫持;数据挖掘;并发攻击;应用层的拒绝服务式攻击。
Burp Intruder主要有四个模块组成:
这个选项是用来配置目标服务器的细节:
这个选项是用来配置在攻击里产生的所有 HTTP 请求的模板:
使用一对§字符来标记出有效负荷的位置,在这两个符号直接包含了模板文本的内容。当把一个有效负荷放置到一个给出的请求的特殊位置上时,就把这§符号放到这个位置,然后在两个符号之间的出现的文本都会被有效负荷替换。当有个特殊位置没有为一个给出的请求安排有效负荷时(这只适用"sniper"攻击类型),那个位置的§字符会被删除,出现在它们之间的文本不会变化。
当使用 Burp Suite 发送一个其他地方的请求时,Burp Intruder 会对你最想放置有效负荷的位置做一个最好的猜测,并且它把这些放置在每个 URL 和主体参数的值里,以及每个COOKIE 里。每个标记和它中间的文本都会被加亮以显得更清晰。你可以使用 Intruder 菜单上的选项标记的位置是要替换还是附加现有的参数值。在上面的请求编辑器里,指出了定义位置的数量和文本模板的大小。
你可以使用选项上的按钮来控制位置上的标记:
这个选项是用来配置一个或多个有效负荷的集合。如果定义了"cluster bomb"和"pitchfork"攻击类型,然后必须为每定义的有效负荷位置(最多8个)配置一个单独的有效负荷。使用"payload set"下拉菜单选择要配置的有效负荷。
数量类型设置
该选项会根据选项1中Payload type的设置而改变
对生成的Payload进行编码、加密、截取等操作
你可以配置哪些有效载荷中的字符应该是URL编码的HTTP请求中的安全传输。任何已配置的URL编码最后应用,任何有效载荷处理规则执行之后。 这是推荐使用此设置进行最终URL编码,而不是一个有效载荷处理规则,因为可以用来有效载荷的grep选项来检查响应为呼应有效载荷的最终URL编码应用之前。
选项卡(Options tab) 此选项卡包含了request headers,request engine,attack results ,grep match,grep_extrack,grep payloads和redirections。你可以发动攻击之前,在主要Intruder的UI上编辑这些选项,大部分设置也可以在攻击时对已在运行的窗口进行修改。
这些设置控制在Intruder是否更新配置请求头。
如果选中‘update Content-Length header’框,Burp Intruder 会使用每个请求的 HTTP 主体长度的正确值,添加或更新这个请求里 HTTP 消息头的内容长度。这个功能对一些需要把可变长度的有效载荷插入到 HTTP 请求模板主体的攻击是很有必要的。这个 HTTP 规范和大多数 web 服务器一样,需要使用消息头内容长度来指定 HTTP 主体长度的正确值。如果没有指定正确值,目标服务器会返回一个错误,也可能返回一个未完成的请求,也可能无限期地等待接收请求里的进一步数据。
如果选中‘set Connection: close’框,则 Burp Intruder 会添加或更新 HTTP 消息头的连接来请求在每个请求后已关闭的连接。在多数情况下,这个选项会让攻击执行得更快。
设置发送请求的线程、超时重试等。
设置攻击结果的显示。
在响应中找出存在指定的内容的一项。
通过正则提取返回信息中的内容。
这些设置可以用于包含已提交的有效负载的反射的标志结果项目。如果启用了此选项,BurpSuite会添加包含一个复选框指示当前负载的值在每个响应发现新的结果列。
重定向响应,控制Burp在进行攻击时如何处理重定向。
在渗透测试过程中,我们经常使用Burp Intruder,它的工作原理是:Intruder在原始请求数据的基础上,通过修改各种请求参数,以获取不同的请求应答。每一次请求中,Intruder通常会携带一个或多个有效攻击载荷(Payload),在不同的位置进行攻击重放,通过应答数据的比对分析来获得需要的特征数据。Burp Intruder通常被使用在以下场景:
通常来说,使用Burp Intruder进行测试,主要遵循以下步骤:
以上这些,是Burp Intruder一次完成的操作步骤,在实际使用中,根据每一个人的使用习惯,会存在或多或少的变动。
在Burp Intruder的Payload选项卡中,有Payload集合的设置选项,包含了经常使用的Payload类型,共18种。
他们分别是:
简单列表(Simple list)——最简单的Payload类型,通过配置一个字符串列表作为Payload,也可以手工添加字符串列表或从文件加载字符串列表。其设置界面如下图
在此操作界面上,选择的Payload列表中,已经预定义了一组简单Payload列表,包括XSS脚本、CGI脚本、SQL注入脚本、数字、大写字母、小写字母、用户名、密码、表单域的字段名、IIS文件名和目录名等等,极大地方便了渗透测试人员的使用。
运行时文件(Runtime file)——指定文件,作为相对应Payload位置上的Payload列表。其设置界面如下图:
当我们如上图所示,指定Payload set的位置1使用的Payload类型为Runtime file时,下方的Payload Options将自动改变为文件选择按钮和输入框,当我们点击【select file】选择文件时,将弹出图中所示的对话框,选择指定的Payload文件。运行时,Burp Intruder将读取文件的每一行作为一个Payload。
自定义迭代器(Custom iterator)——这是一款功能强大的Payload,它共有8个占位,每一个占位可以指定简单列表的Payload类型,然后根据占位的多少,与每一个简单列表的Payload进行笛卡尔积,生成最终的Payload列表。例如,某个参数的值格式是
username@@password,则设置此Payload的步骤是:位置1,选择Usernames
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXRnm5SC-1604136384415)(https://cdn.jsdelivr.net/gh/hirak0/hirak0-images/blog/bp/Intruder/Snipaste_2020-10-31_16-18-49.png)]
接着,指定位置2,输入值@@
最后指定位置3,选择Passwords
当我们开始攻击时,生成的Payload值如图所示
字符串替换(Character substitution)——顾名思义,此种Payload的类型是对预定义的字符串进行替换后生成新的Payload。比如说,预定义字符串为ABCD,按照下图的替换规则设置后,将对AB的值进行枚举后生成新的Payload。
生成的Payload如下图所示,分别替换了上图中的a和b的值为4与8
大小写替换(Case modification)——对预定义的字符串,按照大小写规则,进行替换。比如说,预定义的字符串为Peter Wiener,则按照下图的设置后,会生成新的Payload。
生成的Payload如下
生成规则由上而下依次是:No change(不改变,使用原始字符串)、To lowercase(转为小写字母)、To upper case(转为大写字母)、To Propername(首字母大写,其他小写)、To ProperName(首字母大写,其他不改变),在实际使用中,可以根据自己的使用规则进行勾选设置。
递归grep (Recursive grep)——此Payload类型主要使用于从服务器端提取有效数据的场景,需要先从服务器的响应中提取数据作为Payload,然后替换Payload的位置,进行攻击。它的数据来源了原始的响应消息,基于原始响应,在Payload的可选项设置(Options)中配置Grep规则,然后根据grep去提取数据才能发生攻击。比如,我在grep extract 中设置取服务器端的EagleId作为新的Payload值。
点击上图的【OK】按钮之后,完成了Payload的设置。
当我发起攻击时,Burp会对每一次响应的消息进行分析,如果提取到了EagleId的值,则作为Payload再发生一次请求。操作图如下:
上图中请求序号为偶数的消息的Payload都是上一次服务器端响应的报文中的EagleId的值。
不合法的Unicode编码(Illegal Unicode)—— 在payloads里用指定的不合法Unicode 编码替换字符本身,从这些Payload列表里产生出一个或者多个有效负荷。在尝试回避基于模式匹配的输入验证时,这个有效负荷会有用的,例如,在防御目录遍历攻击时…/和…序列的期望编码的匹配。其配置界面如下:
上图中的配置选项主要用来控制不合法编码的生成,各项的含义如下: maximumoverlong UTF-8 length Unicode 编码允许最多使用 6 字节表示一个字符。使用一种类型就可以正确地表示出(0x00-0x7F) Basic ASCII 字符。然而,使用多字节的Unicode 方案也能表示出它们(如, ”overlong”编码)。下拉菜单用来指定是否使用超长编码,以及应该设定的最大使用长度。 Illegal UTF-8 continuation bytes 当选择的最大超长 UTF-8 长度为 2 字节以上,这个选项是可用的。 Do illegal UTF-8 当使用多字节编码一个字符时,第一个字节后面的字节应该用 10XXXXXX 这样的二进制格式,来指出后续的字节。然而,第一个字节里最有意义的位会指出后面还有多少后续字节。因此,Unicode 编码例程会安全地忽略掉后续字节的前 2 位。这就意味着每个后续字节可能有 3 个非法变种,格式为 00XXXXXX, 01XXXXXX 和 11XXXXXX。如果选中这个选项,则非法Unicode 有效负荷源会为每个后续字节生成 3 个附加编码。 Maximize permutations inmulti-byte encodings 如果选择的最大超长 UTF-8 长度为 3 字节以上,并且选中”illegal UTF-8 ”这个选项可用。如果”Maximize permutations in multi-byte encodings”没被选中,则在生产非法变种时,不合法 Unicode 有效负荷源会按顺序处理每个后续字节,为每个后续字节产生 3 个非法变种,并且其他的后续字节不会改变。如果”Maximizepermutations in multi-byte encodings”被选中了,不合法 的Unicode 有效负荷源会为后续字节生成所有的非法变种排序 。 如,多个后续字节会同时被修改。在目标系统上回避高级模式匹配控制时,这个功能就会很有用。 Illegal hex 这个选择基本上一直可用。当使用超长编码和后续字节的非法变种(如果选中)生成非法编码项列表时,通过修改由此产生的十六进制编码可能会迷惑到某种模式匹配控制。十六进制编码使用字符 A—F 代表十进制 10—15 的值。然而有些十六进制编码会把G解释为 16, H 为 17,等等。因此 0x1G会被解释为 32。另外,如果非法的十六进制字符使用在一个 2 位数的十六进制编码的第一个位置,则由此产生的编码就会溢出单个字节的大小,并且有些十六进制编码只使用了结果数字的后 8 个有效位,因此 0x1G 会被解码为 257,而那时会被解释为 1。每个合法的 2 位数的十六进制编码有 4—6 种相关的非法十六进制表示,如果使用的是上面的编码,则这些表示会被解释为同一种十六进制编码。如果”illegal hex”被选中,则非法Unicode 有效负荷源会在非法编码项列表里,生成每个字节的所有可能的非法十六进制编码。 Maximize permutations in multi-byte encodings 如果选中的最大超长 UTF-8长度为 2 字节以上并且“illegal hex”也被选中,则这个选项可用。如果Maximizepermutations in multi-byte encodings”没被选中,在生成非法十六进制编码时,非法Unicode 有效负荷源会按顺序处理每个字节。对于每个字节,会生成 4—6 个非法十六进制编码,其他的字节不变。如果Maximize permutations in multi-byte encodings”被选中,则非法 Unicode 有效负荷源会为所有的字节,生成非法十六进制的所有排序。如,多个字节会被同时修改。在目标系统上回避高级模式匹配控制时,这个功能会非常有用。 add % prefix 如果选中这个选项,在产生的有效负荷里的每个 2 位数十六进制编码前面,都会插入一个%符号。 Use lower case alpha characters 这个选项决定了是否在十六进制编码里使用大小写字母。 Total encodings 这个选项为会产生的非法编码数量放置了一个上界,如果大量使用超长编码或者选中了最大列表,这个选项会很有用,因为那会生成大量的非法编码。 Match / replace in list items 这个选项用户控制Payload列表中的字符串,它是由匹配字符(Match character)和替换字符编码(Replace withencodings of )来成对的控制Payload的生成。当攻击执行时,这个有效负荷源会迭代所有预设项列表,在非法编码集合里,每个预设项替换每个项里的指定字符的所有实例。
字符块(Character blocks)——这种类型的Payload是指使用一个给出的输入字符串,根据指定的设置产生指定大小的字符块,表现形式为生成指定长度的字符串。它通常使用了边界测试或缓冲区溢出。
Base string 是指设置原始字符串,Min length是指Payload的最小长度,Max length 是指Payload的最大长度,Step是指生成Payload时的步长。如上图的配置后,生成的Payload如下图所示:
数字类型(Number)——这种类型的Payload是指根据配置,生成一系列的数字作为Payload。它的设置界面如下:
Type表示使用序列还是随机数,From表示从什么数字开始,To表示到什么数字截
止,Step表示步长是多少,如果是随机数,则How many被激活,表示一共生成多少个随机数。Base表示数字使用十进制还是十六进制形式,Min integer digits 表示最小的整数是多少,Max integer digits表示最大的整数是多少,如果是10进制,则Min fractiondigits 表示小数点后最少几位数,Max fraction digits表示小数点后最多几位数。
日期类型(Dates)——这种类型的Payload是指根据配置,生成一系列的日期。界面如下
其设置选项比较简单,没有什么特别复杂的,不再赘述。至于日期格式,可以选择Burp自己提供的样例格式,也可以自定义,自定义的时候,格式的填写形式如下表所示 | 格式 |样例| |--------|--------| | E | Sat | | EEEE | Saturday | | d | 7 | | dd | 07 | | M | 6 | | MM | 06 | |MMM | Jun | | MMMM| June | | yy| 16 | | yyyy| 2016 |
暴力字典(Brute forcer)——此类Payload生成包含一个指定的字符集的所有排列特定长度的有效载荷,通常用于枚举字典的生成,其设置界面如下:
Character set 表示生成字典的数据集,从此数据集中抽取字符进行生成。Min length表示生成Payload的最小长度,Max length表示生成Payload的最大长度。
空类型(Null payloads)——这种负载类型产生的Payload,其值是一个空字符串。在攻击时,需要同样的请求反复被执行,在没有任何修改原始请求的场景下此Payload是非常有用的。它可用于各种攻击,例如COOKIE的序列分析、应用层Dos、或保活会话令牌是在其它的间歇试验中使用。
在配置Payload生成方式时,它有两个选项,我们可以指定生成(Generate)多少Payload,也可以设置为一直持续攻击(Continue indefinitely)
字符frobber(Character frobber)——这种类型的Payload的生成规律是:依次修改指定字符串在每个字符位置的值,每次都是在原字符上递增一个该字符的ASCII码。它通常使用于测试系统使用了复杂的会话令牌的部件来跟踪会话状态,当修改会话令牌中的单个字符的值之后,您的会话还是进行了处理,那么很可能是这个令牌实际上没有被用来追踪您的会话。其配置界面如图:
执行后生成的Payload如下图所示:
Bit翻转(Bit flipper)——这种类型的Payload的生成规律是:对预设的Payload原始值,按照比特位,依次进行修改。它的设置界面如下图:
其设置选项主要有:Operate on 指定是对Payload位置的原始数据进行Bit翻转还是指定值进行Bit翻转,Format of original data 是指是否对原始数据的文本意义进行操作,还是应该把它当作ASCII十六进制,Select bits to flip是指选择翻转的Bit位置。 您可以配置基于文本意义进行操作,或基于ASCII十六进制字符串进行翻转。例如,如果原始值是“ab”,基于文本意义的翻转结果是:
如果是基于ASCII十六进制字符串进行翻转,则结果是:
这种类型的Payload类似于字符frobber,但在你需要更细粒度的控制时是有用的。例如,会话令牌或其他参数值使用CBC模式的块密码加密,有可能系统地由前一密码块内修改Bit位以改变解密后的数据。在这种情况下,你可以使用的Bit 翻转的Payload来确定加密值内部修改了个别bit位后是否对应用程序产生影响,并了解应用程序是否容易受到攻击。关于加密模式可以点击阅读这篇文章做进一步的了解。
用户名生成器(Username generator)这种类型的Payload主要用于用户名和email帐号的自动生成,其设置界面如下图:
如上图所示,我设置了原始值为t0data@hotmail.com,然后执行此Payload生成器,其生成的Payload值如图所示
ECB 加密块洗牌(ECB block shuffler)——这种类型的Payload是基于ECB加密模式的Payload生成器,关于加密模式可以点击阅读这篇文章做进一步的了解。其原理是因为ECB加密模式中每组64位的数据之间相互独立,通过改变分组数据的位置方式来验证应用程序是否易受到攻击。其设置界面如下图,Payload的配置参数同上一个Payload类型雷同,就不再赘述。如图:
Burp Payload生成插件(Extension-generated)——这种类型的Payload是基于Burp插件来生成Payload值,因此使用前必须安装配置Burp插件,在插件里注册一个Intruderpayload生成器,供此处调用。其基本设置和使用步骤如下图所示:
Payload复制(Copy other payload)——这种类型的Payload是将其他位置的参数复制到Payload位置上,作为新的Payload值,通常适用于多个参数的请求消息中,它的使用场景可能是:1. 两个不同的参数需要使用相同的值,比如说,用户注册时,密码设置会输入两遍,其值也完全一样,可以使用此Payload类型。 2. 在一次请求中,一个参数的值是
基于另一个参数的值在前端通过脚本来生成的值,可以使用此Payload类型。 它的设置界面和参数比较简单,如下图所示,其中Payload位置的索引值就是指向图中Payload set的值。
首先我们来看看Payload位置(Payload positions)选项卡的设置界面:
从上图中我们可以看出,Payload位置的设置是基于Http请求的原始消息作为母板,使用一对§字符来标记出Payload的位置,在这两个号直接包含了母板文本内容。 当我们已经把一个Payload在请求消息的特殊位置上时标明后,发起攻击时,Burp Intruder 就把一个Payload值放置到给出的特殊位置上,替换§符号标示的整个位置。如上图中的参数id后面的§符号之间的标明的是Payload位置1,name后面的§符号之间标明的是Payload位置2,这个值对应于Payload设置中的Payload set的值。 我们可以在消息编辑器中间对Payload位置进行编辑,它主要是由右侧的四个按钮来控制的。
在消息编辑器的上方,有一个下拉选择框,攻击类型(Attack Type)。Burp Intruder支持使用Payload进行多种方式的模拟攻击,目前只要有以下4种。
可选项设置主要包括请求消息头设置、请求引擎设置、攻击结果设置、grep match, grep extract, grep payloads,以及重定向设置。在使用中,你可以在攻击前进行设置,也可以在攻击过程中做这些选项的调整。
一次攻击的发起,通常有两种方式。一种是你在Burp Intruder里设置了Target, Positions,Payloads and Options ,然后点击【Start attack】启动攻击;另一种是你打开一个之前保存的预攻击文件,然后点击【Start attack】启动攻击。无论是哪种方式的攻击发起,Burp都将弹出攻击结果界面。在攻击的过程中,你也可以修改攻击配置,或者做其他的操作。攻击结果的界面如下图所示:
从上图我们可以看出,其界面主要又菜单区、过滤器、Payload执行结果消息记录区、请求/响应消息区四大部分组成。
在对攻击结果的分析中,你可以通过单击任一列标题(单击标题循环通过升序排序,降序排序和未排序)重新排序表的内容。有效地解释攻击的结果的一个关键部分是定位有效的或成功的服务器响应,并确定生成这些请求。有效的应答通常可以通过以下中的至少一个存在差异:
比如说,在URL路径扫描过程中,对不存在的资源的请求可能会返回“404未找到”的响应,或正确的URL会反馈的“200 OK”响应。或者在密码猜测攻击,失败的登录尝试可能会产生一个包含“登录失败”关键字“200 OK”响应,而一个成功的登录可能会生成一个“302对象移动”的反应,或不同的“200 OK”响应页面。
每一个渗透测试人员,对Burp Intruder 攻击结果的分析方式可能会存在差异,这主要源于个人水平的不同和经验的不同。在实战中,只有慢慢尝试,积累,才能通过快速地对攻击结果的分析获取自己关注的重要信息。