PHP函式漏洞審計之addslashes函式-

www88xbocom17176934555x發表於2021-03-22

圖片

函式定義

圖片

addslashes() 函式返回在預定義字元之前新增反斜槓的字串。

(PHP 4, PHP 5, PHP 7)

預定義字元是:

單引號(’)

雙引號(”)

反斜槓(\)

NULL

提示:該函式可用於為儲存在資料庫中的字串以及資料庫查詢語句準備字串。

註釋:預設地,PHP 對所有的 GET、POST 和 COOKIE 資料自動執行 addslashes()。所以您不應對已轉義過的字串使用 addslashes(),因為這樣會導致雙層轉義。遇到這種情況時可以使用函式 get_magic_quotes_gpc() 進行檢測。

在每個雙引號(”)前新增反斜槓:

<!DOCTYPE html>

圖片

在每個雙引號(”)前新增反斜槓:

<!DOCTYPE html>

圖片

圖片

addslashes函式缺陷

圖片

以一個使用者登入程式為例,考察通過SQL隱碼攻擊繞過登入驗證,程式碼如下:

圖片

第29行通過POST方式傳入user和passwd兩個引數,通過isValid函式判斷是否合法。isValid函式主要功能程式碼在第1020行,可以看到第1112行呼叫sanitizeInput方法對user和passwd進行相關處理。

sanitizeInput主要功能程式碼在第22~25行,這裡針對輸入的資料呼叫addslashes函式進行處理,然後對處理後的內容進行長度判斷,長度大於20則只擷取前20個字元。

這道題已經過濾了單引號,正常情況是沒有注入了,為什麼還能導致注入呢?原因實際上出在第24行substr函式這裡,關於substr函式的定義檢視相關知識第二條。

關於substr函式一個簡單的例子:

注:substr中的引數0代表從位置為0的字元開始計算,2代表返回的字串將從0(start)處開始最多包括2(length)個字元。

再回到題目中,我們知道反斜槓可以取消特殊字元的用法,而注入想要通過單引號閉合,必然會引入反斜槓。

將官方提供的payload帶入題目中,拼接第15~17行程式碼中的SQL語句:

select count(p) from user u where user ='1234567890123456789\'  AND password = '$pass'

這裡的SQL語句由於反斜槓的原因,user=’1234567890123456789\’最後這個單引號會失去它的作用,我們讓password=or 1=1#,那麼最後的SQL語句為:

select count(p) from user u where user = '1234567890123456789\' AND password = 'or 1=1#'

此時user值為1234567890123456789' AND password =,可以保證帶入資料庫執行的結果為true,就能順利地通過驗證。因此使用如下payload即可逃逸出\(反斜槓)注入。

user=1234567890123456789\'&passwd= or 1=1#

圖片

例項分析蘋果CMS視訊分享程式8.0相關漏洞

圖片

1. 漏洞位於\inc\common\template.php:

圖片

$lp[‘wd’]變數位置存在字串拼接,存在SQL隱碼攻擊。

2. 但是這個CMS具有一些通用的注入防護,首先在\inc\module\vod.php檔案中:

圖片

當$method=search成立的時候,進入了第96行中的be(“all”,”wd”),獲取請求中的wd引數的值,並且使用chkSql函式對wd引數的值進行處理。

3. 跟進be函式,在\inc\common\function.php檔案中:

圖片

這部分程式碼的作用是對GET、POST、REQUEST接收到的引數進行addslashes轉義處理。

4. 跟進\inc\module\vod.php檔案中的chkSql函式,具體位置在\inc\common\360_safe3.php檔案中:

圖片

在第34~38行鍼對接收到的變數進行迴圈的urldecode(即url解碼),然後在第41行使用StopAttack函式對解碼後的資料進行處理,將處理後的資料通過htmlEncode方法進行HTML編碼,然後返回編碼後的值。

跟進StopAttack函式:

圖片

第18~24行呼叫正則進行處理,相關的正規表示式是$ArrFiltReq,這裡的$ArrFiltReq變數就是前面傳入的$getfilter(StopAttack函式的第三個引數),語句變成:preg_match(“/“. $getfilter.”/is”,1)

跟進$getfilter變數:

圖片

這段程式碼的功能就是檢測GET、POST、COOKIE中的惡意資料。

5. 在chkSql函式最後有串程式碼是return htmlEncode($s),跟進一下htmlEncode函式,在\inc\common\function.php檔案中:

這段程式碼的功能是針對&、’、空格、”、TAB、回車、換行、大小於號等符號進行實體編碼轉換,但是這裡沒有針對其他的空白字元和反斜槓進行處理。

