ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python 写 POC 入门,批量验证漏洞脚本

Python 写 POC 入门,批量验证漏洞脚本 Python 写 POC 入门批量验证漏洞脚本实战前言在漏洞挖掘、SRC 提交、红蓝对抗、安全巡检工作中POCProof of Concept概念验证脚本是安全从业者的必备工具。POC 的核心作用验证目标是否存在某一个漏洞输出是否可利用不会像 EXP 那样直接造成破坏。很多新手一开始分不清 POC 和 EXP上来就写可以拿服务器权限的 EXP 脚本很容易踩法律红线。一句话区分POC 检测漏洞是否存在EXP 利用漏洞实现攻击、执行命令、获取权限。学习漏洞验证优先写 POC严禁在未授权目标执行 EXP。网上很多零散的 POC 代码要么缺少注释要么没有批量功能异常处理简陋遇到超时、连接失败、编码错误直接程序崩溃。本文面向零基础 Python 安全学习者手把手讲解 POC 编写思路、基础语法、单个目标 POC 开发再扩展批量多目标验证、结果导出、异常捕获、命令行传参同时讲解代码规范、踩坑点、法律边界。读完本篇你能够独立写出结构完整、支持批量检测、结果保存的漏洞 POC 模板后续遇到各类 Web 漏洞都可以基于这个模板快速改造。⚠️免责声明本文所有代码仅用于本地靶场、自己授权环境学习测试。未经目标系统所有者书面授权禁止使用脚本扫描、探测互联网上任何网站、服务器。私自对未授权资产进行漏洞探测、扫描违反《网络安全法》一切违规行为由使用者自行承担法律责任。一、POC 开发前置知识准备1.1 需要掌握的 Python 基础写 Web 类漏洞 POC不需要精通 Python 全栈掌握下面基础就足够requests 库发送 HTTP 请求GET、POST设置请求头、Cookie、POST 数据是 Web POC 最核心库字符串判断if 特征字符串 in response.text通过页面返回内容判断漏洞是否存在异常捕获try except处理网络超时、连接拒绝、DNS 解析失败文件读写读取目标列表、输出检测结果到 txt/csv命令行参数argparse运行脚本时从外部传入参数不用每次修改源码。1.2 环境安装Python3 是必备推荐 3.8 及以上版本。安装 requests 库pip install requests重要提示尽量不要使用 Python2Python2 早已停止维护现在 SRC、安全工具全部基于 Python3。1.3 POC 编写的设计原则写代码前一定要记住最小影响原则POC 只做检测不要执行删除文件、读取敏感数据、写入 Webshell 等破坏性动作低误报不能只靠状态码判断尽量使用页面返回的唯一特征字符串做判断健壮性网络不稳定、目标端口关闭、HTTPS 证书报错、超时脚本不能直接崩溃可扩展单个目标函数和批量逻辑分离方便修改适配不同漏洞输出清晰区分【存在漏洞】【不存在漏洞】【访问异常】三种结果。1.4 POC 与 EXP、扫描器的区别POC验证漏洞是否存在轻量无破坏性EXP漏洞利用执行命令、获取权限风险极高漏洞扫描器大量规则并发请求适合资产批量巡检底层原理就是大量 POC 集合。二、第一个简单 POC单个目标漏洞验证示例简单 SQL 注入检测演示仅作为教学演示逻辑不是通用 SQL 注入工具。真实场景不能只靠简单字符判断。漏洞场景假设网站参数id存在 SQL 注入当传入id1页面返回MySQL数据库报错信息以此作为判断特征。我们写一个函数poc_check(url)接收目标 URL返回检测结果。import requests def poc_check(target_url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 } payload ?id1 vuln_url target_url payload try: # 关闭证书校验设置超时5秒防止卡死 resp requests.get(vuln_url, headersheaders, verifyFalse, timeout5) resp_text resp.text # 判断页面是否包含数据库报错特征 if MySQL in resp_text or You have an error in your SQL syntax in resp_text: return True, f【存在漏洞】 {vuln_url} else: return False, f【无漏洞】 {vuln_url} except requests.exceptions.Timeout: return False, f【访问超时】 {vuln_url} except requests.exceptions.ConnectionError: return False, f【连接失败无法访问】 {vuln_url} except Exception as e: return False, f【未知异常】{vuln_url} 错误信息{str(e)} if __name__ __main__: # 填写自己靶场地址 target http://127.0.0.1/sqli result, msg poc_check(target) print(msg)代码逐段解析headers模拟浏览器 UA很多网站会拦截默认 requests 的 UAverifyFalse忽略 HTTPS 证书警告自测常用生产正规 POC 可以去掉timeout55 秒没有响应直接抛出超时防止脚本卡死try except 捕获网络异常超时、连接拒绝、DNS 解析失败单独分类返回信息返回两个值布尔值是否存在漏洞 消息文本方便后续批量脚本调用。运行脚本就可以对单个靶场地址进行检测。重点漏洞判定的特征字符串一定要找漏洞触发之后才会出现的独有特征通用页面文字不能作为判断依据否则产生大量误报。三、升级批量 POC 脚本读取目标列表批量检测实际安全巡检场景不可能一个一个手动输入目标一般会把所有目标放到target.txt一行一个 URL循环读取并调用 poc_check 函数。target.txt 示例内容http://127.0.0.1/sqli http://127.0.0.1/test http://192.168.1.100完整批量代码import requests # 关闭requests的HTTPS证书告警 requests.packages.urllib3.disable_warnings() def poc_check(target_url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 } payload ?id1 vuln_url target_url payload try: resp requests.get(vuln_url, headersheaders, verifyFalse, timeout5) resp_text resp.text if MySQL in resp_text or You have an error in your SQL syntax in resp_text: return True, f【存在漏洞】 {vuln_url} else: return False, f【无漏洞】 {vuln_url} except requests.exceptions.Timeout: return False, f【访问超时】 {vuln_url} except requests.exceptions.ConnectionError: return False, f【连接失败】 {vuln_url} except Exception as e: return False, f【未知异常】{vuln_url} 错误{str(e)} def batch_scan(file_path): # 保存存在漏洞的结果 vuln_result [] try: with open(file_path, r, encodingutf-8) as f: lines f.readlines() for line in lines: target line.strip() # 跳过空行 if not target: continue print(f正在检测{target}) is_vuln, msg poc_check(target) print(msg) if is_vuln: vuln_result.append(msg) # 将存在漏洞的目标写入vuln.txt with open(vuln.txt, w, encodingutf-8) as out_f: for item in vuln_result: out_f.write(item \n) print(\n扫描完成存在漏洞的结果已保存至 vuln.txt) except FileNotFoundError: print(f错误文件 {file_path} 不存在) if __name__ __main__: batch_scan(target.txt)批量脚本逻辑讲解读取 target.txt循环每一行strip 去除换行、空格调用 poc_check打印实时检测信息如果判断存在漏洞存入列表全部扫描结束将所有漏洞目标写入vuln.txt方便后续 SRC 提交、复盘捕获文件不存在异常防止脚本直接崩溃。运行命令python poc_batch.py当前版本是串行单线程逐个请求。目标数量大的时候速度很慢。后面会讲解多线程优化方案。四、进阶优化命令行传参灵活指定目标文件使用 argparse 实现命令行传参不用每次打开源码修改文件名更加专业符合开源 POC 的习惯。import requests import argparse requests.packages.urllib3.disable_warnings() def poc_check(target_url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 } payload ?id1 vuln_url target_url payload try: resp requests.get(vuln_url, headersheaders, verifyFalse, timeout5) resp_text resp.text if MySQL in resp_text or You have an error in your SQL syntax in resp_text: return True, f【存在漏洞】 {vuln_url} else: return False, f【无漏洞】 {vuln_url} except requests.exceptions.Timeout: return False, f【访问超时】 {vuln_url} except requests.exceptions.ConnectionError: return False, f【连接失败】 {vuln_url} except Exception as e: return False, f【未知异常】{vuln_url} 错误{str(e)} def batch_scan(file_path): vuln_result [] try: with open(file_path, r, encodingutf-8) as f: lines f.readlines() for line in lines: target line.strip() if not target: continue print(f正在检测{target}) is_vuln, msg poc_check(target) print(msg) if is_vuln: vuln_result.append(msg) with open(vuln.txt, w, encodingutf-8) as out_f: for item in vuln_result: out_f.write(item \n) print(\n扫描完成结果保存 vuln.txt) except FileNotFoundError: print(f文件 {file_path} 不存在) if __name__ __main__: parser argparse.ArgumentParser(description漏洞POC批量检测脚本) parser.add_argument(-f, --file, help目标URL列表文件例如 target.txt, requiredTrue) args parser.parse_args() batch_scan(args.file)使用方式python poc_batch.py -f target.txt五、多线程加速批量扫描重点实战串行扫描几百个目标速度非常慢使用concurrent.futures.ThreadPoolExecutor实现多线程并发请求。注意线程数不要设置太大推荐 10~30线程过多容易触发目标 WAF 封禁 IP也容易产生大量网络异常。import requests import argparse from concurrent.futures import ThreadPoolExecutor, as_completed requests.packages.urllib3.disable_warnings() def poc_check(target_url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 } payload ?id1 vuln_url target_url payload try: resp requests.get(vuln_url, headersheaders, verifyFalse, timeout5) resp_text resp.text if MySQL in resp_text or You have an error in your SQL syntax in resp_text: return True, f【存在漏洞】 {vuln_url} else: return False, f【无漏洞】 {vuln_url} except requests.exceptions.Timeout: return False, f【访问超时】 {vuln_url} except requests.exceptions.ConnectionError: return False, f【连接失败】 {vuln_url} except Exception as e: return False, f【未知异常】{vuln_url} 错误{str(e)} def task(target): is_vuln, msg poc_check(target) print(msg) return is_vuln, msg def batch_thread_scan(file_path, thread_num15): targets [] vuln_result [] try: with open(file_path, r, encodingutf-8) as f: for line in f.readlines(): line line.strip() if line: targets.append(line) print(f共加载目标数量{len(targets)}开始多线程扫描线程数{thread_num}) with ThreadPoolExecutor(max_workersthread_num) as executor: future_list [executor.submit(task, t) for t in targets] for future in as_completed(future_list): is_vuln, msg future.result() if is_vuln: vuln_result.append(msg) with open(vuln.txt, w, encodingutf-8) as f: for item in vuln_result: f.write(item \n) print(\n全部任务执行完毕漏洞目标保存 vuln.txt) except FileNotFoundError: print(f文件 {file_path} 不存在) if __name__ __main__: parser argparse.ArgumentParser(description多线程POC批量漏洞验证脚本) parser.add_argument(-f, --file, help目标列表文件, requiredTrue) parser.add_argument(-t, --thread, help线程数量默认15, typeint, default15) args parser.parse_args() batch_thread_scan(args.file, args.thread)运行示例指定 20 线程python poc_batch.py -f target.txt -t 20多线程使用注意事项线程不是越大越快太高容易被 WAF 拉黑本机 IP网络请求属于 IO 密集型任务多线程非常适合 POC 场景不建议加代理池、超高并发用于互联网无差别扫描。六、POC 编写通用模板适配各种 Web 漏洞上面的代码可以作为通用模板更换下面两处即可快速改成其他漏洞 POC修改请求方式GET 改为 POST添加 POST 的 data/json修改 payload 和判断特征字符串。示例POST 请求漏洞修改示例片段def poc_check(target_url): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36, Content-Type: application/x-www-form-urlencoded } post_data {username:admin,password:123456} try: resp requests.post(target_url, datapost_data, headersheaders, verifyFalse, timeout5) if 欢迎管理员 in resp.text: return True, 存在漏洞 except Exception as e: return False, str(e)如果漏洞是 JSON 提交使用json{}代替data。七、POC 开发常见踩坑新手高频问题坑 1只依靠 HTTP 状态码判断漏洞if resp.status_code 200就判定存在漏洞误报率极高。200 只是页面正常返回不能证明漏洞存在。优先页面返回特征文本。坑 2不设置 timeout脚本卡死目标服务器无响应requests 会永久阻塞整个脚本停住所有 POC 必须加上 timeout。坑 3忽略 URL 末尾斜杠问题目标http://xxx.com和http://xxx.com/拼接 payload 很容易变成http://xxx.com?id1缺少斜杠导致请求地址错误。可以在代码里做 URL 预处理自动处理末尾/。坑 4UA 固定不变短时间大量请求被 WAF 拦截批量扫描大量目标时WAF 识别高频相同 UA 直接拦截可以准备 UA 列表随机选择。坑 5没有异常捕获遇到一个异常目标整个程序崩溃没有 try except遇到一个无法访问网站程序直接终止前面扫描结果丢失。坑 6直接复制网上 POC 不审计代码网上很多开源 POC 暗藏恶意代码运行前逐行阅读代码理解每一行作用。坑 7把 POC 拿来扫公网大量站点就算只是漏洞验证未授权批量扫描公网资产属于违规行为。POC 仅限自己搭建的 DVWA、WebGoat 等本地靶场。八、POC 提交 SRC 的规范当你挖到漏洞提交 SRC 时配套 POC 有规范代码简洁带详细注释只能验证漏洞不能执行命令、下载文件提供复现步骤、请求包截图说明影响版本、漏洞特征附带 poc 运行输出结果。SRC 平台审核人员会运行你的 POC 复现漏洞如果 POC 破坏性强会直接驳回严重情况会上报。九、拓展学习方向学习 burp 导出请求包转 Python requests 代码快速生成 POC 请求学习处理 JSON 响应resp.json()解析接口返回数据学习代理配置POC 流量走 Burp 抓包调试proxies { http: http://127.0.0.1:8080, https: http://127.0.0.1:8080 } resp requests.get(url,proxiesproxies,verifyFalse)学习导出 CSV 格式扫描结果方便 Excel 查看学习异步 aiohttp更高并发 IO 扫描学习框架pocsuite3是国内安全圈主流 POC 框架标准化管理大量 POC。总结Python 写 POC 的核心逻辑构造漏洞请求 payload发送 HTTP 数据包根据页面返回特征判断漏洞增加异常处理扩展批量、多线程能力。POC 的本质是自动化复现漏洞检测流程不是攻击工具。新手入门最关键的习惯守住法律边界只在自己搭建靶场测试写代码坚持 POC 最小影响原则。不要一上来就追求复杂 EXP把基础 POC 模板练熟学会修改 payload、判断特征、处理网络异常后续遇到任意 Web 漏洞都可以快速编写验证脚本。POC 编写能力是漏洞挖掘、SRC、红蓝对抗岗位的基础技能。最后关于网络安全技术储备网络安全是当今信息时代中非常重要的一环。无论是找工作还是感兴趣黑客都是未来职业选择中上上之选为了保护自己的网络安全学习网络安全知识是必不可少的。如果你是准备学习网络安全黑客或者正在学习下面这些你应该能用得上①网络安全学习路线②20份渗透测试电子书③安全攻防357页笔记④50份安全攻防面试指南⑤安全红队渗透工具包⑥网络安全必备书籍⑦100个漏洞实战案例⑧安全大厂内部视频资源⑨历年CTF夺旗赛题解析一、网络安全黑客学习路线网络安全黑客学习路线形成网络安全领域所有的知识点汇总它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。二、网络安全教程视频我们在看视频学习的时候不能光动眼动脑不动手比较科学的学习方法是在理解之后运用它们这时候练手项目就很适合了。三、网络安全CTF实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这里带来的是CTFSRC资料HW资料毕竟实战是检验真理的唯一标准嘛~四、网络安全面试题最后我们所有的作为都是为就业服务的所以关键的临门一脚就是咱们的面试题内容所以面试题板块是咱们不可或缺的部分这里我给大家准备的就是我在面试期间准备的资料。网安其实不难难的是坚持和相信自己我的经验是既然已经选定网安你就要相信它相信它能成为你日后进阶的高效渠道这样自己才会更有信念去学习才能在碰到困难的时候坚持下去。机会属于有准备的人这是一个实力的时代。人和人之间的差距不在于智商而在于如何利用业余时间只要你想学习什么时候开始都不晚不要担心这担心那你只需努力剩下的交给时间这份完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表