php 5.3.9 漏洞,PHP-5.3.9遠程執行任意代碼漏洞(CVE-2012-0830) 詳解

這個新的修復方法初衷是好的, 但是卻帶來一個嚴重的問題(5.3.10中已經修復), 這個問題最初是由Stefan Esser發現的. 請看之前(5.3.9)最終的修復方案(php_register_variable_ex):

代碼如下

while (1) {

if (zend_symtable_find(symtable1, escaped_index, index_len + 1, (void **) &gpc_element_p) == FAILURE

|| Z_TYPE_PP(gpc_element_p) != IS_ARRAY) { //(3)

if (zend_hash_num_elements(symtable1) <= PG(max_input_vars)) { // (4)

if (zend_hash_num_elements(symtable1) == PG(max_input_vars)) {

php_error_docref(NULL TSRMLS_CC, E_WARNING, "Input variables exceeded %ld. ...", PG(max_input_vars)); // (1)

}

MAKE_STD_ZVAL(gpc_element);

array_init(gpc_element);

zend_symtable_update(symtable1, escaped_index, index_len + 1, &gpc_element, sizeof(zval *), (void **) &gpc_element_p);

}

//......

}

//.....

symtable1 = Z_ARRVAL_PP(gpc_element_p); // (2)

goto plain;

}< li>

注意到, 如果此時注冊一個數組變量(在GET中類似于: a[]=2), 并且此時這個變量剛好是第max_input_vars個變量的時候, 會觸發一個警告(1), 此時一切正常.

但是, 如果此時還是注冊一個數組變量,但是這個變量已經是第max_input_vars + 1個變量的時候, 那么此時gpc_element_p將成為一個未初始化的指針, 而因為現在邏輯會繼續走, 也就會走到(2)號位置, 導致解引用了一個未初始化的指針. 于是, Boomb~

那么, 到目前位置, 我們就可以使用這樣的特性來對5.3.9做Ddos了. 如果Server開啟了Core Dump的話, 這個效果會非常明顯.

然而, 這個問題還會導致一個更嚴重的問題:

還是上面的代碼, 在最外層有一個循環, 這個循環起作用的時刻在注冊類似于a[b]=2的pair對的時候, 循環將會執行倆次, 第一次插入a[], 第二次往a[]中插入b. 然后再讓我們注意下(3), 如果在目的數組中找不到一個想要的元素, **或者這個元素不為數組**, 則也會直接導致流程留到(2), 于是問題就出現了.

對于這樣的POST串(默認max_input_vars是1000):

1=1&1=2&..........&999=1&x="我是惡意的string"&x[0]=

會發生什么事情呢?

讓我來一步一步描述下:

1. 從1到999沒什么問題, 都被正常插入

2. x是1000個元素, 所以觸發警告, 也沒有問題, x被插入

3. x[0]插入的時候, (3)號語句判斷發現不是Arrary于是進入if體, 但是此時(4)號語句失敗, 于是流程最終流到了(2)

4. 此時, gpc_element_p指向x, 也就是那個我們偽造的字符串….

現在讓我們看看關鍵的數據結構, zval:

代碼如下

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

};< li>

然后看zvalue_value:

代碼如下

typedef union _zvalue_value {

long lval; /* long value */

double dval; /* double value */

struct {

char *val;

int len;

} str;

HashTable *ht; /* hash table value */

zend_object_value obj;

} zvalue_value;< li>

zvalue_value是一個聯合體, 于是我們構造的字符串區域的內存, 就會被當做一個Hashtable結構體:

代碼如下

typedef struct _hashtable {

uint nTableSize;

uint nTableMask;

uint nNumOfElements;

ulong nNextFreeElement;

Bucket *pInternalPointer; /* Used for element traversal */

Bucket *pListHead;

Bucket *pListTail;

Bucket **arBuckets;

dtor_func_t pDestructor; //注意這個

zend_bool persistent;

unsigned char nApplyCount;

zend_bool bApplyProtection;

#if ZEND_DEBUG

int inconsistent;

#endif

} HashTable;< li>

在Hashtable結構體中, 有一個pDestructor, 這個指針指向一個函數, 當這個Hashtable中有元素要被清除的時候, 就會調用它…

