【投稿】PHP/Sqlite下常见漏洞浅析

0x00 前⾔

SQLite作为一款轻型数据库,PHP开发人员⼀定不会陌生,PHP5后,其已默认集成这个轻巧的内嵌式数据库产品.对于采⽤用PHP/Sqlite的CMS,也存在⼀些常见的安全威胁.笔者以下数例加以分析,欢迎指出不足与错误之处.

0x01 数据库下载

作为⼀个单文件的轻型数据库,存在与类似Access的问题,即数据库下载.在测试的几个CMS中,便存在固定/默认数据库名/地址的问题,可下载造成安全威胁.而某些CMS即使设置有数据库随机⽂件名,但仍存在安全威胁,如XiaoCMS

sqlite-01

看似防下载的#%使⽤用URL编码即可绕过,⽽由于短文件名漏洞的存在,随机⽂件名也不再安全,只需猜解0-9a-f的4位组合即可下载数据:

sqlite-02

借鉴于Access的数据库防护手法,部分CMS将数据库后缀修改为php,并创建表”create table ‘<?php’ (a); “,以期防下载,但也引入了新的安全威胁.

0x02 数据库GetShell

首先是Akcms,其Sqlite版本数据库后缀为php,但连'<?php’表也没有添加,只要得到(猜解)六位数据库文件名即可GetShell.以下为插⼊入phpinfo();示例:

sqlite-03

而稻草人CMS虽加⼊入了'<?php’表,但在PHP并未抛出错误,仍可下载数据库内容.

sqlite-04

稻草⼈人在前台使⽤用strip_tags()函数过滤了输⼊变量,避免了直接GetShell.但通过数据库下载破解管理密码,后台亦可任意编辑⽂件,造成相应的安全威胁.

0x03 注⼊入语法

为⽅方便测试,写有如下PHP脚本

sqlite-05

连接数据库文件sqlite.db内容如下:

sqlite-06

可以看到id输入未经任何过滤,可被我们利用,一个Demo如下:

sqlite-07

正常id输入1-3均可返回对应的name,而通过注入语句:

可通过union查询到id为1的pass值.与MySQL5.x类似的,Sqlite存在与information_schema类似的⼀一个表,默认并不显示,名为sqlite_master,表中的字段有type,name,tbl_name,rootpage,sql,⽐较有价值的是sql字段.首先测试有回显处为2

sqlite-08

查询sql字段内容

sqlite-09

如上可以得到表结构.此外,常⻅见的一些语法也与Mysql类似如:

注释符: —
连接符: ||
Substring: substr(a,b,c)
长度: length(x)

0x04 注⼊入GetShell

Sqlite中通过Attach语句可以附加数据库(若不存在则创建⽂文件),通过此语句可借助Sqlite注入GetShell,但上面的数据库查询语句:

$db->query($sql);

是⽆无法Attach创建文件的
以下GetShell环境,测试创建Sqlite3数据库

sqlite-10

修改语句如下:

此时即可借助注入语句插入WebShell

测试语句1:

sqlite-11

得到phpinfo

sqlite-12

 

写⼊一个WebShell:

sqlite-13

sqlite-14

PHP调用Sqlite还有多种方式,猜想execute和exec⽅式均有可能GetShell.对于Sqlite2数据库,如下代码:

可以注⼊语句Attach创建空⽂件,但未能插入数据.各位看官如有研究还望指点⼀二.

0x05 小结

与Access数据库类似,Sqlite轻巧方便的同时,也存在很多可利⽤的威胁,对开发者来讲也是要注意的问题.以上仅为笔者所观的冰⼭⼀角,更多问题由看官去研究发现.

征稿启事:91RI 一直相信“你不与人分享,谁与你分享”, 分享的确是件非常有意义的事情。为了让优秀的同学有 地方分享自己的独到见解,也为了让更多同学从分享中受益,同时我们也希望给那些愿意分享的小伙伴们一点点心意作为感谢,所以我们隆重了推出“有奖征文”活 动!本次活动的详情可以围观《征稿启事

本文获得赏金80RMB,已10.2日汇入作者账户。