一 学习路线
SQL注入定义: SQL注入是一种通过操作输入数据来影响后台SQL语句执行,从而获取、修改、删除数据库数据的技术。
学习重要性: 了解SQL注入是保障数据库安全的重要一环,有助于防范和应对潜在的安全威胁。
注入方式多样性: SQL注入方式会根据不同情况有所改变,需要灵活应对。
- 数据库类型: 包括MYSQL、MSSQL、Oracle等,不同数据库在SQL注入中可能有不同的特性和漏洞。
- 提交方式: 如GET、POST等,不同的提交方式可能影响SQL注入的攻击方式和防御策略。
- 数据类型: 数字型、字符型等,数据类型的不同会影响SQL注入的构造和效果。
- 查询方式: 如select、insert、delete、update、order by等,不同的查询方式可能引发不同的SQL注入风险。
- 注入类型: 包括回显注入、盲注(无回显注入、延时盲注、布尔盲注)等,不同类型的注入需要不同的检测和防御方法。
二 数据库类型
1. 数据库类型的分类
- 关系型数据库: 如MySQL、MSSQL、Oracle等,这类数据库采用表格形式存储数据,数据之间存在关联关系。
- 非关系型数据库: 如MongoDB等,这类数据库采用键值对、文档等形式存储数据,数据之间不一定存在关联关系。
2. 不同数据库类型的注入差异
- 注入流程与方式的变化: 不同的数据库由于其结构和特性的不同,在进行SQL注入时,其注入的流程和方式也会有所变化。例如,MySQL和MSSQL的注入方式就存在差异。
- 具体数据库类型的注入: 如MySQL注入、MSSQL注入、Oracle注入等,每种数据库都有其特定的注入方法和技巧。
3. 前端页面提交方式对注入的影响
- 提交方式的不同: 前端页面可以通过GET、POST等方式提交数据,不同的提交方式会影响SQL注入的方式和难度。
- 根据提交方式选择注入方法: 例如,对于GET提交方式,注入者可能直接在URL中插入恶意SQL语句;而对于POST提交方式,注入者则可能需要通过抓包工具来修改POST数据,进而插入恶意SQL语句
4. SQL注入的其他相关知识
- 注入回显: 注入后能够在页面上直接看到注入结果的称为回显注入,否则称为盲注。
- 注入类型: 除了数字型、字符型等基本类型外,还有基于布尔的盲注、基于时间的盲注等。
- 绕过WAF: WAF(Web应用防火墙)会阻止SQL注入等攻击,但注入者可能会尝试使用编码、大小写混合等方法来绕过WAF的检测。
三、提交方式
1. 传统的提交方式
- GET提交: 通过URL头部传递参数。
- POST提交: 直接通过表单向服务器提交数据。
- 其他提交方式: 还包括COOKIE提交、REQUEST提交、HTTP头提交等。
2. 提交方式与SQL注入的关系
- 不同提交方式影响注入方法: 不同的提交方式,其SQL注入的提交方式也不一样,注入的方法和整个流程可能有所不同。
- 注入方式多样性: 根据提交方式的不同,注入方式也会有所变化,需要针对性地进行注入尝试。
四、数据类型
1. 数字型与字符型
- 数字型: 不需要加单引号,如ID=1,其中的1就是数字类型。
- 字符型: 需要加单引号或双引号,如name='张三',其中的张三就是字符类型。
2. 其他数据类型
- 说明: 除了数字型和字符型,还有其他数据类型,如搜索型等,后续会进行补充讲解。
3. SQL语句的查询方式
- 说明: SQL语句的查询方式也会影响注入的方式,需要根据具体的查询方式来调整注入策略。
五、查询方式
1. SQL语句类型
1)查询(SELECT)
- 用途: 用于从数据库中检索数据。
- 举例: 查询用户ID、用户名、密码等。
2)插入(INSERT)
- 用途: 用于向数据库中添加新数据。
- 举例: 用户注册时向数据库添加新用户信息。
3)删除(DELETE)
- 用途: 用于从数据库中移除数据。
- 举例: 在购物网站中删除不想要的商品。
4)更新(UPDATE)
- 用途: 用于修改数据库中的现有数据。
- 举例: 用户修改自己的用户名或密码。
2. 场景应用
1)登录场景
- SELECT语句: 用于验证用户输入的账号和密码是否正确。
- 举例: 在京东登录页面,输入账号“张三”和密码“12345”,服务器会执行SELECT语句查询数据库。
2)注册场景
- INSERT语句: 用于将新用户信息添加到数据库中。
- 举例: 在京东注册页面,填写账号和密码后,服务器会执行INSERT语句添加新用户。
3. SQL语句选择依据
- 依据功能不同: 不同的功能场景会使用不同的SQL语句。
- 预知SQL类型: 在进行注入检测或注入时,需根据功能预知可能使用的SQL语句类型(SELECT、INSERT、DELETE、UPDATE等)。
4. 其他SQL语句
1)排序(ORDER BY)
- 用途: 用于对查询结果进行排序。
- 举例: 在商品列表中按价格或销量进行排序。
2)分组(GROUP BY)
- 用途: 用于将查询结果按某一列或多列进行分组。
- 举例: 统计每个部门的员工数量。
5. 总结
- SQL语句多样性: SQL语言包含多种语句类型,如SELECT、INSERT、DELETE、UPDATE等,各自适用于不同的数据操作场景。
- 场景预判: 在实际应用中,需根据具体功能场景预判可能使用的SQL语句类型,以便进行有效的注入检测或防御。
六、注入方式
1. 注入方式的类型
- 回显注入与无回显注入: 注入方式可以分为有回显的注入和无回显的注入。有回显的注入可以直接看到注入结果,而无回显的注入则无法直接看到结果,需要通过其他方式判断注入是否成功。
- 盲注的类型: 无回显的注入通常被称为盲注,盲注又可以进一步分为岩石盲注和布尔盲注等类型。
七、WAF绕过
1. WAF绕过的方式
- WAF绕过: WAF(Web应用防火墙)绕过是指通过某些技术手段,规避防火墙的安全检测,从而达到访问或攻击被保护资源的目的。
- 绕过方式: 课程后续会详细讲解WAF绕过的具体方式,这里先提及存在多种绕过WAF的技术手段。
2. 额外知识扩展:加密
- 加密: 加密是保护数据安全的重要手段,通过加密算法将明文转换为密文,防止未经授权的访问。
- 与WAF的关系: 加密技术可以与WAF结合使用,增强Web应用的安全性。同时,了解加密原理也有助于理解WAF的工作机制,并可能发现新的绕过方法。
八、SQL注入的相关知识
1. SQL注入方式
- 回显注入: 攻击者通过输入恶意SQL语句,使得数据库返回错误信息或数据,从而判断数据库结构或数据内容。
- 无回显注入: 当无法直接从页面获得数据库返回的信息时,攻击者需要通过其他方式(如布尔盲注、延时注入)来判断注入是否成功。
- 布尔自注: 通过输入不同的SQL语句,观察页面的响应(如正常或异常)来判断注入是否成功。
- 延时自注: 通过在SQL语句中加入延时函数(如SLEEP()),观察页面响应的延时来判断注入是否成功。
- 更改提交方法: 攻击者可能尝试更改表单的提交方式(如GET改为POST)来绕过某些防御措施。
- 大小写混合: 通过混合使用大小写字母来绕过一些简单的过滤规则。
- 解密编码类: 攻击者可能使用解密或编码技术来绕过WAF(Web应用防火墙)的过滤。
- 注释符混用: 使用不同的注释符(如--、/* */)来绕过过滤规则。
- 等价函数替换: 使用功能相同的函数替换被过滤的函数。
- 特殊符号混用: 通过混用特殊符号(如'、"、\)来绕过过滤规则。
- 加解密注入: 利用加密或解密技术来构造恶意SQL语句。
- JSON注入: 针对使用JSON格式传输数据的接口进行SQL注入。
- 二次注入: 攻击者先通过一次注入将恶意数据插入数据库,然后在另一次请求中利用这些数据构造恶意SQL语句。
- 堆叠注入: 在一次请求中提交多条SQL语句,利用分号(;)或其他分隔符分隔。
- 接收格式的注入: 攻击者可能针对应用程序接收数据的方式(如XML、JSON)进行注入。
2. SQL注入防御方案
- 代码加载过滤: 对用户输入的数据进行严格的过滤和验证,防止恶意SQL语句的注入。
- WAF产品部署: 使用WAF来检测和阻止SQL注入攻击。
- 其他防御措施: 包括但不限于对数据库用户权限的严格控制、使用参数化查询或预编译语句、定期更新和修补数据库及应用程序的漏洞等。
九、SQL注入相关知识
1. SQL注入概述
- SQL注入定义: 通过在输入字段中插入SQL语句,以非法获取、篡改或破坏数据库中的数据。
- 学习路线规划: 了解SQL注入的各种知识点,包括查询方式(如select, insert, delete, update, order by等)、注入类型(如回显注入、盲注等)以及防御方案。
2. 数据库与提交方式
- 数据库类型: MYSQL、MSSQL、Oracle、Access等。
- 提交方式: GET、POST、COOKIE、REQUEST、HTTP头等。
- 数据类型: 数字型、字符型等。
3. 靶场搭建与测试
- 靶场搭建: 已经搭建好一个靶场环境,用于模拟SQL注入攻击。
- 测试流程: 通过靶场来手工测试SQL注入的流程,包括识别注入点、构造注入语句、观察回显等。
- 实例演示: 以localhost/sqli-labs-master/Less-2/index.php?id=1为例,展示了如何通过修改id参数来进行SQL注入测试。
4. SQL注入防御方案
- 防御策略: 代码加载过WAF产品、部署安全策略、使用参数化查询、对输入进行严格校验等。
- 绕过技巧: 大小写混合、解密编码、类WAF绕过、注释符混用、等价函数替换、特殊符号混用等。
- 其他注入方式: JSON注入、二次注入、堆叠注入等。
- 注意事项: 在进行SQL注入测试时,应遵守法律法规,不得非法入侵他人系统。
5. 实际操作注意事项
- 操作环境: 可在phpstudy面板中新建站点、数据库、FTP,数据库可在phpMyAdmin等环境中管理。
- 文件目录: 了解网站目录、错误提示页面等的位置,便于后续测试与调试。
- 安全提示: 在进行SQL注入测试时,应确保测试环境的安全性,避免对真实系统造成影响。
十、手工注入流程
1. 手工注入简介
- 手工注入: 通过手工方式测试并注入SQL语句,以了解SQL注入的流程。
2. 第二关选择原因
- 选择原因: 第二关是一个数字型注入,相对简单,适合用来熟悉SQL注入的流程。
3. 数字型注入流程
- 流程概述: 通过在URL中传递ID参数,观察页面返回结果,判断是否存在注入点,并进行注入测试。
4. 数据提交方式讲解
- 数据提交方式: 浏览器向服务器提交数据的方式,主要分为GET提交和POST提交。
5. GET提交与POST提交对比
- GET提交:
- 方式: 通过URL提交数据。
- 安全性: 较低,因为数据暴露在URL中,容易被查看和篡改。
- 数据量: 有限制,一般浏览器对URL长度有限制(如IE限制为2083个字符)。
- POST提交:
- 方式: 通过HTTP请求体提交数据,不暴露在URL中。
- 安全性: 较高,数据不直接显示在URL中。
- 数据量: 较大,没有URL长度的限制。
6. GET提交数据长度限制
- 数据长度限制: 不同的浏览器对URL长度有不同的限制,例如IE限制为2083个字符,Firefox限制为65536个字符。
7. GET提交速度优势
- 速度优势: GET提交的速度通常比POST提交快,因为GET请求不需要处理请求体,减少了服务器处理时间。
8. GET提交适用场景
- 适用场景: GET提交适用于对数据安全性要求不高,且数据量较小的场景,如查询操作。
- 页面提示: 页面提示输入一个ID参数,通过URL进行GET提交。
- 提交示例: 在URL中通过?id=1的方式提交ID参数。
- 源码分析: 通过查看源码,了解ID参数在后台如何处理,以及如何构造SQL查询语句。
- 注入点判断: 通过输入非数字字符(如'张三')测试是否存在注入点,如果程序未对输入进行过滤或判断,则可能存在注入点。
- 注入测试: 如果存在注入点,可以尝试注入额外的SQL语句,如查询数据库表名、列名等信息,进行进一步的渗透测试。
十一、目标练习题
1. 例题1:判断注入点
1)SQL注入判断方法
- 使用and 1=1判断
- 原理: 通过在SQL查询语句后添加逻辑条件and 1=1,判断服务器是否执行了该条件。如果执行且未报错,说明存在SQL注入点。
- 举例: 在URL localhost/sqli-labs-master/Less-2/index.php?id=5 后添加 and 1=1,若页面正常显示,则可能存在注入点。
- 报错信息分析
2)注入点判断后的操作
- 拆解列名数量
3)注意事项
- 随意输入内容测试
- 技巧: 在判断注入点时,可以随意输入内容(如id=你),观察服务器是否报错。如果报错且错误信息中包含SQL语句片段,则存在注入点。
- 原因: 随意输入的内容被服务器当作SQL语句执行,导致报错,从而暴露注入点。
- 提醒: 此方法虽简单,但可能因服务器配置不同而有所差异,需结合其他方法综合判断。
2. 例题2:拆解列名数量
1)拆解列名数量的方法
- 方法: 使用 order by 函数进行排序,通过尝试不同的数字来推断字段数量。
- 步骤:
- 尝试 order by 1,如果正常运行,说明至少有一个字段。
- 依次尝试 order by 2、order by 3 等,直到出现报错。
- 报错时的数字减一即为字段数量。
2)实际操作与结果
- 操作: 在URL中通过 order by 进行尝试。
- 结果:
- order by 1、order by 2、order by 3 均未报错,说明至少有三个字段。
- order by 4 报错,提示“Unknown column 4 in 'order clause'”,因此确定字段数量为3。
3)注意事项
- 空格编码: 在URL中,空格需编码为 %20。
- 报错信息: 报错信息是判断字段数量的关键,需仔细阅读。
4)判断回旋点
- 目的: 通过报错方式判断回旋点,进一步分析SQL注入的可能性。
- 方法: 观察报错信息,结合字段数量,分析SQL查询的结构。
5)例题解析
- 题目解析
- 审题过程: 题目要求通过SQL注入判断某表的字段数量。
- 解题思路:
- 使用 order by 语句尝试不同字段排序。
- 观察报错信息,确定字段数量。
- 答案: 字段数量为3。
- 易错点: 忽略空格编码,直接在URL中使用空格,导致语句无效。
3. 例题3:判断回旋点
1)判断回旋点的目的
- 判断回旋点的本质: 判断回旋点本质上是为了第三步做辅助或铺垫。
2)判断回旋点的方法
- 使用UNION查询: 在已知字段数量的情况下,使用UNION查询来判断回旋点。
- 字段数量一致: 前面的SQL语句查询的字段数量要和后面的查询语句的字段数量一致。
- 执行结果不干扰: 前面SQL语句的执行结果和后面的执行结果不干扰。
3)实战演示
- 示例: 使用ID=-1作为不存在的记录,通过UNION查询判断回旋点。
- 回旋点判断: 在页面中显示的数据即为回旋点,如数字2和数字3。
4)回旋点的重要性
- 回旋点的作用: 回旋点是注入过程中的关键,有回旋点可以大大节省注入的时间和精力。
- 后续操作: 在回旋点处可以进行后续的注入操作,如获取数据库信息等。
- 无回旋点的解决方式: 如果没有回旋点,也有其他方式可以解决,但回旋点是最好的解决方案。
4. 例题4:信息收集
1)信息收集的重要性
- 重要性: 信息收集在注入攻击前至关重要,类似于战前情报收集,需了解对方数据库版本、操作系统、库名、权限等信息,以便制定相应的攻击策略。
2)数据库版本信息收集
- 收集方法
- 方法: 通过使用函数如version(),可以获取数据库的版本信息。
- 实例: 在SQL注入点输入version()函数,回车后页面显示数据库版本为5.7.26。
- 高低版本区分
- 高版本: 5.0及以上版本,具有系统库。
- 低版本: 5.0以下版本,没有系统库。
- 影响: 高版本可通过系统库(如information_schema)查询更多信息,低版本则可能需采用暴力破解等方式。
3)数据库名称信息收集
- 收集方法
- 方法: 使用database()函数,可以获取当前数据库的名称。
- 实例: 在SQL注入点输入database()函数,回车后页面显示数据库名称为“security”。
- 信息利用
- 利用: 获取数据库名称后,可进一步查询该数据库中的表名、字段名等信息,为后续的注入攻击做准备。
4)信息收集与注入攻击的关系
- 关系: 信息收集越充分,注入攻击的方式和方法就越多,成功率也越高。通过收集数据库版本、名称等信息,可以更有针对性地选择注入技术和工具。
5)实战应用:获取账号密码
- 目标设定
- 目标: 通过注入方式获取靶场user表中的所有账号和密码信息。
- 方法: 需结合前面收集的信息,编写相应的SQL注入语句,利用回显点获取账号密码。
十二、知识小结
知识点 | 核心内容 | 考试重点/易混淆点 | 难度系数 |
SQL注入基础 | SQL注入概念、注入方式 | 注入方式分类 | 🌟 |
数据库类型与注入 | 关系型与非关系型数据库注入差异 | 不同数据库注入流程 | 🌟🌟 |
提交方式与注入 | GET、POST等提交方式的注入变化 | 提交方式影响注入方法 | 🌟🌟 |
数据类型与注入 | 数字型与字符型注入区别 | 单引号使用判断 | 🌟 |
SQL语句类型与注入 | SELECT、INSERT、UPDATE、DELETE语句注入 | 语句类型与场景匹配 | 🌟🌟🌟 |
盲注与绕过 | 布尔盲注、时间盲注及绕过方法 | 盲注类型与绕过技巧 | 🌟🌟🌟🌟 |
加密与二次注入 | 数据加密、二次注入概念 | 加密与注入的关系 | 🌟🌟🌟 |
防御策略 | SQL注入防御方法 | 防御策略的实施 | 🌟🌟 |
手工注入流程 | 判断注入点、拆解列名、判断回旋点、信息收集、注入执行 | 手工注入步骤与技巧 | 🌟🌟🌟🌟 |
系统库与信息收集 | information_schema库的使用、数据库版本、库名、表名、字段名收集 | 系统库查询与信息收集方法 | 🌟🌟🌟🌟 |