自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

盤點(diǎn)2017年的WordPress插件漏洞

安全 漏洞
在這篇文章中,我們將會(huì)對(duì)2017年影響最為嚴(yán)重的插件漏洞進(jìn)行分析。除此之外,我們還會(huì)跟大家介紹靜態(tài)代碼分析工具如何才能檢測(cè)到這些漏洞。

一、前言

據(jù)統(tǒng)計(jì),全球29%的網(wǎng)站使用的都是WordPress。由于WordPress的使用非常廣泛,使得WordPress插件的安全問題成為了網(wǎng)絡(luò)犯罪分子們關(guān)注的焦點(diǎn)。一般來說,第三方提供的插件其安全等級(jí)肯定沒有WordPress核心插件的安全等級(jí)高,因此它們對(duì)于攻擊者來說,絕對(duì)是極具吸引力的攻擊目標(biāo)。為了入侵目標(biāo)WordPress站點(diǎn),攻擊者需要利用插件中的安全漏洞,那么靜態(tài)代碼分析技術(shù)能檢測(cè)到這些漏洞嗎?

盤點(diǎn)2017年的WordPress插件漏洞

在這篇文章中,我們將會(huì)對(duì)2017年影響最為嚴(yán)重的插件漏洞進(jìn)行分析。除此之外,我們還會(huì)跟大家介紹靜態(tài)代碼分析工具如何才能檢測(cè)到這些漏洞。

二、漏洞選取

我們選取公開已知插件漏洞的條件如下:

  1. 發(fā)布于2017年
  2. 受影響的插件安裝量非常大
  3. 漏洞影響嚴(yán)重
  4. 不需要認(rèn)證或?qū)Ψ?wù)器有任何要求(例如WP statistics插件的SQLi漏洞)
  5. 不會(huì)影響非開源的商業(yè)插件

RIPS可以對(duì)非WordPress核心插件進(jìn)行代碼分析,接下來,我們會(huì)對(duì)WordPress的相關(guān)功能進(jìn)行分析,并介紹如何對(duì)插件進(jìn)行深入的代碼分析。

1. Loginizer 1.3.5-SQL注入漏洞(CVE-2017-12650)

目前,總共有55萬WordPress站點(diǎn)安裝了Loginizer插件。這款插件的作用理應(yīng)是通過屏蔽暴力破解攻擊、啟用雙因素身份驗(yàn)證、以及reCAPTCHA驗(yàn)證碼機(jī)制來給WordPress的登錄功能增加安全性。但是在今年八月份,研究人員在Loginizer的登錄程序中發(fā)現(xiàn)了一個(gè)SQL注入漏洞,而這個(gè)漏洞反而會(huì)讓原本需要得到保護(hù)的管理員憑證處于安全風(fēng)險(xiǎn)之中。

接下來,我們一起看一看包含漏洞的代碼,并且跟大家解釋靜態(tài)代碼分析工具(以下簡(jiǎn)稱SAST工具)如果想要檢測(cè)到這類漏洞的話,需要什么樣的要求。在接下來的分析過程中,我們給大家提供的只是簡(jiǎn)單的代碼段,而實(shí)際的分析會(huì)更加復(fù)雜。

(1) 第一步:識(shí)別自定義的SQL封裝器

首先,SAST工具最基本的就是要識(shí)別出該插件中用戶自定義的函數(shù)lz_selectquery(),這個(gè)函數(shù)可以利用WordPress的數(shù)據(jù)庫驅(qū)動(dòng)器來執(zhí)行SQL語句。當(dāng)這個(gè)函數(shù)被調(diào)用的時(shí)候,它需要對(duì)第一個(gè)參數(shù)進(jìn)行SQL注入檢測(cè)。

