2年前 (2018-03-12) 中國互聯安全響應中心  PHP
文章評分 1 次,平均分 4.0

觸發條件:

php 7.2.x,開啟gd庫。只需要三行代碼即可完成!

我在本地調試php的時候發現某個老代碼能夠直接把php給crash掉,因此成文。

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

php沒有報錯,直接死掉了,應該是內部邏輯有問題。再傳到服務器上試試:

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

啊哈,一樣的結果。觸發這個問題的代碼如下:

$im=imagecreate(100,100);
imageantialias($im,true);
imageline($im,0,0,10,10,0xffffff);

話不多說,上vs調試。先看調用堆棧吧。

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

從這里可以看出是在GD庫的畫像素點的地方出了錯,被調試器斷在了gdImageSetAAPixelColor這個函數里。

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

再看對應代碼,訪問了gdImagePtr結構體中的一個成員,導致訪問違例。我們再從即時窗口檢查一下:

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

沒錯,tpixels是個空指針!

那tpixels是干啥的呢?在gd.h里面有如下說明:

/* Truecolor flag and pixels. New 2.0 fields appear here at the
end to minimize breakage of existing object code. */
int trueColor;
int ** tpixels;

看來是和真彩色相關的東西,我們再沿著調用堆棧往前看。

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

這里是gdImageAALine函數,一個個點地畫線,干的是苦力活。從gdImageLine里調用了它:

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

這里的條件判斷是是否開啟了防鋸齒功能。如果我們調用imageantialias函數打開這個功能,那么就會走這里來。

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

上面圖里就是我們從php調用的imageline函數的實現啦,非常簡單。可以看出圖片是真彩色的時候它會默認開啟防鋸齒功能。

這里問題就在于,我們創建(imagecreate)的圖片不是真彩色的圖,而后我們手動開啟了防鋸齒(imageantialias),調用進去想當然地把它當作一張真彩色圖,從而導致了錯誤。

最后我們來看看兩個函數的不同:

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

跟進去,可以看到imagecreate函數調用的gdImageCreate里直接把真彩色相關的成員設為了null。

與之對比,imagecreatetruecolor函數調用的gdImageCreateTrueColor函數里為每個像素點都分配了對應內存并初始化為0了:

源碼級剖析PHP 7.2.x GD拒絕服務漏洞

總結一下,從上面分析可以看出,觸發這個問題的條件有3個:

1.php版本為7.2.x且開啟了gd庫

2.創建了非真彩色圖且開啟抗鋸齒

3.在創建的圖句柄上進行像素點寫入

導致這個問題的原因還是代碼修改考慮不周全,引入了新的漏洞;沒有對所有可能條件進行測試,所以從php 7.2.0一直到php 7.2.4都還存在問題。

已經向php官方報告,如果正在生產環境使用相關版本請退回舊版本,舊版本里不存在這個問題。


//下面這個css和插件后臺設置的主題有關系,如果需要換樣式,則需要修改以下CSS名稱

  
 

除特別注明外,本站所有文章均為鐵匠運維網原創,轉載請注明出處來自http://www.kzrhud.live/20903.html

中國互聯是江蘇邦寧科技有限公司旗下的著名IT服務供應商品牌之一,是國內IDC行業十大之一、企業互聯網服務首選品牌。江蘇邦寧科技成立于2003年,是國內互聯網名稱與數字地址服務、云數據中心機房服務的引領者,是行業云計算解決方案、網站智能建設、企業智能辦公軟件、移動互聯網開發的創新者。自成立以來,公司秉承“一切為了客戶滿意”的核心理念,堅持“國際化、專業化、高端化”的發展思路,堅持“以客戶需求為導向、以技術創新為基礎、以服務創新為支撐”,先后為國內各級政府、社會服務機構、國內外眾多500強企業及中小企業、個人客戶提供了專業、高質、優越的互聯網應用服務。

發表評論

暫無評論

切換注冊

登錄

忘記密碼 ?

您也可以使用第三方帳號快捷登錄

切換登錄

注冊

掃一掃二維碼分享
青海11选5开奖结果走势图