干货|从无到有学习Python编写poc
字数 985 2025-08-10 19:49:08

Python编写POC(漏洞验证代码)完全指南

一、前言

1. 编写POC前的准备工作

在开始编写POC之前,需要完成以下准备工作:

  • 明确目标:确定你要验证的漏洞类型和范围
  • 漏洞研究:通过博客、公众号、Github等渠道收集漏洞相关资料,了解:
    • 漏洞工作原理
    • 漏洞利用条件
    • 可能造成的影响
  • 环境搭建:根据目标漏洞类型和相关应用程序版本,搭建合适的实验环境

2. 编写POC的关键关注点

编写POC时需要特别关注以下方面:

  1. 确定漏洞输入点:明确漏洞接受的输入类型(URL参数、POST数据等)
  2. 构造恶意输入:设计能够触发漏洞的输入数据
  3. 目标验证:确定验证漏洞存在的方法和标准

二、基础功能实现

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("漏洞不存在。")

五、安全注意事项

  1. 法律合规

    • 仅对授权目标进行测试
    • 不要利用漏洞进行非法活动
  2. 代码安全

    • 不要包含实际的漏洞利用代码
    • 验证而非攻击
  3. 免责声明

    • 在代码和文档中包含免责声明
    • 明确说明工具的用途和限制

六、完整示例

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])

七、扩展建议

  1. 并发处理:使用多线程/协程加速批量检测
  2. 结果报告:添加结果记录和报告生成功能
  3. 参数化配置:通过配置文件管理检测规则
  4. 代理支持:添加代理功能避免IP封锁
  5. 日志记录:实现详细的日志记录系统

通过以上方法和代码示例,您可以构建一个功能完善的POC框架,用于安全研究和漏洞验证工作。

Python编写POC(漏洞验证代码)完全指南 一、前言 1. 编写POC前的准备工作 在开始编写POC之前,需要完成以下准备工作: 明确目标 :确定你要验证的漏洞类型和范围 漏洞研究 :通过博客、公众号、Github等渠道收集漏洞相关资料,了解: 漏洞工作原理 漏洞利用条件 可能造成的影响 环境搭建 :根据目标漏洞类型和相关应用程序版本,搭建合适的实验环境 2. 编写POC的关键关注点 编写POC时需要特别关注以下方面: 确定漏洞输入点 :明确漏洞接受的输入类型(URL参数、POST数据等) 构造恶意输入 :设计能够触发漏洞的输入数据 目标验证 :确定验证漏洞存在的方法和标准 二、基础功能实现 1. URL处理函数 功能说明: 自动为URL添加协议前缀(http/https) 去除路径部分,只保留域名和协议 规范化URL格式,去除末尾斜杠 2. 状态码获取函数 功能说明: 发送GET请求获取目标URL状态码 处理请求异常情况 返回HTTP状态码或None(请求失败时) 3. 文件读取函数 功能说明: 从文本文件中逐行读取URL 自动去除每行的空白字符 处理文件读取异常 返回URL列表或空列表(读取失败时) 三、POC验证实现 1. 基础框架整合 2. POST方法POC验证模板 关键点: 构造POST请求数据 可自定义请求头 根据响应状态码判断漏洞存在性 异常处理机制 3. GET方法POC验证模板 关键点: 构造GET请求参数 可自定义请求头 根据响应状态码判断漏洞存在性 异常处理机制 四、高级验证技术 1. 响应内容验证 除了状态码外,还可以通过以下方式验证漏洞: 2. 多因素综合验证 更可靠的漏洞验证应该结合多个因素: 五、安全注意事项 法律合规 : 仅对授权目标进行测试 不要利用漏洞进行非法活动 代码安全 : 不要包含实际的漏洞利用代码 验证而非攻击 免责声明 : 在代码和文档中包含免责声明 明确说明工具的用途和限制 六、完整示例 七、扩展建议 并发处理 :使用多线程/协程加速批量检测 结果报告 :添加结果记录和报告生成功能 参数化配置 :通过配置文件管理检测规则 代理支持 :添加代理功能避免IP封锁 日志记录 :实现详细的日志记录系统 通过以上方法和代码示例,您可以构建一个功能完善的POC框架,用于安全研究和漏洞验证工作。