modules/Emails/DetailView.php

  1. function lz_selectquery($query, $array = 0){ 
  2.  
  3. global $wpdb; 
  4.  
  5. $result = $wpdb->get_results($query, 'ARRAY_A'); 
  6.  

(2) 第二步:識(shí)別輸入來源

對(duì)于SAST工具而言,另一種基本功能就是它必須能夠識(shí)別出PHP中所有常見的和不常見的用戶輸入來源。但攻擊者可以修改用戶自定義函數(shù)lz_getip()所返回的HTTP請(qǐng)求頭,因此該函數(shù)所返回的值就是不可信的了,所以整個(gè)數(shù)據(jù)流必須進(jìn)行精準(zhǔn)跟蹤。

modules/Emails/DetailView.php

  1. function lz_getip() { 
  2.  
  3. global $loginizer; 
  4.  
  5. if(isset($_SERVER["REMOTE_ADDR"])) { 
  6.  
  7. $ip = $_SERVER["REMOTE_ADDR"]; 
  8.  
  9.  
  10. if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { 
  11.  
  12. $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
  13.  
  14.  
  15. return $ip; 
  16.  

(3) 第三步:分析WordPress的action和filter

WordPress允許我們定義各種不同的action來調(diào)用自定義函數(shù),為了跟蹤插件的控制流程,SAST工具必須要了解這些回調(diào)的運(yùn)行機(jī)制。在下面給出的代碼段中,我們可以看到loginizer_load_plugin()函數(shù)是通過action調(diào)用的,這個(gè)函數(shù)可以從lz_getip()函數(shù)中獲取用戶輸入,并將其存儲(chǔ)再全局?jǐn)?shù)組$loginizer之中,然后再通過WordPress filter來調(diào)用另一個(gè)自定義函數(shù)loginizer_wp_authenticate()。因此,除了WordPress action之外,SAST工具還需要了解WordPress filter的工作機(jī)制。

modules/Emails/DetailView.php

  1. function loginizer_load_plugin() { 
  2.  
  3. global $loginizer; 
  4.  
  5. $loginizer['current_ip'] = lz_getip(); 
  6.  
  7. add_filter('authenticate', 'loginizer_wp_authenticate', 10001, 3); 
  8.  
  9.  
  10. add_action('plugins_loaded', 'loginizer_load_plugin'); 

(4) 第四步:分析全局變量

雖然下面這段代碼對(duì)于我們?nèi)祟悂碚f可以輕易看懂,但是對(duì)于SAST工具來說分析起來可就非常復(fù)雜了。它需要通過多個(gè)函數(shù)調(diào)用來分析全局?jǐn)?shù)組$loginizer的數(shù)據(jù)流,只有這樣它才能夠檢測(cè)到lz_getip()函數(shù)傳遞給loginizer_can_login()函數(shù)(為對(duì)SQL語句中的拼接內(nèi)容進(jìn)行數(shù)據(jù)過濾)的用戶輸入信息。其中的SQL語句是通過自定義的SQL函數(shù)lz_selectquery()實(shí)現(xiàn)的,雖然WordPress可以通過模擬magic_quotes來防止注入,但是來自HTTP頭中的惡意用戶輸入數(shù)據(jù)并不會(huì)受此影響。

