第八章 如何使用Burp Intruder
Burp Intruder作为Burp Suite中一款功能极其强大的自动化测试工具,通常被系统安全渗透测试人员被使用在各种任务测试的场景中。本章我们主要学习的内容有:
在渗透测试过程中,我们经常使用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 接着,指定位置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 lower case(转为小写字母)、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列表里产生出一个或者多个有效负荷。在尝试回避基于模式匹配的输入验证时,这个有效负荷会有用的,例如,在防御目录遍历攻击时../和..序列的期望编码的匹配。其配置界面如下: 上图中的配置选项主要用来控制不合法编码的生成,各项的含义如下: maximum overlong 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 in multi-byte encodings 如果选择的最大超长 UTF-8 长度为 3 字节以上,并且选中” illegal UTF-8 ”这个选项可用。如果”Maximize permutations in multi-byte encodings”没被选中,则在生产非法变种时,不合法 Unicode 有效负荷源会按顺序处理每个后续字节,为每个后续字节产生 3 个非法变种,并且其他的后续字节不会改变。如果”Maximize permutations 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”也被选中,则这个选项可用。如果Maximize permutations 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 with encodings 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 fraction digits 表示小数点后最少几位数,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”,基于文本意义的翻转结果是:
`b
cb
eb
ib
qb
Ab
!b
¡b
ac
a`
af
aj
ar
aB
a"
a¢
如果是基于ASCII十六进制字符串进行翻转,则结果是:
aa
a9
af
a3
bb
8b
eb
2b
这种类型的Payload类似于字符frobber,但在你需要更细粒度的控制时是有用的。例如,会话令牌或其他参数值使用CBC模式的块密码加密,有可能系统地由前一密码块内修改Bit位以改变解密后的数据。在这种情况下,你可以使用的Bit 翻转的Payload来确定加密值内部修改了个别bit位后是否对应用程序产生影响,并了解应用程序是否容易受到攻击。关于加密模式可以点击阅读这篇文章做进一步的了解。
用户名生成器(Username generator)这种类型的Payload主要用于用户名和email帐号的自动生成,其设置界面如下图: 如上图所示,我设置了原始值为[email protected],然后执行此Payload生成器,其生成的Payload值如图所示
ECB 加密块洗牌(ECB block shuffler)——这种类型的Payload是基于ECB加密模式的Payload生成器,关于加密模式可以点击阅读这篇文章做进一步的了解。其原理是因为ECB加密模式中每组64位的数据之间相互独立,通过改变分组数据的位置方式来验证应用程序是否易受到攻击。其设置界面如下图,Payload的配置参数同上一个Payload类型雷同,就不再赘述。如图:
Burp Payload生成插件(Extension-generated)——这种类型的Payload是基于Burp插件来生成Payload值,因此使用前必须安装配置Burp插件,在插件里注册一个Intruder payload生成器,供此处调用。其基本设置和使用步骤如下图所示,因后续章节将重点叙述Burp插件,此处不再展开。
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位置进行编辑,它主要是由右侧的四个按钮来控制的。
【Auto §】——对消息内容中可能需要标志的参数做一个猜测,标志为Payload位置,自动设置完之后再做人工的选择,确定哪些位置是需要传入Payload的。目前Burp支持自动选择的参数类型有: 1.URL请求参数 2.Body参数 3.cookie参数 4.复合型参数属性,比如文件上传时候的文件名 5.XML数据 6.JSON数据 虽然Burp默认是支持自动标志这些类型的参数作为Payload位置,但如果是针对于像XML或JSON的节点属性值的,还是需要手工指定。
【Refresh】——刷新消息内容中带有颜色的部分。
在消息编辑器的上方,有一个下拉选择框,攻击类型(Attack Type)。Burp Intruder支持使用Payload进行多种方式的模拟攻击,目前只要有以下4种。
狙击手模式(Sniper)——它使用一组Payload集合,依次替换Payload位置上(一次攻击只能使用一个Payload位置)被§标志的文本(而没有被§标志的文本将不受影响),对服务器端进行请求,通常用于测试请求参数是否存在漏洞。
攻城锤模式(Battering ram)——它使用单一的Payload集合,依次替换Payload位置上被§标志的文本(而没有被§标志的文本将不受影响),对服务器端进行请求,与狙击手模式的区别在于,如果有多个参数且都为Payload位置标志时,使用的Payload值是相同的,而狙击手模式只能使用一个Payload位置标志。
草叉模式(Pitchfork )——它可以使用多组Payload集合,在每一个不同的Payload标志位置上(最多20个),遍历所有的Payload。举例来说,如果有两个Payload标志位置,第一个Payload值为A和B,第二个Payload值为C和D,则发起攻击时,将共发起两次攻击,第一次使用的Payload分别为A和C,第二次使用的Payload分别为B和D。
集束炸弹模式(Cluster bomb) 它可以使用多组Payload集合,在每一个不同的Payload标志位置上(最多20个),依次遍历所有的Payload。它与草叉模式的主要区别在于,执行的Payload数据Payload组的乘积。举例来说,如果有两个Payload标志位置,第一个Payload值为A和B,第二个Payload值为C和D,则发起攻击时,将共发起四次攻击,第一次使用的Payload分别为A和C,第二次使用的Payload分别为A和D,第三次使用的Payload分别为B和C,第四次使用的Payload分别为B和D。
可选项设置主要包括请求消息头设置、请求引擎设置、攻击结果设置、grep match, grep extract, grep payloads,以及重定向设置。在使用中,你可以在攻击前进行设置,也可以在攻击过程中做这些选项的调整。
请求引擎设置(Request Engine)——这个设置主要用来控制Burp Intruder攻击,合理地使用这些参数能更加有效地完成攻击过程。它有如下参数:Number of threads并发的线程数,Number of retries on network failure 网络失败时候重试次数,Pause before retry重试前的暂停时间间隔(毫秒),Throttle between requests 请求延时(毫秒),Start time开始时间,启动攻击之后多久才开始执行。
攻击结果设置(Attack Results)——这个设置主要用来控制从攻击结果中抓取哪些信息。它的参数有:Store requests / responses 保存请求/应答消息,Make unmodified baseline request 记录请求母板的消息内容,Use denial-of-service mode使用Dos方式,tore full payloads存储所有的Payload值。
Grep Match——这个设置主要用来从响应消息中提取结果项,如果匹配,则在攻击结果中添加的新列中标明,便于排序和数据提取。比如说,在密码猜测攻击,扫描诸如“密码不正确”或“登录成功”,可以找到成功的登录;在测试SQL注入漏洞,扫描包含“ODBC”,“错误”等消息可以识别脆弱的参数。 其选项有Match type表示匹配表达式还是简单的字符串,Case sensitive match是否大小写敏感,Exclude HTTP headers匹配的时候,是否包含http消息头。
Grep Extract——这些设置可用于提取响应消息中的有用信息。对于列表中配置的每个项目,Burp会增加包含提取该项目的文本的新结果列。然后,您可以排序此列(通过单击列标题)命令所提取的数据。此选项是从应用数据挖掘有用的,能够支持广泛的攻击。例如,如果你是通过一系列文档ID的循环,可以提取每个文档寻找有趣的项目的页面标题。如果您发现返回的其他应用程序用户详细信息的功能,可以通过用户ID重复和检索有关用户寻找管理帐户,甚至密码。如果“遗忘密码”的功能需要一个用户名作为参数,并返回一个用户配置的密码提示,您可以通过共同的用户名列表运行和收获的所有相关密码的提示,然后直观地浏览列表寻找容易被猜到密码。
Grep Payloads——这些设置可用于提取响应消息中是否包含Payload的值,比如说,你想验证反射性的XSS脚本是否成功,可以通过此设置此项。当此项设置后,会在响应的结果列表中,根据Payload组的数目,添加新的列,显示匹配的结果,你可以通过点击列标题对结果集进行排序和查找。 其设置项跟上一个类似,需要注意的是Match against pre-URL-encoded payloads,如果你在请求消息时配置了 URL-encode payloads ,则这里表示匹配未编码之前的Payload值,而不是转码后的值。
重定向(Redirections)——这些设置主要是用来控制执行攻击时Burp如何处理重定向,在实际使用中往往是必须遵循重定向,才能实现你的攻击目的。例如,在密码猜测攻击,每次尝试的结果可能是密码错误会重定向响应到一个错误消息提示页面,如果密码正确会重定向到用户中心的首页。 但设置了重定向也可能会遇到其他的问题,比如说,在某些情况下,应用程序存储您的会话中初始请求的结果,并提供重定向响应时检索此值,这时可能有必要在重定向时只使用一个单线程攻击。也可能会遇到,当你设置重定向,应用程序响应会重定向到注销页面,这时候,按照重定向可能会导致您的会话被终止时。 因其设置选项跟其他模块的重定向设置基本一致,此处就不再重叙。
一次攻击的发起,通常有两种方式。一种是你在Burp Intruder里设置了Target, Positions, Payloads and Options ,然后点击【Start attack】启动攻击;另一种是你打开一个之前保存的预攻击文件,然后点击【Start attack】启动攻击。无论是哪种方式的攻击发起,Burp都将弹出攻击结果界面。在攻击的过程中,你也可以修改攻击配置,或者做其他的操作。攻击结果的界面如下图所示:
从上图我们可以看出,其界面主要又菜单区、过滤器、Payload执行结果消息记录区、请求/响应消息区四大部分组成。
菜单区 包含Attack菜单、Save菜单、Columns菜单。 Attack菜单主要用来控制攻击行为的,你可以暂停攻击(pause)、恢复攻击(resume)、再次攻击(repeat)。 Save菜单主要用来保存攻击的各种数据,Attack 保存当前攻击的副本,下次可以从此文件进行再次攻击;Results table保存攻击的结果列表,相当于图中的Payload执行结果消息记录区数据,当然你可以选择行和列进行保存,只导出你需要的数据;Server responses 保存所有的服务器响应消息;Attack configuration保存当前的攻击配置信息。 Columns菜单主要用来控制消息记录区的显示列。如果某个列被选中,则在Payload执行结果消息记录区显示,反之则不显示。
过滤器 ——可以通过查询条件、服务器响应的状态码、注释过Payload执行结果消息记录区的信息进行过滤。
Payload执行结果消息记录区,又称结果列表(Results Table),记录Payload执行时请求和响应的所有信息,它包含的列有: 请求序列——显示请求的序列号,如果配置了记录未修改的请求消息母板,则会在第一个进行记录。 Payload位置——狙击手模式下会记录 Payload值——如果有多个Payload,则存在多个列 HTTP 状态码——服务器响应状态码 请求时间——执行攻击的时间 响应时间——开始接受到响应时间,单位为毫秒。 响应完成时间——响应完成的时间,单位为毫秒。 网络错误——Payload执行时是否发生网络问题 超时情况——等待应答响应过程中,是否发生网络超时 长度——响应消息的长度 Cookie——任何的Cookie信息 Grep——如果设置了Grep 匹配、Grep 提取、Grep Payload,则会有多个列显示匹配的信息 重定向——如果配置了重定向,则显示 注释——消息记录的注释信息
请求/响应消息区——参考Proxy章节的相关叙述。
在对攻击结果的分析中,你可以通过单击任一列标题(单击标题循环通过升序排序,降序排序和未排序)重新排序表的内容。有效地解释攻击的结果的一个关键部分是定位有效的或成功的服务器响应,并确定生成这些请求。有效的应答通常可以通过以下中的至少一个存在差异: 1.不同的HTTP状态代码 2.不同长度的应答 3.存在或不存在某些表达式 4.错误或超时的发生 5.用来接收或完成响应时间的差异 比如说,在URL路径扫描过程中,对不存在的资源的请求可能会返回“404未找到”的响应,或正确的URL会反馈的“200 OK”响应。或者在密码猜测攻击,失败的登录尝试可能会产生一个包含“登录失败”关键字“200 OK”响应,而一个成功的登录可能会生成一个“302对象移动”的反应,或不同的“200 OK”响应页面。
每一个渗透测试人员,对Burp Intruder 攻击结果的分析方式可能会存在差异,这主要源于个人水平的不同和经验的不同。在实战中,只有慢慢尝试,积累,才能通过快速地对攻击结果的分析获取自己关注的重要信息。