6. 注入點是\inc\common\template.php,就是分析的第一條。我們繼續看看$lp[‘wd’]的值是怎麼獲取的:

當P[“wd”]不為空時,$lp[‘wd’]從P[“wd”]中獲取資料。

7. 根據之前的分析,在\inc\module\vod.php檔案中存在這樣一行程式碼:$tpl->P[“wd”] = $wd;(見分析的第二條),而wd可以從REQUEST中獲取到,所以這裡的wd實際上是可控的。

蘋果CMS漏洞驗證

1. 在前面的分析中,我們知道html Encode針對&、’、空格、”、TAB、回車、換行、大小於號等進行了實體編碼轉換,但是這裡的注入型別是字元型注入,需要引入單引號來進行閉合。而htmlEncode函式對單引號進行了處理,因此我們需要換個思路。

2. $lp[‘wd’]引數可以控制SQL語句中的兩個位置,可以通過引入反斜槓進行單引號閉合,而原始檔呼叫了addslashes函式,會對反斜槓進行轉義處理。但是這裡對使用者請求的引數又會進行url解碼(見分析的第四條),因此可以使用雙url編碼繞過addslashes函式。

3. Attack機器使用瀏覽器訪問http://10.1.1.100/maccms-8.0/index.php?m=vod-search並用burpsuite抓包,修改請求包中的內容,go之後會看到response處的響應:

Payload:wd=))||if((select%0b(select(m_name)’’from(mac_manager))regexp(0x5e61)),(‘sleep’(3)),0)#%25%35%63

注:%25%35%63經過兩次url解碼後為

4. Payload傳到程式裡,經過拼接後的資料庫語句如下所示:

addslashes函式相關ctf練習

addslashes函式相關ctf練習,繞過WAF並獲取flag。

在做題之前,先了解一些需要用到的基礎知識:

1. 對於傳入的非法$_GET陣列引數名,PHP會將其替換成下劃線。

2. 當使用HPP(HTTP引數汙染)傳入多個相同引數給伺服器時,PHP只會接收到後者的值:

圖片

解題:

1. Attack機器使用瀏覽器訪問http://10.1.1.100/maccms-8.0/ctf/index.php開始解題。

2. 檢視原始碼,第一個WAF在第2628行,採用了dowith_sql函式,其主要功能程式碼在第1724行:

圖片

如果$_REQUEST陣列中的資料存在select|insert|update|delete等敏感關鍵字或字元,則直接exit();如果不存在則原字串返回。

3. 第二個WAF原始碼:

圖片

通過$_SERVER[‘REQUEST_URI’]的方式獲取引數,然後使用explode函式針對&進行分割,獲取每個引數的引數名和引數值,最後針對每個引數值呼叫dhtmlspecialchars函式進行過濾。

4. 跟進dhtmlspecialchars函式:

主要針對&、”、<、>、(、)等特殊字元進行過濾替換,最後返回替換後的內容。

5. 從第41~42行程式碼可以看到,題目的引數通過REQUEST方式獲取:

6. Payload可以根據下面的圖進行構造:

圖片

我們通過頁面請求i_d=payload&i.d=123,當資料流到達第一個WAF時,PHP會將引數中的某些特殊符號替換為下劃線。

於是得到了兩個i_d,此時的payload為i_d=payload&i_d=123。

而在引數相同的情況下,預設第二個引數傳入的值會覆蓋第一個引數傳入的值,因此第一個WAF中i_d=123,不存在其他特殊字元,因此繞過了第一個WAF。

當資料流到達第二個WAF時,程式碼是通過$_SERVER[‘REQUEST_URI’]的方式獲取引數,而$_SERVER[‘REQUEST_URI’]不會將引數中的特殊符號進行轉換,因此這裡的i.d引數不會被替換為i_d,此時i.d和i_d都能繞過第二個WAF。

繞過第二個WAF中的dhtmlspecialchars函式後,i_d=payload&i.d=123會進入到業務層程式碼中,執行SQL語句。這裡的SQL語句採用拼接的方式,因此存在SQL隱碼攻擊。

7. 最後的payload為:

圖片

圖片

修復建議

圖片

在\inc\common\function.php檔案中添補上疏漏的str_replace(chr(92),”
”,$str);即可:

圖片

反斜槓\的ASCII碼為92,這裡新增一行程式碼處理反斜槓。一個簡單的例子:

圖片
read.douban.com/reader/column/4096...
read.douban.com/reader/column/4096...
read.douban.com/reader/column/4096...
read.douban.com/reader/column/4096...
read.douban.com/reader/column/4096...
read.douban.com/reader/column/4096...
read.douban.com/reader/column/4096...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章