学习复盘:SQL 注入原理、类型、手工注入及绕过防御
一、前言
- 今天系统继续学习了 Web 安全核心漏洞SQL 注入,主要的内容就是手动注入
- SQL 注入是Web 渗透最基础也最重要的漏洞,几乎所有动态网站都曾出现过,是学习网安很重要的一部分
二、理解SQL注入
1. 简单理解 SQL
SQL 是操作关系型数据库的语言,常见库:MySQL、Oracle、SQL Server、Access
分关系型数据库和非关系型NoSQL,NoSQL虽然为非关系型但是也存在注入漏洞
2. 什么是 SQL 注入
原理:把恶意 SQL 语句插入请求参数(URL、表单、Cookie、UA、Referer)
服务端未做过滤,直接拼接 SQL 执行,导致数据库泄露
关键:闭合原有 SQL 语句,构造恶意新语句
三、SQL 注入的真实危害
- 泄露数据库隐私:账号、密码、手机号、用户数据
- 绕过登录验证:直接进后台
- 篡改网页、网站挂马
- 恶意操作数据库:删库、改管理员账号
- 读取服务器文件、写入木马 GetShell
- 远程执行系统命令、控制服务器
四、SQL 注入常见分类
1. 按数据类型分
- 数字型:
id=1无需单引号闭合 - 字符型:
username='admin'需要单引号闭合
2. 按回显方式分
- 联合查询注入:页面有直接回显位
- 报错注入:利用
extractvalue报错带出数据 - 布尔盲注:页面分正常,报错两种状态,通过暴力破解获取数据
- 时间盲注:页面无变化,用
sleep()睡觉判断对错
五,常见函数
报错函数:extractvalue、updatexml、exp、GTID_SUBSET()等。
截取函数:left、mid、substr(substring、substrB)。
判断函数:if、case when。
其他函数:ascii、length。
数据库常见函数
六、MySQL 手工注入核心函数
- 截取:
substr()/mid()/left()截取字符爆破数据 - 报错:
extractvalue()、updatexml()利用错误爆数据 - 判断:
if()、case when()用于盲注爆破数据 - 长度:
length()判断长度 - 数据库信息:
database()、user()、version()查库名、用户、版本 - 聚合函数:
group_concat()一次性爆出所有查询数据
七、完整注入流程
- 测试是否存在注入
- 判断字段数
- 找回显示位
- 爆所有数据库 → 爆指定库表名 → 爆表字段 → 爆账号密码数据
八、SQLMap脚本工具使用
>python sqlmap.py
- 作用:自动检测、自动 SQL 注入,拿数据
- 常用命令:指定 URL、抓包扫描、查库-dbs、查表-D ... --tables、查字段-D ... -T ,,, -columns、导出数据-D ... -T ,,, -C ~~~ --dump
- 相比常规手注,使用脚本更加迅速。
九、结尾总结
- 今天完整过了 SQL 注入从原理→分类→手法→绕过全流程
- 手工注入是基础,SQLMap 是工具,先懂手工再用工具
- 后续多在 sqli-labs、DVWA 靶场练习,巩固各类注入和绕过思路
