游客发表
一个漏洞从被发现到被利用,漏洞中间隔着的漏洞就是PoC和Exp。很多人把这两个词混着用,漏洞实际上它们干的漏洞是完全不同的活。
PoC全称Proof of Concept,漏洞中文叫概念验证。漏洞它的漏洞任务只有一个:证明漏洞确实存在。比如某个Web应用对用户输入没做过滤,漏洞PoC可能就是漏洞一段精心构造的URL,访问之后页面上弹出一个alert框。漏洞弹框这件事本身没有任何破坏力,漏洞但它说明了一件事——输入被当成代码执行了。漏洞这就够了。漏洞
我见过一个典型的漏洞PoC,针对某开源CMS的漏洞SQL注入点。整个PoC就是一行curl命令,带一个单引号参数,服务器返回500错误,而正常参数返回200。作者在GitHub的issue里就贴了这两条请求的对比截图。没有拖库,没有提权,甚至没有读取任何数据。但维护者看到那个500和200的差异,当天就合并了修复补丁。
Exp是Exploit的缩写,利用程序。它比PoC往前走了一大步。PoC说“这里有个洞”,Exp说“我不仅能证明有洞,还能从这个洞拿到东西”。同样是那个SQL注入,Exp可能就是一个Python脚本,自动判断数据库类型、猜表名、爆字段、最终把管理员密码哈希dump出来。PoC是敲门砖,Exp是破门锤。
但这里有个容易被忽略的细节:PoC和Exp之间的界限并不总是那么清晰。有些PoC为了证明漏洞可被利用,会带一个无害的payload,比如读取/etc/passwd的第一行,或者执行whoami。这算PoC还是Exp?严格说它已经具备了利用行为,只是没造成实际损害。圈内人一般管这种叫“半Exp”,或者干脆看作者心情怎么标。
真正区分两者的,是意图和通用性。PoC通常针对特定版本、特定配置,甚至特定参数。换个环境可能就不成立了。Exp则追求稳定复现,会处理各种边界情况——目标没回显怎么办、WAF拦截了怎么办、数据库版本不对怎么办。写一个能打的Exp,工作量往往是写PoC的十倍以上。
举个真实的例子。某年一个反序列化漏洞爆出来,最先公开的PoC只有二十几行Java代码,构造一个恶意对象,触发DNS请求。安全研究员用它来检测目标是否存在漏洞——有DNS回连就说明有问题。但很快有人在此基础上写出了Exp,把DNS外带换成了直接执行命令,还加了内存马注入模块。从PoC到Exp,中间隔了大概三天。那三天里,互联网上大批未修复的机器被扫了一遍。
对防守方来说,PoC公开意味着“必须马上打补丁”,因为攻击者拿到PoC之后写出Exp只是时间问题。对攻击方来说,PoC是情报,Exp是武器。而对我这种做漏洞分析的人来说,读PoC能最快理解漏洞成因,读Exp能看清攻击者的真实意图——他到底想拿数据、拿权限,还是只想搞破坏。
最后说个观察。很多漏洞披露邮件列表里,作者会明确标注“PoC only, no exploit”。这不是谦虚,是在划清责任边界。PoC是学术,Exp是实战。你可以拿PoC去申请CVE,拿Exp去申请银手镯。差别就在这儿。
友情链接