1. 程式人生 > >PHP程式碼審計實戰之XDcms

PHP程式碼審計實戰之XDcms

這裡主要講v2.0.8版本的XDcms中的一個基於錯誤的SQL注入漏洞,較v2.0.7版本而言修復了很多注入漏洞,使得注入漏洞大為減少。

至於CMS的下載配置等就不說了,直接審計吧~

先整體看,點選index.php,先判斷是否存在檔案config.inc.php,若不存在則重定向去安裝;然後就是通過require()函式包含/system/common.inc.php檔案:


檢視/system/common.inc.php檔案,看到很多都是定義變數,期間都有包含一些檔案,每個檔案都點選進去檢視一下,其中最值得關注的就是最後的fun.inc.php:


檢視該檔案發現先包含了幾個檔案然後就是定義各個函式,其中一個global.inc.php檔案顯得比較重要,因為涉及到全域性變數的東西:


進入global.inc.php檔案中檢視,有發現對接收的引數進行過濾的操作:


看到其中有兩個對輸入引數進行過濾的函式,進行檢視,知道該函式的定義是在fun.inc.php中:


該過濾作用很強,幾乎繞過不了,但是可以發現的就是呼叫該函式進行過濾時只是對GET方法進行過濾,在這裡沒有對POST等方法進行過濾,接著搜尋一下關於$_POST的內容看看,其中POST很多都進行了過濾,但是有的會遺漏,其中有檔案是涉及到SQL的delete語句便利用不到了,找到其中的一個檔案\system\modules\member\index.php:



注意到$fields這個變數沒有被過濾且是一個數組,因為該頁面是註冊頁面的主頁,所以通過註冊一個使用者的資訊並用火狐的Live HTTP headers外掛來進行抓包:


POST傳送的內容為:username=aaaaaa&password=123456&password2=123456&fields%5Btruename%5D=aaaaaa&fields%5Bemail%5D=aaaaaa&submit=+%D7%A2+%B2%E1+

對field_sql變數呼叫var_dump()函式詳細地顯示出來,同時新增exit不讓後面的程式碼執行,重新註冊新賬號:



可以看到field_sql陣列變數的值為使用者輸入的field陣列中truename和email的值,接著改為輸出下一條語句:



該語句為:update c_member set `truename`='ccccca',`email`='ccccca' where userid=7

這裡可以嘗試進行注入,先搜尋並檢視一下query()函式的定義:


可以看到會輸出錯誤資訊,那麼現在就把之前新增的程式碼去掉並註冊email中含單引號的使用者看看:


可以看到,顯示錯誤資訊。在這裡就可以利用基於錯誤的構造語句來顯示系統的資訊:

(select 1 from(select count(*),concat(char(32,58,32),(select concat_ws(char(32,58,32),username,password,encrypt) from c_admin limit 0,1),char(32,58,32),floor(rand()*2))name from information_schema.tables group by name)b) #

放到phpmyadmin中去執行:


雖然報出多處錯誤,但是結果卻出來了。下面將語句補充完整再測試一下:

update c_member set `truename`='ccscca',`email`='ccscca' where userid=1 and (select 1 from(select count(*),concat(char(32,58,32),(select concat_ws(char(32,58,32),username,password,encrypt) from c_admin limit 0,1),char(32,58,32),floor(rand()*2))name from information_schema.tables group by name)b) #


最後直接將語句新增到email中執行即可:


可見,管理員使用者名稱和密碼都顯示出來了。

如果還有其他賬號密碼等資訊,通過該limit的第一個引數逐一遍歷出來即可。

防禦方法:

該漏洞產生的原因在於沒有對所有的POST提交過來的內容即$fields變數進行過濾從而導致漏洞的存在,直接通過呼叫safe_html()函式來過濾field_sql變數即可:


相關推薦

PHP程式碼審計實戰XDcms

這裡主要講v2.0.8版本的XDcms中的一個基於錯誤的SQL注入漏洞,較v2.0.7版本而言修復了很多注入漏洞,使得注入漏洞大為減少。 至於CMS的下載配置等就不說了,直接審計吧~ 先整體看,點選index.php,先判斷是否存在檔案config.inc.php,若不存在

PHP程式碼審計實戰MetInfo CMS

這次主要白盒審計MetInfo CMS的一個變數覆蓋漏洞。 先檢視\include\common.inc.php檔案,因為其中是通過$_request來獲取使用者請求的資訊: 這裡是遍歷初始化變數,很可能會出現變數覆蓋,判斷了key的第一個字元是不是“_”來避免覆蓋系統全

PHP程式碼審計01in_array()函式缺陷

#前言 從今天起,結合紅日安全寫的文章,開始學習程式碼審計,題目均來自**PHP SECURITY CALENDAR 2017**,講完這個題目,會再用一道有相同問題的CTF題來進行鞏固。下面開始分析。 #漏洞分析 下面我們看第一題,程式碼如下: ``` ``` 這一關考察的是任意檔案上傳漏洞,導致這個漏洞

PHP程式碼審計02filter_var()函式缺陷

