第一步:信息收集(Reconnaissance)

  1. 观察页面:看它是做什么的(登录框、留言板、文件上传点)。
  2. 查看源码:在浏览器右键“查看网页源代码”,寻找隐藏的 HTML 注释、隐蔽的 JS 文件、或者开发人员遗留的提示。(有可能转码之后会有暗示的信息)
  3. 检查 HTTP 响应头:看 server 和x-power-by字段,判断后端是 PHP、Python、Java 还是 Node.js,以及具体的版本。

(之后在第三步会详细说明,每一种情况到底是怎么回事,怎么合理利用每一种语言进行针对性的攻击)

第二步:分析漏洞点(Vulnerability Analysis)

  • 如果是黑盒(没源码):输入特殊字符(如 ', ", \, {{7*7}})看系统是否报错。测试输入框是否过滤了关键字。
  • 如果是白盒(有源码):寻找危险函数(如 eval(), system(), include(), unserialize(), unzip()),然后逆向推导:“我输入的数据如何才能流向这个危险函数,并且不被中途的过滤函数拦截?”

第三步:构造 Payload 与漏洞利用(Exploitation)

  • 利用已知的漏洞原理或语言特性编写攻击载荷(Payload)。

    1. PHP 架构体系

    • 技术识别特征:响应头含 X-Powered-By: PHP/...,或伴随 PHPSESSID 凭证、.php 敏感文件泄露。

    • 专项深度解法:

      • 弱类型与函数缺陷:利用 PHP 核心对非严格相等(==)的隐式类型转换机制(如 0e 开头的 MD5 哈希碰撞、数组与字符串比较),绕过逻辑验证。
      • 流式协议利用(Stream Wrappers):在文件包含(LFI)注入点,借助 php://filter 伪协议实现敏感源码的 Base64 编码读取,或利用 php://input 配合 allow_url_include 配置注入恶意命令。
      • 对象反序列化(POP 链):针对 unserialize() 接收的受控序列化字符串,通过审计类的魔术方法(如 __wakeup(), __destruct(), __toString()),逆向构建属性定向传递的面向属性编程(POP)链,最终诱发任意文件写入或远程代码执行(RCE)。

    2. Python (Flask / Django) 架构体系

    • 技术识别特征:响应头含有 Server: Werkzeug/...,或抛出特有的带 Traceback 调试页面、客户端 Session 呈现 Base64 加密的 JSON 复合结构。

    • 专项深度解法:

      • 服务端模版注入(SSTI):针对 Jinja2 或 Mako 等模版引擎对未经安全过滤的插值表达式(如 {{...}})进行动态解析的缺陷,利用 Python 的内省机制(Introspection),通过基础类逐步溯源至基类 __mro__,进而遍历子类 __subclasses__() 寻找如 os.popensubprocess.Popen 等危险受控类,实现沙箱逃逸与 RCE。
      • 序列化反序列化(Pickle 注入):针对 Python 的 pickle.loads() 缺陷,在反序列化过程中触发类的 __reduce__ 魔术方法,直接向解释器注入并执行精心构造的系统命令。

    3. Node.js 架构体系

    • 技术识别特征:响应头包含 X-Powered-By: Express,或在提交 JSON 数据格式时,后端处理具有明显异步回调与对象重组的逻辑特征。

    • 专项深度解法:

      • 原型链污染(Prototype Pollution):利用 JavaScript 基于原型的继承特性,在应用执行深度克隆(clone)或对象合并(merge/extend)且未进行键名审计时,注入 __proto__ 键名。通过篡改全局基类 Object.prototype 的属性,劫持后续实例化对象的行为,常结合特定第三方库(如 lodash)或模版引擎(如 ejs)的执行上下文,转化演变为远程命令执行。
      • 沙箱逃逸(VM/VM2 Escape):针对题目部署的 Node.js 隔离执行环境(沙箱),利用上下文作用域泄露、显式抛出异常以捕获沙箱外部的 Constructor 构造函数等技巧,绕过安全隔离限制,获取宿主机的底层控制权。

    4. Java (Spring Boot / Tomcat) 企业级架构

    • 技术识别特征:响应头含有 Server: Apache-Coyote/...,伴随 JSESSIONID 凭证,或在错误访问时触发典型的 Whitelabel Error Page 静态报错。

    • 专项深度解法:

      • 表达式注入(SpEL/EL Injection):针对 Spring 框架解析标准表达式或 Spring Expression Language 时引入的解析缺陷,通过构造惡意的实体解析语法,在表达式上下文中实例化任意 Java 对象并调用其运行时方法(如 java.lang.Runtime.getRuntime().exec()),绕过应用逻辑层达成 RCE。
      • 反序列化与依赖链(Gadget Chains):针对原生 Java 反序列化(ObjectInputStream)或组件反序列化(如 Fastjson 1.2.x 缺陷、Jackson 漏洞),通过向解析端输入特定封装的恶意字节流或精心构造的 JSON 载荷(Payload)。通过触发解析器内部的反射机制(Getter/Setter 调用),激活底层依赖库(如 Commons Collections 链)中潜藏的恶意调用链(Gadget Chain),实现底层操作系统指令的越权调度。
  • 如果遇到 WAF(Web 应用防火墙)过滤,尝试进行绕过(Bypass)。例如:

    • 过滤了 cat 关键字,用 ca\tc""attacmore 代替。
    • 过滤了空格,在 Linux 下用 ${IFS}$IFS$9< 代替。

第四步:编写脚本与自动化

当需要进行大量重复尝试时(如盲注需要逐个字符比对、或者有动态验证码、时间限制),使用 Python 的 requests 库编写脚本,自动化跑出 Flag。

四、 必备的常用工具

  1. Burp Suite:Web 安全神器。用于拦截、修改和重放 HTTP 请求(Proxy、Repeater、Intruder 模块最常用)。
  2. Hackbar :用于快速修改 POST 数据、Cookie 和自定义 Header。
  3. Dirsearch:快速扫描网站敏感目录和备份文件。
  4. Sqlmap:自动化 SQL 注入工具(但在 CTF 中,很多题目会针对 sqlmap 做反爬或过滤,手工注入或自己写 Python 脚本往往更有效)。
  5. CyberChef:用于各种编码(Base64, Hex, URL, URLen/Decode)和加解密的快速转换。

今天大概了解了一下之后,我觉得首先要学会那几种语言,然后才知道怎么针对漏洞来解决。

今天打算先看看PHP(暂时不详细记录了)