利用Python开发Burp Suite插件(三)
字数 1391 2025-08-18 11:37:53
利用Python开发Burp Suite插件(三) - SQL注入检测插件开发指南
前言
本教程是"利用Python开发Burp Suite插件"系列的第三部分,重点介绍如何开发一个能够自动检测SQL注入漏洞的Burp Suite插件。本插件将在每个参数后面插入大量SQL注入检测参数,并通过分析响应数据来判断漏洞是否存在。
所需接口类
IIntruderPayloadProcessor接口
这是一个Intruder工具的payload处理器,通过IBurpExtenderCallbacks.registerIntruderPayloadProcessor()注册。需要实现以下两个方法:
-
getProcessorName():
- 功能:获取payload处理器的名称
- 返回值:处理器名称字符串
-
processPayload():
- 功能:当处理器每次应用payload到Intruder攻击时调用
- 参数:当前payload值
- 返回值:处理后的payload值
IHttpListener接口
这是一个HTTP监听器,Burp Suite中任何工具发起的HTTP请求或收到的HTTP响应都会通知此监听器。通过IBurpExtenderCallbacks.registerHttpListener()注册。需要实现以下方法:
- processHttpMessage():
- 功能:处理所有HTTP数据包
- 参数:包含HTTP请求/响应信息的对象
- 说明:必须通过此接口获取HTTP数据包进行分析和修改
代码实现步骤
第一步:导入必要的Burp API类
from burp import IBurpExtender
from burp import IIntruderPayloadProcessor
from burp import IHttpListener
第二步:准备SQL注入测试语句
将常用的SQL注入测试语句写入数组:
sql_payloads = [
"' OR '1'='1",
"' OR '1'='1' --",
"' OR '1'='1' /*",
"' OR '1'='1' #",
"' OR 1=1 --",
"' OR 1=1 /*",
"' OR 1=1 #",
"' OR 'a'='a",
"' OR 'a'='a' --",
"' OR 'a'='a' /*",
"' OR 'a'='a' #",
"' OR 1=1; --",
"' OR 1=1; /*",
"' OR 1=1; #",
"' OR '1'='1'",
"' OR '1'='1' --",
"' OR '1'='1' /*",
"' OR '1'='1' #",
# 更多payload可从以下地址获取
# https://github.com/trietptm/SQL-Injection-Payloads
]
第三步:注册接口类
在BurpExtender类中注册所需的接口:
class BurpExtender(IBurpExtender, IIntruderPayloadProcessor, IHttpListener):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
# 注册接口
callbacks.registerIntruderPayloadProcessor(self)
callbacks.registerHttpListener(self)
# 设置扩展名称
callbacks.setExtensionName("SQL Injection Detector")
第四步:实现IIntruderPayloadProcessor接口
def getProcessorName(self):
return "SQL Injection Payload Processor"
def processPayload(self, currentPayload, originalPayload, baseValue):
# 在这里处理payload
payload = self._helpers.bytesToString(currentPayload)
modified_payload = payload + sql_payloads[0] # 示例:添加第一个payload
return self._helpers.stringToBytes(modified_payload)
第五步:定义Intruder工具的payload生成器
def generatePayload(self, baseValue):
# 生成所有可能的payload变体
payloads = []
for payload in sql_payloads:
modified_payload = baseValue + payload
payloads.append(self._helpers.stringToBytes(modified_payload))
return payloads
第六步:处理从payload生成器返回的payload
def processPayload(self, currentPayload, originalPayload, baseValue):
# 获取当前payload的字符串形式
payload_str = self._helpers.bytesToString(currentPayload)
# 在这里可以添加自定义处理逻辑
# 例如:根据特定条件选择不同的payload
return currentPayload # 返回处理后的payload
第七步:实现IHttpListener接口处理HTTP请求和响应
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
# 只处理响应
if not messageIsRequest:
httpService = messageInfo.getHttpService()
response = messageInfo.getResponse()
# 分析响应内容
response_info = self._helpers.analyzeResponse(response)
headers = response_info.getHeaders()
body = response[self._helpers.analyzeResponse(response).getBodyOffset():]
# 检查响应中是否包含SQL错误特征
if self.checkForSqlErrors(body):
print("Potential SQL Injection vulnerability detected!")
def checkForSqlErrors(self, response_body):
# 常见的SQL错误特征
sql_errors = [
"SQL syntax",
"MySQL server",
"syntax error",
"unclosed quotation mark",
"ORA-00933",
"SQL command not properly ended",
"Warning: mysql_",
"Unclosed quotation mark",
"You have an error in your SQL syntax"
]
response_str = self._helpers.bytesToString(response_body)
for error in sql_errors:
if error.lower() in response_str.lower():
return True
return False
完整代码示例
from burp import IBurpExtender
from burp import IIntruderPayloadProcessor
from burp import IHttpListener
class BurpExtender(IBurpExtender, IIntruderPayloadProcessor, IHttpListener):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
callbacks.registerIntruderPayloadProcessor(self)
callbacks.registerHttpListener(self)
callbacks.setExtensionName("SQL Injection Detector")
# 初始化SQL注入payload列表
self.sql_payloads = [
"' OR '1'='1",
"' OR '1'='1' --",
"' OR '1'='1' /*",
# 更多payload...
]
# IIntruderPayloadProcessor方法
def getProcessorName(self):
return "SQL Injection Payload Processor"
def processPayload(self, currentPayload, originalPayload, baseValue):
payload_str = self._helpers.bytesToString(currentPayload)
modified_payload = payload_str + self.sql_payloads[0]
return self._helpers.stringToBytes(modified_payload)
# IHttpListener方法
def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
if not messageIsRequest:
response = messageInfo.getResponse()
body = response[self._helpers.analyzeResponse(response).getBodyOffset():]
if self.checkForSqlErrors(body):
print("Potential SQL Injection vulnerability detected!")
def checkForSqlErrors(self, response_body):
sql_errors = [
"SQL syntax",
"MySQL server",
# 更多错误特征...
]
response_str = self._helpers.bytesToString(response_body)
for error in sql_errors:
if error.lower() in response_str.lower():
return True
return False
使用说明
-
将上述代码保存为
.py文件 -
在Burp Suite中配置插件:
- 打开Burp Suite
- 转到"Extender"标签页
- 点击"Add"按钮
- 选择"Python"作为扩展类型
- 选择保存的.py文件
- 点击"Next"完成加载
-
使用Intruder工具时,选择插件生成的payload进行测试
注意事项
-
Python版本兼容性:
- Burp Suite使用Jython,目前仅支持Python 2.7语法
- 确保使用Python 2兼容的语法(如print语句而非函数)
-
性能考虑:
- 大量payload可能会产生大量请求,影响性能
- 考虑分批测试或添加延迟
-
误报处理:
- 本示例使用简单的错误字符串匹配,可能会有误报
- 可以添加更复杂的检测逻辑(如响应时间分析、布尔盲注检测等)
-
扩展性:
- 可以从GitHub等资源获取更多payload:
- https://github.com/trietptm/SQL-Injection-Payloads
通过本教程,您已经学会了如何开发一个基本的SQL注入检测Burp Suite插件。您可以根据需要扩展其功能,如添加更多payload类型、改进检测算法或集成其他Burp工具。