学习编写一个BurpSuit的插件
一、扩展框架
from burp import IBurpExtender (1)
from burp import IIntruderPayloadGeneratorFactory
from burp import IIntruderPayloadGenerator
from java.util import List, ArrayList
import random
class BurpExtender(IBurpExtender, IIntruderPayloadGeneratorFactory): (2)
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.registerIntruderPayloadGeneratorFactory(self) (3)
return
def getGeneratorName(self): (4)
return "BHP Payload Generator"
def createNewInstance(self, attack): (5)
return BHPFuzzer(self, attack)
class BHPFuzzer(IIntruderPayloadGenerator): (6)
...
return
二、框架详解
(1) 导入IBurpExtender类,这是编写Burp扩展的必须类,接着创建Intruder载荷生成器导入必要的类。
(2) 定义自己的BurpExtender类,他继承和扩展了IBurpExtender类和IIntruderPayloadGeneratorFactory类。
(3) 我们使用registerIntruderPayloadGeneratorFactory()函数注册BurpExtender类,这样Intruder工具才能生成攻击载荷。
(4) getGeneratorName()函数返回载荷生成器的名称。
(5) createNewInstance()函数接收攻击相关的参数,返回IIntruderPayloadGenerator类型的实例,命名为BHPFuzzer。
(6) 具体的处理代码写在这里
三、模糊测试代码
class BHPFuzzer(IIntruderPayloadGenerator): (1)
def __init__(self, extender, attack):
self._extender = extender
self._helpers = extender._helpers
self._attack = attack
self.max_payloads = 1000 (2)
self.num_payloads = 0
return
def hasMorePayloads(self): (3)
if self.num_payloads == self.max_payloads:
return False
else:
return True
def getNextPayload(self,current_payload): (4)
# 转换成字符串
payload = "".join(chr(x) for x in current_payload) (5)
# 调用简单的变形器对POST请求进行模糊测试
payload = self.mutate_payload(payload) (6)
# 增加FUZZ的次数
self.num_payloads += 1 (7)
return payload
def reset(self):
self.num_payloads = 0
return
def mutate_payload(self,original_payload): (8)
...
return
(1) 定义自己的BHPFuzzer类,它扩展了IIntruderPayloadGenerator类。
(2) 定义需要的类变量,添加max_payloads和num_payloads变量,他们用来对模糊测试的过程进行追踪,让Burp了解模糊测试完成的时间。
(3) 部署hasMorePayloads()函数,该函数检查模糊测试时迭代的数量是否达到上限。
(4) getNextPayload()函数负责接收原始的HTTP载荷,这里是进行模糊测试的地方。
(5) current_payload变量是数组模式,我们要将它变成字符串。
(6) 将字符串传递给模糊测试的函数mutate_payload()
(7) 将num_payloads变量的值增加,然后修改之后的载荷
(8) 模糊测试函数
def mutate_payload(self,original_payload):
# 仅生成一个随机数或者调用一个外部脚本
picker = random.randint(1,3)
# 在载荷中选取一个随机的偏移量去变形
offset = random.randint(0,len(original_payload)-1)
payload = original_payload[:offset]
# 在随机偏移位置插入SQL注入尝试
if picker == 1:
payload += "'"
# 插入跨站尝试
if picker == 2:
payload += "<script>alert('BHP!');</script>";
# 随机重复原始载荷
if picker == 3:
chunk_length = random.randint(len(payload[offset:]),len(payload)-1)
repeater = random.randint(1,10)
for i in range(repeater):
payload += original_payload[offset:offset+chunk_length]
# 添加载荷中剩余字节
payload += original_payload[offset:]
return payload
四、加载扩展插件