php中getdistance函数_php代码渗透测试 后门分析篇
很多想做滲透測試的朋友都想了解關于PHP后門漏洞的安全測試重點方法,以及該如何預防被中php后門,本節(jié)由我們的安全高級滲透工程師進行全面的講解,來讓大家更好的理解和了解php代碼的安全檢測,讓網(wǎng)站得到最大化的安全保障,安全保障了,網(wǎng)站才能更長遠的運行下去。
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序列化實現(xiàn)
PHP序列化處理共有三種,分別為php_serialize、php_binary和 WDDX,默認為php_serialize,可通過配置中的 session.serialize_handler 修改。
其中php_serialize的實現(xiàn)在 php-src/ext/standard/var.c 中,主要函數(shù)為 php_var_serialize_intern ,序列化后的格式如下:
- boolean
- b:;
- b:1; // true
- b:0; // false
- integer
- i:;
- double
- d:;
- NULL
- N;
- string
- s::"";
- s:1:"s";
- array
- a::{key, value};
- a:1:{s:4:"key1";s:6:"value1";} // array("key1" => "value1");
- object
- O::":{};
- 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 等函數(shù),可能會造成代碼執(zhí)行等問題。若沒有相關函數(shù),在析構時也會調用相關的析構函數(shù),同樣會造成代碼執(zhí)行。
另外 __toString / __call 兩個函數(shù)也有利用的可能。
其中 __wakeup 在反序列化時被觸發(fā),__destruct 在GC時被觸發(fā), __toString 在echo時被觸發(fā), __call 在一個未被定義的函數(shù)調用時被觸發(fā)。
下面提供一個簡單的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";}"
把序列化的字符串修改一下后,執(zhí)行
unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');
輸出
wake up
Data's value is malicious value.
destruct
這里看到,值被修改了.
上面是一個 unserialize() 的簡單應用,不難看出,如果 __wakeup() 或者 __desturct() 有敏感操作,比如讀寫文件、操作數(shù)據(jù)庫,就可以通過函數(shù)實現(xiàn)文件讀寫或者數(shù)據(jù)讀取的行為。
那么,在 __wakeup() 中加入判斷是否可以阻止這個漏洞呢?在 __wakeup() 中我們加入一行代碼
但其實還是可以繞過的,在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本都存在wakeup的漏洞。當反序列化中object的個數(shù)和之前的個數(shù)不等時,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. 機制實現(xiàn)
PHP中Disable Function的實現(xiàn)是在php-src/Zend/Zend-API.c中。PHP在啟動時,讀取配置文件中禁止的函數(shù),逐一根據(jù)禁止的函數(shù)名調用 zend_disable_function 來實現(xiàn)禁止的效果。
這個函數(shù)根據(jù)函數(shù)名在內置函數(shù)列表中找到對應的位置并修改掉,當前版本的代碼如下:
和函數(shù)的實現(xiàn)方式類似,disable classes也是這樣實現(xiàn)的
因為這個實現(xiàn)機制的原因,在PHP啟動后通過 ini_set 來修改 disable_functions 或 disable_classes 是無效的。
4.1.3.2. Bypass
- LD_PRELOAD繞過
- PHP OPcache
- Mail函數(shù)
- imap_open
4.1.4. Open Basedir
4.1.4.1. 機制實現(xiàn)
PHP中Disable Function的實現(xiàn)是在php-src/main/fopen-wrappers.c中,實現(xiàn)方式是在調用文件等相關操作時調用函數(shù)根據(jù)路徑來檢查是否在basedir內,其中一部分實現(xiàn)代碼如下:
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
總結
以上是生活随笔為你收集整理的php中getdistance函数_php代码渗透测试 后门分析篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总链接
- 下一篇: php七牛分片上传_ThinkPHP实现