PHP命令執行漏洞初探

PHP命令執行漏洞初探

Mirror王宇陽 byphp

PHP 命令執行

PHP提供以下函數用於執行外部應用程序;例如:system()、shell_exec()、exec()、passthru()linux

system()

<?php
    $host = $argv[1];
	system("ping ".$host);
?>

在服務端運行php.exe index.php 192.168.2.1git

執行php.exe index.php "|net user"(這裏的「|」符號的做用時屏蔽源代碼的ping字符)github

passthru() — 執行外部程序而且顯示原始輸出 proc_open() — 執行一個命令,而且打開用來輸入/輸出的文件指針。 shell_exec() — 經過 shell 環境執行命令,而且將完整的輸出以字符串的方式返回。 popen() — 經過 popen() 的參數傳遞一條命令,並對 popen() 所打開的文件進行執行正則表達式

eval()

PHP中的eval()函數能夠把參數字符串按照PHP代碼來動態執行,輸入的字符串必須是合法的PHP代碼字段並以分號結尾shell

<?php
	eval($_REQUEST['code']);
	// $_REQUEST:支持GET和POST兩種請求的數據
?>

在URL中插入?code=phpinfo();利用GET方法向服務器請求,服務端的index.php處理代碼中的eval()函數會將請求的字符串作爲PHP代碼執行數組

動態調用

<?php
	function T1() {
		echo "<script>alert('Hello,World!');</script>";
		return 0 ;
	}

	function T2() {
		echo "<script>alert('Error');</script>";
		return 0 ;
	}

	$fun = $_REQUEST['fun'];
	echo $fun();
	// 當fun的value爲:phpinfo時,在php的echo中構成 phpinfo()
?>

固然了,並不會僅僅只執行一個phpinfo()、T1()……服務器

<?php
	$fun = $_GET['fun'];
	$par = $_GET['par'];
	$fun($par);
?>

PHP的其它危險函數

array_map()

<?php
	$arr = $_GET['arr'];
	$array = array(1,2,3,4,5);
	$new_array = array_map($arr, $array);
?>

array_map() 返回用戶自定義函數處理後的數組函數

assert()

bool assert(mixed $assertion [,string $description])

檢查一個斷言是否爲False;把字符串$description做爲PHP代碼進行執行spa

preg_replace()

執行一個正則表達式的搜索和替換

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

pattern 要搜索的正則匹配模式

replacement 用於替換的字符串或數組

subject 要進行搜索和替換的字符串或數組

include

include $file

在變量$file可控的狀況下,咱們就能夠包含任意文件,從而達到getshell的目的;

因爲不一樣的配置環境和不一樣的包含文件分爲:遠程文件包含和本地文件包含

文件操做函數

copy:拷貝文件

file_get_contents:將整個文件讀入爲一個字符串

file_put_contents:將一個字符串寫入文件

file:把整個文件讀入一個數組中

fopen:打開文件或者 URL

move_uploaded_file:將上傳的文件移動到新位置

readfile:輸出文件

rename:重命名一個文件或目錄

rmdir:刪除目錄

unlink & delete:刪除文件

特殊函數

phpinfo():這個文件裏面包含了PHP的編譯選項,啓動的擴展、版本、服務器配置信息、環境變量、操做系統信息、path變量等很是重要的敏感配置信息

使用軟鏈接讀取文件內容

symlink():通常是在linux服務器上使用的,爲一個目標創建一個鏈接,在讀取這個連接所鏈接的文件的內容,並返回內容

環境變量

getenv:獲取一個環境變量的值

putenv($a) :添加$a到服務器環境變量,但環境變量僅存活於當前請求期間。 在請求結束時環境會恢復到初始狀態。

推薦文章: PHP代碼審計——常見危險及特殊函數

相關文章
相關標籤/搜索