也就是說, 你可以隨心所欲的設置一個地址(pDestructor), 然后讓PHP去調用它(誘使一個元素被刪除).

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529370.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中隨機數邊界問題,java 簡單Dice問題(隨機數的運用)

[java]代碼庫/*** Dice Write a program that simulates rolling two dice using the following* steps: 1. Prompt the user for the number of sides for two dice. 2. “Roll” the* dice three times by generating a random number between 1 (inclusive) and the* number…

php 正則替換 ubb,php實現過濾UBB代碼的類

本文實例講述了php實現過濾UBB代碼的類。分享給大家供大家參考。具體如下&#xff1a;PHP代碼如下&#xff1a;class Day{function ubb($Text) { /// UBB代碼轉換//$Texthtmlspecialchars($Text);//$Textereg_replace("\r\n","",$Text);$Textereg_rep…

java單詞測試,java單詞 - 在線打字測試(dazi.kukuw.com)

java單詞貢獻者&#xff1a;15533470608類別&#xff1a;英文 時間&#xff1a;2018-08-04 22:32:16 收藏數&#xff1a;20 評分&#xff1a;0返回上頁舉報此文章請選擇舉報理由&#xff1a;廣告/謠言/欺詐政治敏感色情/違法信息垃圾文章其他收藏到我的文章改錯字public static…

java vector list,Java基礎之:List——ArrayList Vector

Java基礎之&#xff1a;List——ArrayList & VectorArrayList簡單介紹ArrayList實現了List接口&#xff0c;底層是一個數組&#xff0c;并實現了可變的功能。底層屬性(transient Object[] elementData;)在序列化時&#xff0c;忽略該屬性。ArrayList實現了List接口&#xf…

java建立線性表的鏈式結構,數據結構學習----線性表的鏈式表示(Java實現)

線性表接口LList&#xff1a;package com.clarck.datastructure.linked;/*** 線性表接口LList&#xff0c;描述線性表抽象數據類型&#xff0c;泛型參數T表示數據元素的數據類型** author clarck**/public interface LList {/*** 判斷線性表是否空* return*/boolean isEmpty();…

php prepare 批量,PreparedStatement批處理

PreparedStatement批量更新關鍵代碼 無 import java.sql.Connection;import java.sql.PreparedStatement; //...String sql "insert into employee (name, city, phone) values (?, ?, ?)";Connection connection new getConnection();PreparedStatement pPrepa…

釘釘 php 推送,微信模板推送,釘釘信息推送

上午的時候看到有朋友需要微信推送&#xff0c;正好我也需要&#xff0c;之前一直用 Server 醬的&#xff0c;但是最近用不了&#xff0c;想找一個替代品&#xff0c;一開始準備選擇釘釘&#xff0c;除了打卡&#xff0c;我很少使用釘釘&#xff0c;郵件提醒是備用方案&#xf…

java repaint 重畫圖形,學習筆記:WINDOWS的圖形重繪基礎

OnPaint()與OnDraw()的區別&#xff1a;OnPaint是WM_PAINT的消息響應函數&#xff0c;在MFC的基類里OnPaint函數調用了OnDraw()函數。OnPaint函數另外還調用了OnPrepareDC()函數。如果在窗口子類覆蓋了OnPaint函數&#xff0c;當MFC調用我們重寫的OnPaint函數時&#xff0c;就調…

php定義數據表類,phpwind中的數據庫操作類

phpwind中的數據庫操作類2021-01-22 20:12:15141/*來源&#xff1a;phpwind.net*/ClassDB{var$query_num0;functionDB($dbhost,$dbuser,$dbpw,$dbname,$pconnect0){$this->connect($dbhost,$dbuser,$dbpw,$dbname,$pconnect);}functionconnect($dbhost,$dbuser,$dbpw,$dbnam…

渦輪機葉片matlab強度分析論文,一種基于MATLAB及Pro_E的渦輪建模方法

自動化與控制與二一種基于&#xff2d;&#xff21;&#xff34;&#xff2c;&#xff21;&#xff22;及&#xff30;&#xff52;&#xff4f;&#xff0f;&#xff25;的渦輪建模方法王智明(中海油服油田技術事業部北京&#xff11;&#xff10;&#xff11;&#xff11;&am…

基于matlab的傳熱學虛擬實驗開發,基于MATLAB的傳熱學課程虛擬實驗軟件的開發

215教育現代化2018 年 12 月第 49 期 教育信息技術 基于 MATLAB 的傳熱學課程虛擬實驗軟件的開發 周永利&#xff0c;李友榮&#xff0c;石萬元&#xff0c;張力元&#xff0c;楊晨&#xff0c;卞煜&#xff0c;王國強&#xff0c;李俊&#xff0c;包鍵 ( 重慶大學 低品位能源利…

java做 binggo,Linux啟動與停止spring boot工程的腳本示例

在springboot項目啟動有三種方式&#xff1a;1、運行主方法程序2、使用命令mvn spring-boot:run 在命令行運行3、使用 mvn packpage打包位jar文件以后&#xff0c;使用java -jar yourapp.jar命令行運行一般我們在開發的時候經常使用的是前面兩種運行方式&#xff0c;在部署實施…

php計劃任務 框架,計劃任務的使用 ThinkCMF內容管理框架,做最簡約的ThinkPHP開源軟件...

1、先不管是是否是獨立分組&#xff0c;必須在Application\common\項目名下的Conf文件夾內創建2個文件一個是tags.php(項目默認有&#xff0c;直接加入需要執行的代碼即可) 一個是 crons.php。注意這兩個文件名為thinkphp標準文件名&#xff0c;不可以改變tages.php內容是&…

php按文章評論數排序,zblog獲取分類文章排序按指定的時間排序、評論數量排序、瀏覽數量排序...

Zblog PHP在1.8版本的時候想要調用多個分類的文章&#xff0c;并且按照自己的需求去排序是很簡單的事情&#xff0c;很多博友也利用這個方法進行最新文章排行、熱門評論文章排行等等操作&#xff0c;現在隨著ZblogPHP版本的升級&#xff0c;已經封裝了數據庫語句&#xff0c;導…

蟻群算法matlab vrp問題車輛限重,蟻群算法MATLAB解VRP問題

Excel exp12_3_2.xls內容&#xff1a;ANT_VRP函數&#xff1a;function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q)%% R_best 各代最佳路線%% L_best 各代最佳路線的長度%% L_ave 各代平均距離%% Shortest_Rout…

java線程6種狀態轉換,Java線程的生命周期和各種狀態轉換詳解

在Java中&#xff0c;任何對象都有生命周期&#xff0c;線程也不例外&#xff0c;它也有自己的生命周期。當Thread對象創建完成時&#xff0c;線程的生命周期便開始了&#xff0c;當線程任務中代碼正常執行完畢或者線程拋出一個未捕獲的異常(Exception)或者錯誤(Error)時&#…

window10怎么卸載php,window_win10怎么卸載程序?win10卸載程序教程,當win10正式版發布以后,不少 - phpStudy...

win10怎么卸載程序&#xff1f;win10卸載程序教程當win10正式版發布以后&#xff0c;不少用戶將電腦升級為Windows10系統后&#xff0c;不知道該如何卸載程序&#xff0c;本篇將為大家帶來win10卸載程序教程&#xff0c;希望能夠幫助到大家。win10怎么卸載程序方法一&#xff1…

matlab里dcgain,制系統的時域分析

一個動態系統的性能常用典型輸入作用下的響應來描述。響應是指零初始值條件下某種典型的輸入函數作用下對象的響應&#xff0c;控制系統常用的輸入函數為單位階躍函數和脈沖激勵函數(即沖激函數)。在MATLAB的控制系統工具箱中提供了求取這兩種輸入下系統響應的函數。一、時域分…

php 添加音樂,PHP網站插入音樂

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓你找對地方了&#xff0c;我是IT之家大神光卡蔣一欣。我把代碼發給你&#xff0c;直接運行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在oracle數據庫中顯示異常,Oracle數據庫出現ORA-01034錯誤的解決方案

類型&#xff1a;數據庫類大小&#xff1a;42.1M語言&#xff1a;中文 評分&#xff1a;5.0標簽&#xff1a;立即下載使用Oracle數據庫的朋友經常會碰到的錯誤ORA-3113 "end of fileon communication channel" 就是這樣的一個&#xff0c;我們可以簡單的把這個錯誤理…