一、SQL注入渗透与攻防
1. SQL注入基础入门
1)SQL注入的数据类型
- 数字型注入
- 数字型注入: 注入点id类型为数字,SQL语句原型大概为select * from 表名 where id=1。若存在注入,可以构造出类似select * from 表名 where id=1 and 1=1的SQL注入语句进行爆破。
- 字符型注入
- 字符型注入: 注入点name类型为字符,SQL语句原型大概为select * from 表名 where name='admin'。若存在注入,可以构造出类似select * from 表名 where name='admin' and '1'='1'的SQL注入语句进行爆破。需要注意的是,这里相比于数字型注入多了引号,可以是单引号或双引号。
- 搜索型注入
- 搜索型注入: 一般在链接地址中有keyword=关键字,提交的数据SQL语句原形大致为select * from 表名 where 字段 like '%关键字%'。若存在注入,可以构造出类似select * from 表名 where 字段 like '%测试%' and '%1%'的SQL注入语句进行爆破。
- 其他类型注入(叉叉型)
- 叉叉型注入: 除了数字型、字符型、搜索型以外的其他类型,统称为叉叉型。这类注入主要是指在进行数据搜索时没过滤搜索参数,通过不同方式提交恶意SQL语句。
2)判断注入方式
- 判断注入方式: 根据注入点的数据类型和SQL语句的拼接方式,判断并选择合适的注入方式进行攻击。这需要对SQL注入有深入的理解和实战经验。
2. SQL注入之MYSQL手工注入
1)SQL注入基础
- 数字型注入点
- 概念: 数字型注入点是指注入点id类型为数字,在大多数的网页中,诸如查看用户个人信息,查看文章等,会使用这种形式的结构传递id等信息给后端,查询数据库中对应的信息,再返回给前台。
- SQL语句原型: select * from 表名 where id=1
- 注入示例: 若存在注入,我们可以构造出类似如下的SQL注入语句进行爆破:select * from 表名 where id=1 and 1=1
- 字符型注入点
- 概念: 字符型注入点是指注入点name类型为字符类型,所以叫字符型注入点。这一类的SQL语句原型多了引号,可以是单引号或者是双引号。
- SQL语句原型: select * from 表名 where name='admin'
- 注入示例: 若存在注入,我们可以构造出类似如下的SQL注入语句进行爆破:select * from 表名 where name='admin' and '1'='1'
- 注意点: 我们需要将这些烦人的引号给处理掉。
- 搜索型注入点
- 概念: 此类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”有的不显示在链接地址里面,而是直接通过搜索框表单提交。
- SQL语句原型: select * from 表名 where 字段 like '%关键字%'
- 注入示例: 若存在注入,我们可以构造出类似如下的SQL注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='1'
2)SQL注入流程
- 第一步: 判断有无注入点
- 说明: 在进行手工注入前,首先要判断目标站点是否存在注入点。
3. SQL注入之MYSQL系统库
1)判断注入点
- 重要性: 在进行SQL注入之前,必须判断网站是否存在注入点,这是注入成功的前提。
- 方法: 可以通过工具扫描或手工注入的方式去判断网站是否存在注入点。
- 实例: 随便乱输是一种简单的判断方法,即尝试在网站的输入框中输入不同的数据,观察网站的响应,从而判断是否存在注入点。
4. SQL注入之高权限注入上
1)演示环境准备
- 操作: 打开靶场,通过靶场进行演示。
2)进入靶场
- 步骤: 运行靶场,进入logo host里面的sqli labs。
3)传ID值演示
- 操作: 在sqli labs中传一个ID值,如ID=1。
- 结果: 显示对应的数据,因为ID值传到了index页面。
5. SQL注入基础
1)SQL注入的概念与判断方法
- SQL注入概念: SQL注入是一种通过输入恶意SQL语句,使服务器执行未经预期的SQL命令的攻击方式。
- 判断注入点的方法: 可以通过在输入字段后添加特定SQL语句(如1' OR '1'='1),观察页面返回结果是否变化来判断是否存在SQL注入点。若页面显示正常或报错信息有变化,则可能存在注入点。
2)SQL注入的实际操作示例
- 操作示例: 在网站的输入字段中输入如id=1 and 1=1,若页面能正常显示,说明存在SQL注入点。通过进一步构造SQL语句,可以读取或篡改数据库中的数据。
- 注意事项: 进行SQL注入测试时,需确保在合法授权的环境下进行,以避免法律风险。
3)SQL注入的防御措施
- 输入验证: 对用户输入进行严格的格式验证,拒绝非法字符或格式的输入。
- 使用参数化查询: 在SQL查询中使用参数化语句,避免将用户输入直接拼接到SQL语句中。
- 最小权限原则: 为数据库用户分配最小必要权限,减少潜在风险。
- 定期安全审计: 定期对系统进行安全审计,发现并修复安全漏洞。
6. SQL注入之数据类型
1)数字型注入点
- 数字型注入点概述
- 定义: 数字型注入点是指通过输入数字类型的参数,利用SQL注入漏洞攻击数据库的一种安全漏洞。
- 例题1:判断数字型注入点
- 数字型注入点的执行条件
- 条件: 数字型注入点通常适用于接收数字类型参数的SQL查询语句,且该参数未经过严格的过滤或验证。
- 原理: 当输入的参数被直接拼接到SQL查询语句中执行时,攻击者可以通过构造特定的输入值,改变原有的查询逻辑,从而获取或篡改数据库中的数据。
- 通过报错判断注入点
- 方法: 输入导致SQL语句执行错误的条件(如and 1=2),观察页面是否报错。
- 目的: 通过报错信息确认后台是否将用户输入作为SQL语句的一部分执行,从而判断是否存在注入点。
- 注意: 报错信息也可能泄露数据库结构等敏感信息,需谨慎处理。
- 数字型注入点的局限性
- 局限性: 数字型注入点主要适用于数字类型的参数输入,对于字符型参数或其他类型的输入可能无效。
- 原因: 字符型参数通常需要额外的引号或其他符号进行包裹,直接拼接数字条件可能导致SQL语句语法错误,从而无法成功注入。
- 举例: 若参数为字符型,如用户名,则直接拼接and 1=1可能导致SQL语句变为SELECT * FROM users WHERE username='admin' and 1=1',由于引号不匹配,导致语句执行失败。
2)字符型注入点
- 字符型注入点介绍
- 字符型注入点定义: 字符型注入点是指SQL注入攻击中,输入参数被单引号包围,形成字符型数据的注入点。
- 字符型注入点判断方法
- 判断方法: 通过在输入参数后添加单引号,观察页面是否报错来判断是否存在字符型注入点。如果添加单引号后页面报错,说明存在字符型注入点。
- 字符型与数字型注入点区别
- 区别:
- 数字型注入点: 传递的参数为数字,如1、2、3等。
- 字符型注入点: 传递的参数为字符,且被单引号包围,如'a'、'b'等。
- 本质区别: 字符型注入点在SQL语句中会将参数视为一个整体(包括单引号),而数字型注入点则直接处理数字。
- 区别:
- 字符型注入点闭合技巧
- 闭合技巧: 在测试字符型注入点时,需要在输入参数后添加单引号以闭合原有的单引号,从而破坏SQL语句的结构,观察是否报错或产生异常行为。
- 字符型注入点实例演示
3)搜索型注入点
- 数字型与字符型注入
- 数字型注入: 数字型注入通常用于传递ID等数字参数,例如id=1。
- 字符型注入: 字符型注入则常用于传递如用户名等字符参数,例如username='admin',其中参数值被单引号或双引号包围。
- 模糊查询与通配符
- 模糊查询: 模糊查询允许通过部分信息搜索相关数据,例如通过用户名的一部分来查找用户。
- 通配符: 在SQL中,百分号%用作通配符,代表任意数量的字符。例如,LIKE '%d%'会匹配所有包含字母'd'的字符串。
- 示例: 查询用户名中包含'd'的所有用户,可以使用SELECT * FROM users WHERE username LIKE '%d%'。
- 搜索型注入的构造
- 构造方法: 在搜索型注入中,可以利用通配符和逻辑运算符构造注入语句。例如,y%' OR 1=1#,其中%闭合前面的通配符,OR 1=1确保条件为真,#注释掉后面的语句。
- 注入语句的闭合与注释
- 闭合: 注入语句中需要闭合原有的SQL语句,以确保注入的部分能够正确执行。例如,通过%'闭合前面的通配符和单引号。
- 注释: 使用#或--等注释符号可以注释掉原SQL语句中不需要的部分,避免语法错误。
- 逻辑判断与注入效果
- 逻辑判断:
- AND: 两边条件都需为真,例如id=1 AND 1=1。
- OR: 任意一边条件为真即可,例如id=1 OR 1=1。
- 注入效果: 通过构造如y%' OR 1=1#的注入语句,可以绕过原有条件,查询出所有用户数据,达到注入的目的。
- 示例: 在用户名搜索框中输入y%' OR 1=1#,可以查询出所有用户,而不仅仅是用户名中包含'y'的用户。
- 逻辑判断:
4)其他型注入点
- 定义与特点
- 定义: 其他型注入点,也称为叉叉型注入点,是指除了常见字符型、数字型等注入点以外的其他类型注入点。
- 特点: 这类注入点通常由于SQL语句拼接方式不同而产生,其闭合符号和注入方式可能更加复杂多变。
- 常见的闭合符号
- 单引号、双引号、百分号、括号等都可能是其他型注入点的闭合符号。
- 尝试法: 在不确定闭合符号时,可以通过尝试不同的闭合符号来找到正确的注入方式。
- 示例: 原本SQL语句中的值(如'YY')是我们需要传递的,为了闭合这个值,我们可能需要在其后面添加一个括号或其他闭合符号。
- 注入方法与技巧
- 构造注入语句: 根据目标网站的SQL语句结构,构造出包含注入代码的SQL语句。
- 使用注释符号: 在注入语句中使用注释符号(如#、--等)来屏蔽掉原SQL语句中的部分代码,从而改变SQL语句的执行逻辑。
- 判断注入点: 通过观察网站的响应来判断是否存在注入点,以及注入点的类型和闭合符号。
- 技巧: 在尝试注入时,可以先使用简单的注入语句(如'or 1=1')来判断是否存在注入点,然后再根据响应结果来逐步调整注入语句的复杂度和精度。
- 闭合的重要性
- 闭合的目的: 闭合是为了确保注入的SQL语句能够正确地被目标网站解析和执行。
- 闭合的方法: 根据目标网站的SQL语句结构和闭合符号来选择合适的闭合方法。
- 重点: 如果不正确地闭合注入语句,可能会导致注入失败或产生不可预测的结果。因此,在进行SQL注入时,必须仔细分析和尝试不同的闭合方法和符号。
- 实战应用
- 实战步骤:
-
- 分析目标网站的SQL语句结构。
- 构造包含注入代码的SQL语句。
- 使用不同的闭合符号和注释符号进行尝试。
- 观察网站的响应结果,判断是否存在注入点以及注入点的类型和闭合符号。
- 根据响应结果调整注入语句的复杂度和精度,直到成功获取到想要的数据或执行想要的操作。
- 提醒: 在进行实战应用时,必须遵守法律法规和道德规范,不得用于非法目的或侵犯他人权益。同时,也需要做好安全防护措施,防止被反制或追踪。
二、知识小结
知识点 |
核心内容 |
考试重点/易混淆点 |
难度系数 |
数据类型与提交方式 |
数据类型包括数字型、字符型、搜索型、叉叉型 |
数据类型的识别与注入方式 |
中 |
数字型注入 |
使用and 1=1或and 1=2判断注入点 |
数字型注入的判断方法 |
易 |
字符型注入 |
单引号或双引号闭合判断注入点 |
字符型与数字型注入的区别 |
中 |
搜索型注入 |
使用like关键字进行模糊查询 |
模糊查询的语法与注入方式 |
难 |
叉叉型注入 |
其他非主流数据类型 |
尝试多种闭合符判断注入点 |
难 |
注入点判断 |
通过报错或正常显示判断注入点 |
注入点判断的逻辑与实际操作 |
易 |
逻辑判断符 |
and与or的区别 |
逻辑判断符在注入中的应用 |
中 |
注释符 |
井号(#)用于注释后续语句 |
注释符在注入中的使用技巧 |
易 |