干货|从无到有学习Python编写poc
字数 985 2025-08-10 19:49:08
Python编写POC(漏洞验证代码)完全指南
一、前言
1. 编写POC前的准备工作
在开始编写POC之前,需要完成以下准备工作:
- 明确目标:确定你要验证的漏洞类型和范围
- 漏洞研究:通过博客、公众号、Github等渠道收集漏洞相关资料,了解:
- 漏洞工作原理
- 漏洞利用条件
- 可能造成的影响
- 环境搭建:根据目标漏洞类型和相关应用程序版本,搭建合适的实验环境
2. 编写POC的关键关注点
编写POC时需要特别关注以下方面:
- 确定漏洞输入点:明确漏洞接受的输入类型(URL参数、POST数据等)
- 构造恶意输入:设计能够触发漏洞的输入数据
- 目标验证:确定验证漏洞存在的方法和标准
二、基础功能实现
1. URL处理函数
def process_url(url):
# 添加http或https前缀
if not url.startswith('http://') and not url.startswith('https://'):
url = 'http://' + url
# 删除URL路径部分
url_parts = url.split('/')
url_without_path = '/'.join(url_parts[:3])
# 去掉URL末尾的斜杠
if url_without_path.endswith('/'):
url_without_path = url_without_path[:-1]
return url_without_path
功能说明:
- 自动为URL添加协议前缀(http/https)
- 去除路径部分,只保留域名和协议
- 规范化URL格式,去除末尾斜杠
2. 状态码获取函数
import requests
def getCode(url):
try:
response = requests.get(url)
return response.status_code
except requests.exceptions.RequestException:
return None
功能说明:
- 发送GET请求获取目标URL状态码
- 处理请求异常情况
- 返回HTTP状态码或None(请求失败时)
3. 文件读取函数
def readFile(filename):
try:
with open(filename, 'r') as file:
urls = [line.strip() for line in file.readlines()]
return urls
except IOError:
print(f"无法读取文件: {filename}")
return []
功能说明:
- 从文本文件中逐行读取URL
- 自动去除每行的空白字符
- 处理文件读取异常
- 返回URL列表或空列表(读取失败时)
三、POC验证实现
1. 基础框架整合
import requests
def process_url(url):
# 同上...
def getCode(url):
# 同上...
def readFile(filename):
# 同上...
def main():
# 读取URL列表
filename = input("请输入URL文件名:")
urls = readFile(filename)
if len(urls) == 0:
print("未找到URL。")
return
# 处理每个URL并获取状态码
for url in urls:
processed_url = process_url(url)
status_code = getCode(processed_url)
print(f"\nURL: {processed_url}\n状态码: {status_code}")
if __name__ == "__main__":
main()
2. POST方法POC验证模板
def poc_post(target):
url = target + "/vulnerable_endpoint" # 替换为实际的漏洞点
data = {
'param1': 'value1', # 根据漏洞点设置参数和值
'param2': 'value2'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
}
try:
response = requests.post(url, data=data, headers=headers)
if response.status_code == 200: # 根据实际情况确定状态码
print("漏洞存在!")
# 进一步处理漏洞...
else:
print("漏洞不存在。")
except requests.exceptions.RequestException as e:
print("请求发生异常:", e)
关键点:
- 构造POST请求数据
- 可自定义请求头
- 根据响应状态码判断漏洞存在性
- 异常处理机制
3. GET方法POC验证模板
def poc_get(target):
url = target + "/vulnerable_endpoint" # 替换为实际的漏洞点
params = {
'param1': 'value1', # 根据漏洞点设置参数和值
'param2': 'value2'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
}
try:
response = requests.get(url, params=params, headers=headers)
if response.status_code == 200: # 根据实际情况确定状态码
print("漏洞存在!")
# 进一步处理漏洞...
else:
print("漏洞不存在。")
except requests.exceptions.RequestException as e:
print("请求发生异常:", e)
关键点:
- 构造GET请求参数
- 可自定义请求头
- 根据响应状态码判断漏洞存在性
- 异常处理机制
四、高级验证技术
1. 响应内容验证
除了状态码外,还可以通过以下方式验证漏洞:
# 检查响应体中的特定内容
if "vulnerable_string" in response.text:
print("漏洞存在!")
# 检查JSON响应中的特定字段
try:
json_data = response.json()
if json_data.get('vulnerable_field') == expected_value:
print("漏洞存在!")
except ValueError:
pass
# 检查响应头中的特定字段
if "vulnerable_header" in response.headers:
print("漏洞存在!")
# 检查响应时间
if response.elapsed.total_seconds() > 5: # 超过5秒
print("可能存在时间型漏洞!")
2. 多因素综合验证
更可靠的漏洞验证应该结合多个因素:
def advanced_poc(target):
# ...发送请求获取response...
# 多条件验证
conditions_met = 0
# 条件1: 状态码
if response.status_code == 200:
conditions_met += 1
# 条件2: 响应内容
if "vulnerable_indicator" in response.text:
conditions_met += 1
# 条件3: 响应时间
if response.elapsed.total_seconds() > 3:
conditions_met += 1
# 根据满足的条件数量判断
if conditions_met >= 2:
print("漏洞存在!")
else:
print("漏洞不存在。")
五、安全注意事项
-
法律合规:
- 仅对授权目标进行测试
- 不要利用漏洞进行非法活动
-
代码安全:
- 不要包含实际的漏洞利用代码
- 验证而非攻击
-
免责声明:
- 在代码和文档中包含免责声明
- 明确说明工具的用途和限制
六、完整示例
import requests
class POCFramework:
def __init__(self):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
}
def process_url(self, url):
"""标准化URL处理"""
if not url.startswith(('http://', 'https://')):
url = 'http://' + url
url_parts = url.split('/')
base_url = '/'.join(url_parts[:3])
return base_url.rstrip('/')
def load_targets(self, filename):
"""从文件加载目标URL"""
try:
with open(filename, 'r') as f:
return [self.process_url(line.strip()) for line in f if line.strip()]
except IOError:
print(f"Error reading file: {filename}")
return []
def check_vulnerability(self, target):
"""检查目标是否存在漏洞"""
try:
# 构造漏洞检测请求
url = f"{target}/vulnerable_endpoint"
data = {'malicious_param': 'exploit_payload'}
# 发送请求
response = requests.post(url, data=data, headers=self.headers, timeout=10)
# 多因素验证
if (response.status_code == 200 and
"vulnerable_indicator" in response.text and
response.elapsed.total_seconds() > 2):
return True, "Vulnerable"
return False, "Not vulnerable"
except requests.RequestException as e:
return False, f"Request failed: {str(e)}"
def run(self, input_file):
"""主执行函数"""
targets = self.load_targets(input_file)
if not targets:
print("No valid targets loaded.")
return
print(f"Loaded {len(targets)} targets. Starting scan...\n")
for target in targets:
print(f"Checking: {target}")
is_vuln, message = self.check_vulnerability(target)
status = "VULNERABLE" if is_vuln else "SAFE"
print(f"Result: {status} - {message}\n")
if __name__ == "__main__":
import sys
if len(sys.argv) != 2:
print("Usage: python poc_framework.py <targets_file>")
sys.exit(1)
framework = POCFramework()
framework.run(sys.argv[1])
七、扩展建议
- 并发处理:使用多线程/协程加速批量检测
- 结果报告:添加结果记录和报告生成功能
- 参数化配置:通过配置文件管理检测规则
- 代理支持:添加代理功能避免IP封锁
- 日志记录:实现详细的日志记录系统
通过以上方法和代码示例,您可以构建一个功能完善的POC框架,用于安全研究和漏洞验证工作。