SQL注入的分类是判断漏洞第一步——搞清楚用户输入时被放在SQL语句中的哪个位置。SELECT * FORM XXXXXX WHERE XXXXXX一、按照注入点的参数类型分类(最基础的分类)类型源代码特征攻击判断方法数字型WHERE id = $id参数不用引号包裹?id=1 OR 1=1直接注入逻辑加' 会报错,加AND 1=1 正常,AND 1=2 异常字符型(单引号)WHERE name = '$name'参数被单引号包裹?name=' OR '1'='1' --加' 进行报错,加AND '1'='1 正常字符型(双引号)WHERE name = "$name"参数被双引号包裹?name=" OR "1"="1" --搜索型(LIKE)WHERE title LIKE '%$key%'参数被单引号和百分号包裹?key=xx% OR 1=1 --需要同时闭合百分号与引号括号型WHERE id = ($id)或者('$name')攻击需要先闭合括号:?id=1) OR 1=1 --二、按照攻击手法分(最体现技术差异)联合注入查询(Union-Based)条件:页面会显示查询结果手法:用UNION SELECT 把恶意查询结构拼接在原结果后面,利用页面回显读出数据关键步骤:判断列数(ORDER BY)、找显示位置、查库名/表名/列名/数据。报错注入(Error-Based)条件:页面会输出数据库报错信息手法:故意触发能带出数据的报错函数,如:extractvalue、updatexml、floor(rand(0)*2)优点:不需要正常回显,速度较快布尔盲注(Boolean Blind)条件:页面只有两种状态(如:“成功”和“无结果”),没有数据回显。手法:用AND拼接条件,通过返回页面的真假判断字符,一位一位猜解示例:AND (SELECT ascii(substring(database(),1,1))) >100时间盲注(Time-Based)条件:页面无论什么情况返回都相同,没有任何肉眼可辨的差异手法:在条件成立时让数据库演示(sleep),不成立不延时,通过秒判断真假。示例:IF((SELECT length(database()))>5, sleep(3), 0)速度最慢,但也最通用堆叠注入(Stacked Queries)条件:数据库驱动支持一次执行多条语句(分号分隔)手法:直接追加;DROP TABLE ... ;等破坏性或操作型语句危害最大,可直接增删改查数据、权限提升。二次注入(Second Order)条件:攻击者先提交一段恶意数据被存入数据库,后续,某功能取出该数据拼进SQL执行特点:注入不发生在输入时,而是发生在“再次使用“时示例:注册用户 admin' --,修改密码时把真正的admin密码改了宽字节注入条件:PHP+MySQL,使用了GBK等宽字节编码,开启了转义如addslashes()原理:转义会在单引号前加反斜杠\ (0x5c),攻击者利用一个多字节字符与\ 组成合法汉字,吃掉反斜杠,但引号逃脱示例:?name=%df' 在GBK中%df%5c构成汉字“運”。\ 被吞掉,单引号成功闭合Cookie/Base64注入参数经过Base64等编码后放入Cookie或其他头,后端解码后拼接SQL手法:把攻击载荷也Base64编码后注入,如 admin' or 1=1 -- 编码后为:YWRtaW4nIG9yIDE9MSAtLSA=三、按数据提交方式分类(找注入点入口)GET型:参数在URL里,如:id=1POST型:参数在请求体中,如:表单提交。Cookie型:参数来自Cookie的值HTTP头注入:如:User-Agent、Referer、X-Forwarded-For等拼入SQL(常用于记录日志处)这三种分类维度是交叉的:比如一个POST型注入,参数位置是字符型,攻击手法可能是布尔盲注。了解这些类型,能帮助你们在学习和测试时快速定位漏洞并选择合适的手法。攻击类型Union是什么?就是把“两个查询结果,上下拼成一张大表。”比如两张表表A:男生名单(学号,姓名)表B:女生名单(学号,姓名)你想吧全校学生的名字都列出来,就可以使用UNIONSELECT 学号,姓名 FROM 男生 UNION SELECT 学号,姓名 FROM 女生结果就是一张包含所有男女生信息的长表。它只是纵向拼接,不会横向合并。Union怎么用?(基本语法和规则)SELECT 列1,列2,········FROM 表1 WHERE 条件UNIONSELECT 列1,列2,········FROM 表2 WHERE 条件必须遵守的规则:上下查询的列数必须相同如果上面查询选了3列,下面也必须选3列,否则就会报错。对应的数据类型要一致或能自动转换比如第一个查询的第一列是数字,下面查询的第一列也最好是数字(或能转为数字的文本),不能是乱七八糟的类型。假设我们有两张表SELECT name,price FROM productsUNIONSELECT username,score FROM users只要都是(文本,数字)这样的组合就可以。注意:默认去重UNION会默认自动去掉重复的行。如果要保留所有的重复行,用UNION ALL。UNION 注入举例(原语句):-- [请输入内容]——>[1]SELECT id,title FROM news WHERE id = 1 -- 1是输入的参数攻击者可在输入参数1后面直接拼接自己的SQL语句,让最终执行的语句变成:-- [请输入内容]-->[1 UNION SELECT username,passward FROM users]SELECT id,title FROM news WHERE id = 1UNIONSELECT username,passward FROM users这样,原本只返回新闻标题和ID的网页,额外返回了用户名和密码。因为UNION把两个查询的结果都拼接在一起了,而网页如果直接把所有的结果显示出来,攻击者就能看到用户名和密码了。
是判断漏洞第一步——搞清楚用户输入时被放在SQL语句中的哪个位置。
SELECT * FORM XXXXXX WHERE XXXXXX
一、按照注入点的参数类型分类(最基础的分类)
类型
源代码
特征
攻击
判断方法
数字型
WHERE id = $id
参数不用引号包裹
?id=1 OR 1=1直接注入逻辑
加' 会报错,加AND 1=1 正常,AND 1=2 异常
字符型(单引号)
WHERE name = '$name'
参数被单引号包裹
?name=' OR '1'='1' --
加' 进行报错,加AND '1'='1 正常
字符型(双引号)
WHERE name = "$name"
参数被双引号包裹
?name=" OR "1"="1" --
搜索型(LIKE)
WHERE title LIKE '%$key%'
参数被单引号和百分号包裹
?key=xx% OR 1=1 --
需要同时闭合百分号与引号
括号型
WHERE id = ($id)或者('$name')
攻击需要先闭合括号:?id=1) OR 1=1 --
二、按照攻击手法分(最体现技术差异)
三、按数据提交方式分类(找注入点入口)
这三种分类维度是交叉的:比如一个POST型注入,参数位置是字符型,攻击手法可能是布尔盲注。了解这些类型,能帮助你们在学习和测试时快速定位漏洞并选择合适的手法。
攻击类型
Union是什么?
比如两张表
你想吧全校学生的名字都列出来,就可以使用UNION
SELECT 学号,姓名 FROM 男生 UNION SELECT 学号,姓名 FROM 女生
结果就是一张包含所有男女生信息的长表。它只是纵向拼接,不会横向合并。
Union怎么用?(基本语法和规则)
必须遵守的规则:
假设我们有两张表
只要都是(文本,数字)这样的组合就可以。
注意:默认去重
UNION会默认自动去掉重复的行。如果要保留所有的重复行,用UNION ALL。
UNION 注入
举例(原语句):
攻击者可在输入参数1后面直接拼接自己的SQL语句,让最终执行的语句变成:
这样,原本只返回新闻标题和ID的网页,额外返回了用户名和密码。
因为UNION把两个查询的结果都拼接在一起了,而网页如果直接把所有的结果显示出来,攻击者就能看到用户名和密码了。