wordpress漏洞_多个WordPress插件SQL注入漏洞分析
背景
SQL注入漏洞是用來構建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核心是盡最大可能來幫助開發者來防止惡意偽造的用戶輸入、不好的編碼實踐、誤用逃逸函數會導致簡單或關鍵的漏洞。
漏洞分析
FG-VD-19-092 – SQL Injection in AdRotate Plugin through 5.2 for WordPress
該漏洞是一個經典SQL注入漏洞,存在于 AdRotate插件5.2版本中。漏洞位于dashboard/publisher/adverts-edit.php文件的第25行。
圖2:?adverts-edit.php中的SELECT statement用于從數據庫中獲取廣告
變量$ad_edit_id用于構建SQL查詢。該變量是從函數adrotate_manage的變量$_GET中提取的。
圖3: 用戶控制的變量$ad_edit_id
因為esc_attr變量只能逃逸HTML屬性,在SQL查詢中$ad_edit_id變量無法用雙引號逃逸,因此可以注入payload到$ad_edit_id中來執行任意的SQL語句。
圖4: AdRotate插件5.2泄漏的數據庫版本
因為管理接口只對管理員角色可用,缺乏CSRF token使非認證的攻擊者可以遠程竊取信息,包括session token,可以通過SQL注入漏洞以最小的用戶交互來引發XSS:
圖5: SQL注入引發的XSS
開發者的補丁中只是對查詢中的$ad_edit_id變量加了引號。
圖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中存在漏洞,用戶可以在發布文章時從圖片庫中附件照片。
圖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。
圖8:?get_entities根據返回的請求調用對應的函數
因為返回請求有both值,因此第832行的_get_image_entities會被調用。
圖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 被攻擊者利用的情況。
圖10: NextGEN Gallery中的SQL盲注
圖11: NextGEN Gallery中的SQL盲注2,false會返回空結果
發布的補丁中只允許ORDER BY語句中出現特定的值,因此查詢就是安全的。
圖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函數中。
圖13: Give插件中的漏洞代碼
如注釋所示,get_order_query嘗試移除ORDER BY語句中不存在的列,通過使用esc_sql幫助函數來過濾排序的值。因為467行中銷毀不存在的行后,會在第470行中重插入一個逃逸值,因此移除并不會如研究人員所想。許多人都知道esc_sql函數在預防ORDER BY語句中的SQL注入攻擊中是沒有用處的。因此,構建的查詢中是有漏洞的。相同的SQL盲注技術可以用來利用該漏洞。
Impress 團隊發布的1行補丁允許過濾器正常工作,因此查詢是安全的。
圖14: Give插件補丁
建議
為了預防開發WordPress插件過程中的SQL注入攻擊。研究人員建議開發者遵循WordPress編碼規范和安全編碼最佳實踐。研究人員建議:
· 不要信任任何用戶輸入。對用戶提供的所有數據執行有效性檢查和處理。
·?如果不確定數據是不是安全的,應用內置的處理函數來適配數據。比如,sanitize_sql_orderby()就修復了所有發現的漏洞。
·?除了使用esc_sql,99%的case可以用預先準備好的語句。
·?如果無法使用預先準備好的語句,可以使用esc_sql和引號內的逃逸值。
總結
以上是生活随笔為你收集整理的wordpress漏洞_多个WordPress插件SQL注入漏洞分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数返回引用什么意思_【20200917
- 下一篇: amd的处理器能兼容idea么_250元