PHP Webshell下繞過disable

零基礎黑客教程,黑客圈新聞,安全面試經驗

一、系統組件繞過

window com組件(php 5.4)(高版本擴展要自己添加)
條件:要在php.ini中開啟(如圖)

PHP Webshell下繞過disable_function的方法

利用代碼,利用shell上傳如下代碼到目標服務器上

利用成功後的結果

PHP Webshell下繞過disable_function的方法




二、利用ImageMagick漏洞繞過disable_function

ImageMagick是一套功能強大、穩定而且開源的工具集和開發包,可以用來讀、寫和處理超過89種基本格式的圖片文件,如果phpinfo中看到有這個,可以嘗試如下利用

PHP Webshell下繞過disable_function的方法

利用代碼如下


三.利用環境變量LD_PRELOAD來繞過php disable_function執行系統命令

php的mail函數在執行過程中會默認調用系統程序/usr/sbin/sendmail,如果我們能劫持sendmail程序,再用mail函數來觸發就能實現我們的目的

利用原理

LD_PRELOAD是Linux系統的下一個有趣的環境變量:“它允許你定義在程序運行前優先加載的動態鏈接庫。這個功能主要就是用來有選擇性的載入不同動態鏈接庫中的相同函數。通過這個環境變量,我們可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。一方面,我們可以以此功能來使用自己的或是更好的函數(無需別人的源碼),而另一方面,我們也可以以向別人的程序注入程序,從而達到特定的目的。

可能這個不好理解,我們做一個簡單的測試代碼

保存如上代碼為a.c,並編譯為a,編譯命令如下 


gcc a.c -o a

運行a結果如下

PHP Webshell下繞過disable_function的方法

以上程序很簡單,根據判斷傳入的字符串是否等於”password”,得出兩種不同結果。 其中用到了標準C函數strcmp函數來做比較,這是一個外部調用函數,我們來重新編寫一個同名函數,代碼如下(保存如下代碼為b.c)

我們編譯以上代碼為一個動態共享庫,編譯命令如下

gcc -fPIC -shared b.c -o b.so

通過LD_PRELOAD來設置它能被其他調用它的程序優先加載

export LD_PRELOAD="./b.so"

我們再次運行a
./a bbb
Correct Password!

我們看到隨意輸入字符串都會顯示密碼正確,這說明程序在運行時優先加載了我們自己編寫的程序。這也就是說如果程序在運行過程中調用了某個標準的動態鏈接庫的函數,那麼我們就有機會通過LD_PRELOAD來設置它優先加載我們自己編寫的程序,實現劫持。


結合mail 函數進行實戰測試

那麼我們來看一下sendmail函數都調用了哪些庫函數,使用readelf -Ws /usr/sbin/sendmail命令來查看,我們發現sendmail函數在運行過程動態調用了很多標準庫函數:

PHP Webshell下繞過disable_function的方法


構造poc思路

編制我們自己的動態鏈接程序。 通過php的putenv來設置LD_PRELOAD,讓我們的程序優先被調用。 在webshell上用mail函數發送一封郵件來觸發。具體實現如下

1.編制我們自己的動態鏈接程序,代碼如下(功能是執行mkdir test)
執行編譯為一個動態共享庫的命令如下

gcc -c -fPIC a.c -o a
gcc -shared a -o a.so

代碼

2.利用webshell,上傳編譯後的a.so到目標服務器
3.通過putenv來設置LD_PRELOAD,讓我們的程序優先被調用。在webshell上用mail函數發送一封郵件來觸發。利用代碼如下

結果如下,成功執行命令,創建文件test

PHP Webshell下繞過disable_function的方法


四.利用pcntl_exec突破disable_functions

pcntl是linux下的一個擴展,可以支持php的多線程操作。(與python結合反彈shell) pcntl_exec函數的作用是在當前進程空間執行指定程序,版本要求:PHP 4 >= 4.2.0, PHP 5

利用代碼如下

PHP Webshell下繞過disable_function的方法


曾經就有一個網站是如此拿下的

PHP Webshell下繞過disable_function的方法

PHP Webshell下繞過disable_function的方法


分享到:


相關文章: