背景
我们有类似waf的攻击检测产品,所以需要测试一些攻击是否能够正确识别,并且识别的原因是否正确,如果是自己去看规则,来编写,几十上百个规则太难了,要搞很久很久,而且是非常无聊的任务
大模型
用大模型来完成这个任务刚好,大模型懂SecRule语法,并且能够理解正则表达式,是干这个活的完美人选。
只要写一个不太烂的prompt约定一下产出的格式,我这里是产出的python代码,然后保存为文件,方便我以后经常调用验证产品。
import pandas as pd import openai import os # 设置OpenAI API密钥和自定义endpoint API_KEY = '' # 替换为您的自定义endpoint API_BASE = '' # 读取CSV文件 input_csv_path = 'input.csv' df = pd.read_csv(input_csv_path) # 创建一个数据目录 output_directory = 'payload_output/' os.makedirs(output_directory, exist_ok=True) # 假设CSV文件中有一列名为'text',我们将对其进行文本生成 generated_texts = [] client = openai.OpenAI( api_key=API_KEY, base_url=API_BASE ) for index, row in df.iterrows(): print(f"正在处理第 {index + 1} 行... {row.iloc[0]}") prompt = row.iloc[1] # 调用OpenAI的API生成文本 response = client.chat.completions.create( stream=False, model="deepseek-coder", # 选择适当的模型 messages=[ {"role": "system", "content": """ 需要对WAF规则进行匹配测试,所以要根据用户提供的Secrule规则进行python poc的编写。 请使用requests库来进行请求发送,函数名直接命名为attack,在函数的顶部用注释表明该模拟的意图,传入参数为url、cookie,url为模拟攻击网站host,cookie参数如果生成的poc脚本中用到了则拼接在一起,否则直接传递cookie参数,举例如下: ```python # 模拟cookie中超过3个符号 def attack(url, cookie): payload={} headers = { 'Host': 'example.com', 'Cookie': 'TestCookie=-1-1-1-1-;' + cookie, 'User-Agent': 'Jetknown-Test-Case' } response = requests.request("GET", url, headers=headers, data=payload) print(response.text) ``` 仅需输出代码块,不要进行解释和说明,也不要在代码块中引入requests """}, {"role": "user", "content": "规则如下:\n" + prompt + "\n"} ], max_tokens=4000 # 根据需要调整生成文本的长度 ) generated_text = response.choices[0].message.content.strip() print(f"生成的文本:{generated_text}") # 从生成的文件的markdown中提取代码 generated_text = generated_text.split("```python")[1].split("```")[0].strip() generated_text = "import requests \n\n" + generated_text # 将生成的文本保存到文件中 file_name = f"{output_directory}attack_{row.iloc[0]}.py" # 写入文件 with open(file_name, 'w') as f: f.write(generated_text)
然后写一个代码来动态引入python文件并且执行
def execute_attacks(directory, url, cookie): # 遍历指定目录中的所有Python文件 for filename in os.listdir(directory): if filename.endswith('.py'): file_path = os.path.join(directory, filename) # 动态导入Python文件 spec = importlib.util.spec_from_file_location(filename[:-3], file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) # 检查是否存在attack函数 if hasattr(module, 'attack'): attack_func = getattr(module, 'attack') # 执行attack函数 try: result = attack_func(url, cookie) print(f"执行 {filename} 中的attack函数,结果: {result}") except Exception as e: print(f"执行 {filename} 中的attack函数时出错: {str(e)}") else: print(f"{filename} 中没有找到attack函数")
大大减少手写测试用例的工作量,提高测试效率,而且可复用,方便后续持续验证产品。并且如果发现不理想的代码,可以挑出来再让大模型重新生成。
0 条评论