#前言 根據紅日安全寫的文章,學習PHP程式碼審計審計的第二節內容,題目均來自**PHP SECURITY CALENDAR 2017**,講完這個題目,會有一道CTF題目來進行鞏固,外加一個例項來深入分析,想了解上一篇的內容,可以點選這裡:[PHP程式碼審計01之in_array()函式缺陷](https:

PHP程式碼審計04strpos函式使用不當

#前言 根據紅日安全寫的文章,學習PHP程式碼審計的第四節內容,題目均來自**PHP SECURITY CALENDAR 2017**,講完題目會用一個例項來加深鞏固,這是之前寫的,有興趣可以去看看: [PHP程式碼審計01之in_array()函式缺陷](https://www.cnblogs.com/lx

PHP程式碼審計05正則使用不當

#前言 根據紅日安全寫的文章,學習PHP程式碼審計的第五節內容,題目均來自**PHP SECURITY CALENDAR 2017**,講完題目會用一道CTF的題目和例項來加深鞏固。這是之前寫的,有興趣可以去看看: [PHP程式碼審計01之in_array()函式缺陷](https://www.cnblogs

PHP程式碼審計命令執行

成功執行. 在具體分析細節之前,先說一下create_function()。 create_function返回一個字串的函式名, 這個函式名的格式是: "\000_lambda_" . count(anonymous_functions)++    我們來看看create_function的實現步驟:

PHP程式碼審計路——5.程式碼執行及一句話木馬總結

mixed eval ( string $code ) 把字串 code 作為PHP程式碼執行 bool assert ( mixed $assertion [, string $description ] ) PHP 5bool assert ( mixed $asse

PHP程式碼審計————1、PHP程式碼審計環境搭建

前言本系列部落格,主要講解PHP程式碼審計。從環境搭建到具體的實戰分析將會一步一步深入學習,希望可以對大家有所幫助。審計環境搭建作業系統:Window 7軟      件:phpstudy、VMware workstations14、seay 程式碼審計軟體、notepad+

PHP初級練習實戰留言板

btn ado errno sta png from borde 數字 cat PHP初級練習實戰之留言板初學者做的東西,有的地方寫的不好,哈哈哈!一.知識重點1.三目運算 $page= empty($_GET[‘p‘]) ? 1: $_GET[‘p‘];2.數據庫的操作m

PHP初級練習實戰公司留言板(原生)

ali 日期 元素 align display 初學 locate padding asi PHP初級練習實戰之留言板初學者做的東西,有的地方寫的不好,哈哈哈!一.知識重點1.三目運算 $page= empty($_GET[‘p‘]) ? 1: $_GET[‘p‘];2.數

PHP程式碼審計入門

部落格轉載 --程式碼審計入門   程式碼審計--準備 1,先放一張大圖,php程式碼審計的幾個方向,也是容易出問題的地方,沒事的時候可以多看看。   2,程式碼審計也就是拿到某網站的原始碼,進行審計,從而發現漏洞,但是我們審計的時候並不一定要一行一行的去看吧,這樣未免也太浪費時

php程式碼審計命令執行漏洞

命令執行漏洞,使用者通過瀏覽器在遠端伺服器上執行任意系統命令,嚴格意義上,與程式碼執行漏洞還是有一定的區別。  常用命令執行函式 exec()、system()、popen()、passthru()、proc_open()、pcntl_exec()、shell_exec() 、反引

PHP 程式碼自動執行定時器

<?php ignore_user_abort();//關閉瀏覽器仍然執行 set_time_limit(0);//讓程式一直執行下去 $interval=3;//每隔一定時間執行 do{ $msg = date("Y-m-d H:i:s"); file_put_content

PHP程式碼審計-SQL注入漏洞挖掘

SQL注入經常出現在登入頁面,HTTP頭(user-agent/client-ip/cookies等),訂單處理等地方,在發生多個互動的地方經常會發生二次注入。 普通注入 $uid = $_GET[‘id’]; $sql = “select * from user where id=$

PHP程式碼審計Day5-8練習題

文章目錄 前言 Day5 – escapeshellarg與escapeshellcmd使用不當 解題 第一部分 payload: 第二部分 payload

PHP程式碼審計Day學習筆記5-8

文章目錄 Day5 - escapeshellarg與escapeshellcmd使用不當 前言 mail() FILTER_VALIDATE_EMAIL escapeshellcmd() escapes

PHP程式碼審計Day1-4練習題

文章目錄 Day1 in_array函式缺陷 解題 payload Day2 - filter_var函式缺陷 解題 payload Day3 例項化

PHP程式碼審計Day學習筆記

Day1 in_array函式缺陷 定義 in_array函式 bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) 引數 描述 needle

PHP程式碼審計學習

原文:http://paper.tuisec.win/detail/1fa2683bd1ca79c 作者:June 這是一次分享準備。自己還沒有總結這個的能力,這次就當個搬運工好了~~ 0x01 工具準備 PHPSTORM,不只是程式設計。 個人覺得只要能夠提供全域性搜尋、單