天天看點

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

wordpress漏洞_多個WordPress插件SQL注入漏洞分析
wordpress漏洞_多個WordPress插件SQL注入漏洞分析

背景

SQL注入漏洞是用來建構SQL查詢的使用者輸入未經适當處理導緻的漏洞。比如:

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖1: 使用WordPress的SQL查詢示例

從上面的代碼來看,其中存在SQL注入攻擊漏洞,因為從$_GET中提取的$_id在傳遞給SQL查詢時沒有經過任何處理。在最新的WordPress版本中,預設會在$_POST/$_GET/$_REQUEST/$_COOKIE中加入了magic quotes。這可以幫助WordPress維護,并提供最佳的安全能力。是以,上面的代碼其實是沒有漏洞的。

除了給所有輸入值加斜杠(slash)外,WordPress會提供許多内置的處理函數來對輸入進行處理,以確定輸出的安全。開發者可以使用sanitize_email()來處理郵件位址,或用sanitize_text_field()來清除文本域的值,或用sanitize_sql_orderby()來驗證SQL ORDER BY clauses。使用者輸入最常見的類型是由WordPress sanitize_*()的類來涵蓋的。

雖然WordPress核心是盡最大可能來幫助開發者來防止惡意僞造的使用者輸入、不好的編碼實踐、誤用逃逸函數會導緻簡單或關鍵的漏洞。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

漏洞分析

FG-VD-19-092 – SQL Injection in AdRotate Plugin through 5.2 for WordPress

該漏洞是一個經典SQL注入漏洞,存在于 AdRotate插件5.2版本中。漏洞位于dashboard/publisher/adverts-edit.php檔案的第25行。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖2: adverts-edit.php中的SELECT statement用于從資料庫中擷取廣告

變量$ad_edit_id用于建構SQL查詢。該變量是從函數adrotate_manage的變量$_GET中提取的。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖3: 使用者控制的變量$ad_edit_id

因為esc_attr變量隻能逃逸HTML屬性,在SQL查詢中$ad_edit_id變量無法用雙引号逃逸,是以可以注入payload到$ad_edit_id中來執行任意的SQL語句。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖4: AdRotate插件5.2洩漏的資料庫版本

因為管理接口隻對管理者角色可用,缺乏CSRF token使非認證的攻擊者可以遠端竊取資訊,包括session token,可以通過SQL注入漏洞以最小的使用者互動來引發XSS:

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖5: SQL注入引發的XSS

開發者的更新檔中隻是對查詢中的$ad_edit_id變量加了引号。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖6: AdRotate 5.3版本中的SQL注入漏洞更新檔

FG-VD-19-099 – SQL Injection in NextGEN Gallery Plugin through 3.2.10 for WordPress

NextGEN Gallery 插件提供了很完美的照片管理方法,操作也不複雜,從2007年開始就成為标準的WordPress照片管理插件,每年新下載下傳量超過150萬。截止目前,NextGEN Gallery 插件的活躍安裝超過90萬,是照片管理插件中使用最多的之一。

該插件的AJAX API中存在漏洞,使用者可以在釋出文章時從圖檔庫中附件照片。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖7: 使用者提供的輸入在get_displayed_gallery_entities_action中處理

modules/attach_to_post/package.module.attach_to_post.php中的函數get_displayed_gallery_entities_action是負責在特定的圖檔庫中顯示圖檔的。數組參數 displayed_gallery是通過POST方法提取的以建立gallery對象,如第119行代碼所示。對象的屬性可以通過esc_sql幫助函數逃逸。然後調用第130行的get_entities,指向modules/nextgen_gallery_display/package.module.nextgen_gallery_display.php中的函數get_entities。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖8: get_entities根據傳回的請求調用對應的函數

因為傳回請求有both值,是以第832行的_get_image_entities會被調用。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖9:_get_image_entities擷取gallery中的所有圖像

該函數會準備一個查詢來傳回展示的gallery中的所有圖像。如第1041行所示,會使用一個基于來自建立的gallery對象的$sort_by和$sort_direction的排序過程。任意有權限使用NextGEN Gallery 的經過認證的使用者都可以操作params來建立gallery對象。雖然該對象的所有屬性都可以用esc_sql逃逸,但攻擊者并不需要逃逸引号就可以在ORDER BY語句中執行SQL注入攻擊。是以,esc_sql無法預防NextGEN Gallery 被攻擊者利用的情況。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖10: NextGEN Gallery中的SQL盲注

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖11: NextGEN Gallery中的SQL盲注2,false會傳回空結果

釋出的更新檔中隻允許ORDER BY語句中出現特定的值,是以查詢就是安全的。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖12: Imagely通過白名單修複安全漏洞

FG-VD-19-098 – SQL Injection in Impress Give Plugin through 2.5.0 for WordPress

Give 是評分最高、下載下傳量最多的wordpress插件。該插件的漏洞代碼位于includes/donors/class-give-donors-query.php的get_order_query函數中。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖13: Give插件中的漏洞代碼

如注釋所示,get_order_query嘗試移除ORDER BY語句中不存在的列,通過使用esc_sql幫助函數來過濾排序的值。因為467行中銷毀不存在的行後,會在第470行中重插入一個逃逸值,是以移除并不會如研究人員所想。許多人都知道esc_sql函數在預防ORDER BY語句中的SQL注入攻擊中是沒有用處的。是以,建構的查詢中是有漏洞的。相同的SQL盲注技術可以用來利用該漏洞。

Impress 團隊釋出的1行更新檔允許過濾器正常工作,是以查詢是安全的。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

圖14: Give插件更新檔

wordpress漏洞_多個WordPress插件SQL注入漏洞分析

建議

為了預防開發WordPress插件過程中的SQL注入攻擊。研究人員建議開發者遵循WordPress編碼規範和安全編碼最佳實踐。研究人員建議:

· 不要信任任何使用者輸入。對使用者提供的所有資料執行有效性檢查和處理。

· 如果不确定資料是不是安全的,應用内置的處理函數來适配資料。比如,sanitize_sql_orderby()就修複了所有發現的漏洞。

· 除了使用esc_sql,99%的case可以用預先準備好的語句。

· 如果無法使用預先準備好的語句,可以使用esc_sql和引号内的逃逸值。

wordpress漏洞_多個WordPress插件SQL注入漏洞分析
wordpress漏洞_多個WordPress插件SQL注入漏洞分析

繼續閱讀