modules/Emails/DetailView.php

  1. function loginizer_wp_authenticate($user, $username, $password) { 
  2.  
  3. global $loginizer, $lz_error, $lz_cannot_login, $lz_user_pass; 
  4.  
  5. if(loginizer_can_login()) { 
  6.  
  7. return $user; 
  8.  
  9.  
  10.  
  11. function loginizer_can_login() { 
  12.  
  13. global $wpdb, $loginizer, $lz_error; 
  14.  
  15. $result = lz_selectquery("SELECT * FROM ".$wpdb->prefix."loginizer_logs 
  16.  
  17. WHERE ip = '".$loginizer['current_ip']."';"); 
  18.  

由于RIPS的分析算法主要針對(duì)的是PHP語言,因此它對(duì)WordPress的分析會(huì)比較到位,因此它能夠識(shí)別出WordPress復(fù)雜的數(shù)據(jù)流,并成功檢測(cè)出插件中的SQL注入漏洞。

2. Ultimate Form Builder Lite 1.3.6-SQL注入漏洞(CVE-2017-15919)

Ultimate Form Builder插件目前的安裝量已經(jīng)超過了5萬,它允許我們使用拖拽的形式來創(chuàng)建聯(lián)系表單。在今年十月份,研究人員在該插件中發(fā)現(xiàn)并報(bào)告了一個(gè)嚴(yán)重的SQL注入漏洞,而該漏洞將允許攻擊者接管目標(biāo)WordPress網(wǎng)站。

接下來,我們會(huì)分析代碼中存在的問題,以及SAST工具如何才能檢測(cè)到這個(gè)安全漏洞。

(1) 第一步:識(shí)別上下文環(huán)境

首先,插件要執(zhí)行的所有SQL語句都需要被分析,雖然WordPress數(shù)據(jù)庫驅(qū)動(dòng)跟插件代碼無關(guān),但它所使用的方法(例如get_rwo())是可以被RIPS引擎識(shí)別的(搜索潛在的SQL注入漏洞)。

modules/Emails/DetailView.php

  1. class UFBL_Model { 
  2.  
  3. public static function get_form_detail( $form_id ) { 
  4.  
  5. global $wpdb; 
  6.  
  7. $table = UFBL_FORM_TABLE
  8.  
  9. $form_row = $wpdb->get_row("SELECT * FROM $table WHERE form_id = $form_id"); 
  10.  
  11. return $form_row; 
  12.  
  13.  

在這里,引擎可以分析SQL語句以識(shí)別注入環(huán)境。一般來說,這種地方的安全漏洞是很難被發(fā)現(xiàn)的。如果它讀取的是form_id=’$form_id’而不是form_id=$form_id,那么這條語句就沒有安全問題了,因?yàn)閃ordPress可以對(duì)用戶的輸入進(jìn)行甄別。因此,只有那些上下文環(huán)境敏感的SAST工具才能夠感知到這種隱蔽的安全問題。

(2) 第二步:跟蹤用戶輸入數(shù)據(jù)流

這一步相對(duì)來說比較簡(jiǎn)答,你可以從在下面的代碼中看到,如果工具無法分析到$form_id的潛在隱患,那么受污染的數(shù)據(jù)將有可能擴(kuò)散到其他功能函數(shù)中。

modules/Emails/DetailView.php

  1. class UFBL_Lib { 
  2.  
  3. public static function do_form_process() { 
  4.  
  5. $form_data = array(); 
  6.  
  7. foreach ( $_POST['form_data'] as $val ) { 
  8.  
  9. if ( strpos( $val['name'], '[]' ) !== false ) { 
  10.  
  11. $form_data_name = str_replace( '[]', '', $val['name'] ); 
  12.  
  13. if ( !isset( $form_data[$form_data_name] ) ) { 
  14.  
  15. $form_data[$form_data_name] = array(); 
  16.  
  17.  
  18. $form_data[$form_data_name][] = $val['value']; 
  19.  
  20. } else { 
  21.  
  22. $form_data[$val['name']] = $val['value']; 
  23.  
  24.  
  25.  
  26. $form_id = sanitize_text_field( $form_data['form_id'] ); 
  27.  
  28. $form_row = UFBL_Model::get_form_detail( $form_id ); 
  29.  
  30.  

其中的$_POST[‘form_data’]被分配給了另一個(gè)數(shù)組,并使用了WordPress的內(nèi)部過濾函數(shù)sanitize_text_field()來進(jìn)行數(shù)據(jù)過濾。但是就我們現(xiàn)在所檢測(cè)到的這個(gè)SQL上下文環(huán)境來說,這個(gè)過濾函數(shù)并不能防止SQL注入的發(fā)生。為了檢測(cè)這種漏洞并防止假陽性,SAST工具需要跟蹤復(fù)雜的數(shù)據(jù)流,它們不僅要能夠識(shí)別WordPress的內(nèi)部函數(shù),而且還要能評(píng)估這些函數(shù)在不同環(huán)境下的影響。

3. Zen Mobile App Native 3.0-文件上傳漏洞(2017-02-27)

研究數(shù)據(jù)表明,Zen Mobile App Native插件已經(jīng)成為了近期最容易受到攻擊的插件之一,而且這個(gè)漏洞也是2017年攻擊者最喜歡利用的三大漏洞之一。下面代碼中的漏洞還會(huì)影響很多其他的插件,例如Mobile App Builder 1.05。

/zen-mobile-app-native/server/images.php

  1. if (!$_FILES['file']['error']) { 
  2.  
  3. $name = md5(rand(100, 200)); 
  4.  
  5. $ext = explode('.', $_FILES['file']['name']); 
  6.  
  7. $filename = $name . '.' . $ext1; 
  8.  
  9. $destination = 'images/' . $filename; 
  10.  
  11. $location = $_FILES["file"]["tmp_name"]; 
  12.  
  13. move_uploaded_file($location, $destination); 
  14.  
  15. echo $plugin_url.'/server/images/' . $filename; 
  16.  

受影響的代碼行數(shù)很少,因此SAST工具可以輕松發(fā)現(xiàn)這個(gè)安全問題。代碼會(huì)利用move_uploaded_file()函數(shù)來上傳文件,RIPS對(duì)其中的兩個(gè)用戶輸入?yún)?shù)進(jìn)行了分析。雖然文件名會(huì)使用隨機(jī)哈希代替,但是文件擴(kuò)展名仍然是攻擊者可以控制的。因此,攻擊者就可以通過上傳一個(gè)PHP shell文件(擴(kuò)展名為.php)并在目標(biāo)Web服務(wù)器中實(shí)現(xiàn)任意代碼執(zhí)行。

4. Appointments 2.2.1-PHP對(duì)象注入漏洞(2017-10-02)

最后這個(gè)例子是非常容易發(fā)現(xiàn)的,很多工具可以直接通過簽名來發(fā)現(xiàn)其中的異常。不久之前,研究人員在Appointments插件中發(fā)現(xiàn)了一個(gè)PHP對(duì)象注入漏洞,而且很多其他的插件也存在這種漏洞,例如Flickr Gallery和RegistrationMagic Custom Registration Forms。這里的問題并不復(fù)雜,因?yàn)檫@里只有一行代碼:

/flickr-gallery.php

  1. $pager = unserialize(stripslashes($_POST['pager'])); 

更重要的是,這一行代碼就能給我們的應(yīng)用程序帶來嚴(yán)重的影響。

三、總結(jié)

在這篇文章中,我們給大家簡(jiǎn)單分析了2017年比較嚴(yán)重的四個(gè)WordPress插件漏洞,并且介紹了靜態(tài)代碼檢測(cè)工具如何才能檢測(cè)到這些安全漏洞。由于目前市場(chǎng)上大約有4萬多款WordPress插件,再加上WordPress插件數(shù)量一直在穩(wěn)步增長(zhǎng),因此在2018年我們很可能會(huì)看到更多包含安全漏洞的插件出現(xiàn)。

責(zé)任編輯:趙寧寧 來源: 安全客
相關(guān)推薦

2022-07-19 16:40:56

漏洞網(wǎng)絡(luò)攻擊

2013-10-31 13:19:06

2015-02-26 13:57:55

2014-08-06 10:44:31

WordPress插件

2017-05-08 07:07:50

2015-03-13 19:22:03

2022-09-14 09:20:47

漏洞網(wǎng)絡(luò)攻擊

2017-03-09 20:57:26

2023-04-04 22:20:53

2022-12-29 15:56:58

2018-01-10 08:39:32

2022-02-12 16:30:02

WordPress安全漏洞插件

2015-03-13 09:20:57

2014-03-02 15:06:33

2017-12-15 15:46:33

Java編程語言IT

2017-03-17 11:37:30

互聯(lián)網(wǎng)

2017-07-18 06:55:13

2022-04-14 16:37:50

漏洞網(wǎng)絡(luò)攻擊插件

2023-06-01 15:30:21

2024-11-01 21:56:02

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)