第一步:信息收集(Reconnaissance)
- 观察页面:看它是做什么的(登录框、留言板、文件上传点)。
- 查看源码:在浏览器右键“查看网页源代码”,寻找隐藏的 HTML 注释、隐蔽的 JS 文件、或者开发人员遗留的提示。(有可能转码之后会有暗示的信息)
- 检查 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)。
- 弱类型与函数缺陷:利用 PHP 核心对非严格相等(
2. Python (Flask / Django) 架构体系
-
技术识别特征:响应头含有
Server: Werkzeug/...,或抛出特有的带 Traceback 调试页面、客户端 Session 呈现 Base64 加密的 JSON 复合结构。 -
专项深度解法:
- 服务端模版注入(SSTI):针对 Jinja2 或 Mako 等模版引擎对未经安全过滤的插值表达式(如
{{...}})进行动态解析的缺陷,利用 Python 的内省机制(Introspection),通过基础类逐步溯源至基类__mro__,进而遍历子类__subclasses__()寻找如os.popen或subprocess.Popen等危险受控类,实现沙箱逃逸与 RCE。 - 序列化反序列化(Pickle 注入):针对 Python 的
pickle.loads()缺陷,在反序列化过程中触发类的__reduce__魔术方法,直接向解释器注入并执行精心构造的系统命令。
- 服务端模版注入(SSTI):针对 Jinja2 或 Mako 等模版引擎对未经安全过滤的插值表达式(如
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构造函数等技巧,绕过安全隔离限制,获取宿主机的底层控制权。
- 原型链污染(Prototype Pollution):利用 JavaScript 基于原型的继承特性,在应用执行深度克隆(clone)或对象合并(merge/extend)且未进行键名审计时,注入
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),实现底层操作系统指令的越权调度。
- 表达式注入(SpEL/EL Injection):针对 Spring 框架解析标准表达式或 Spring Expression Language 时引入的解析缺陷,通过构造惡意的实体解析语法,在表达式上下文中实例化任意 Java 对象并调用其运行时方法(如
-
-
如果遇到 WAF(Web 应用防火墙)过滤,尝试进行绕过(Bypass)。例如:
- 过滤了
cat关键字,用ca\t、c""at或tac、more代替。 - 过滤了空格,在 Linux 下用
${IFS}、$IFS$9或<代替。
- 过滤了
第四步:编写脚本与自动化
当需要进行大量重复尝试时(如盲注需要逐个字符比对、或者有动态验证码、时间限制),使用 Python 的 requests 库编写脚本,自动化跑出 Flag。
四、 必备的常用工具
- Burp Suite:Web 安全神器。用于拦截、修改和重放 HTTP 请求(Proxy、Repeater、Intruder 模块最常用)。
- Hackbar :用于快速修改 POST 数据、Cookie 和自定义 Header。
- Dirsearch:快速扫描网站敏感目录和备份文件。
- Sqlmap:自动化 SQL 注入工具(但在 CTF 中,很多题目会针对 sqlmap 做反爬或过滤,手工注入或自己写 Python 脚本往往更有效)。
- CyberChef:用于各种编码(Base64, Hex, URL, URLen/Decode)和加解密的快速转换。
今天大概了解了一下之后,我觉得首先要学会那几种语言,然后才知道怎么针对漏洞来解决。
今天打算先看看PHP(暂时不详细记录了)
Comment to Unlock
Leave a quick comment below, then unlock this post.