代碼執行、命令執行漏洞-PHP

2021-03-02 HackeroneForEducation

代碼執行函數

場景:eval()、assert()、preg_replace()、動態函數執行

call_user_func()、call_user_func_array()函數的功能是調用函數,多用在框架裡面動態調用函數

array_map()函數的作用是調用函數並且處第一個參數外其他參數為數組,通常會寫死第一個參數,即調用的函數

命令執行函數

system()、exec()、shell_exec()、passthru()、pcntl_exec、popen()、popen_open()以及反引號(`)


解決方案:

escapeshellcmd()和escapeshellarg()

escapeshellcmd():過濾整條命令      

string escapeshellcmd(string $command) 

參數string為要過濾的命令,返回過濾後的string類型的命令,過濾的字符串

為'&',';','`','|','*','?','~','<','>','^','(',')','[',']','{','}','$','\','\x0A','\xFF','%',' ' ',' " '               

//僅僅在不成對時被轉義                    

  <?php       echo(escapeshellcmd($_GET['cmd']));?>

執行結果:whoami^(

escapeshellarg():保證傳入命令執行函數裡面的參數確實是一字符串參數形式存在,不能被注入

將參數限制在一對雙括號裡,確保參數為一個字符串,會把雙引號替換為空格              

<?php     echo 'ls'.escapeshellarg('a"');?>

執行結果:ls    a

eval()和assert()函數       

<?php     $a = 'aaa';     $b = 'bbb';     eval('$a = $b');     var_dump($a);?>

執行結果:string(3)"bbb"

preg_replace()函數:對字符串進行正則處理

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

搜索$subject中匹配$pattern的部分,以$replacement進行替換,而當$pattern處即第一個參數存在修飾符/e時,$replacement的值會被當成PHP代碼執行      

<?php     preg_replace("/\[(.*)\]/e",'\\1',$_GET['str']);     //從$_GET['str']變量裡搜索括號[]中間的內容作為第一組的結果,preg_replace()函數的第二個參數為'\\1'代表這裡用第一組結果填充,這裡可以直接執行代碼?>

執行結果:PHP Version 5.3.28

call_user_func()函數:調用函數並且第二個參數作為要調用的函數的參數

mixed call_user_func(callable $callback[,mixed $parmeter[,mixed $..]])     

<?php     $b= "phpinfo()";     call_user_func($_GET['a'],$b);?>

執行結果:PHP Version 5.3.28

動態函數執行:PHP特性-PHP的函數可以直接由字符串拼接   

<?php     $_GET['a']($_GET['b']);?>

執行結果:PHP Version 5.3.28

命令執行函數{system()、exec()、shell_exec()、passthru()、pcntl_exec、popen()、popen_open()}以及反引號(`)

system()、exex()、shell_exec()、passthru()以及反引號(`)可以直接傳入命令並且函數會返回執行結果

system():函數會直接回顯結果列印輸出,不需要echo()也可以

               

<?php     system('whoami');?>

執行結果:desktop-htl6dmj\hackerone

pcntl()函數:是PHP的多進程處理擴展

void pcntl_exec(string $path[,array $args[,array $envs]])

$path為可執行程序路徑,如果是Perl或Bash腳本,則需要在文件頭加上#!/ bin/bash來標識可執行程序路徑,$args表示傳遞給$path程序的參數,$envs則是執行這個程序的環境變量

popen()、popen_open()函數:不會直接返回執行結果,而是返回一個文件指針,但命令已經執行

popen()函數需要兩個參數,一個是執行的命令;另一個是指針文件的連接模式,有r、w代表讀和寫            

<?php     popen('whoami >>D:/1.txt','r');?>

執行結果:在D盤根目錄看到1.txt文件,內容為WebServer用戶名

反引號(`)命令執行:實際上反引號(`)執行命令是調用的shell_exec()函數              

執行結果:desktop-htl6dmj\hackerone

在php.ini文件中把PHP安全模式打開,重啟WebServer重新加載PHP配置文件,再執行訪問代碼

執行結果:Warning:shell_exec()[function.shell_exec]:Cannot execute using backquotes in Safe Mode in D:\www\test.php on line 2

這個提示說明反引號(`)執行命令的方式是使用的shell_exec()函數

相關焦點

  • file_put_contents+php-fpm如何命令執行
    本文學習file_put_contents + FTP + php-fpm的命令執行。原理參考[2],我們可以得知,PHP-FPM未授權訪問時,可以通過修改變量auto_prepend_file或auto_append_file來執行文件。根據[1]中描述,我們需要讓file_put_contents時,將結果寫到php-fpm,這樣造成命令執行。
  • 從一道CTF題目談PHP中的命令執行
    快睡的時候,打開B站發現有位用戶留言,大意就是讓我幫忙看一道題,正好當時有空,於是就打開了他發的連結,代碼如下很明顯是一道PHP代碼審計的題目,而且只需要繞過第三行的if即可進行任意命令執行。深入分析題目到這裡就結束了,其實並沒有多難,首先是通過特性去構造動態函數,然後發現了命令執行被禁用之後,能夠知道使用其他函數去進行獲取信息就行了。但是做完這道題後,不僅引發了我的思考,PHP中的命令執行就只有這些方式了嗎,肯定不是。於是,我總結了幾種新的命令執行技巧供大家參考。
  • PHP一些常見的漏洞梳理
    為了使代碼更靈活,將被包含的文件設置為變量用來進行動態調用。這就導致客戶端可以調用一個惡意文件,造成文件包含漏洞。文件包含漏洞在php中居多。具體代碼如下,此時該代碼存在文件包含漏洞,由於在漏洞利用被包含的文件會被添加上.php後綴,無法直接利用。<?php$test=$_GET['id']; include($test).'.php';?
  • 如何讓PHP通過ROOT權限來執行LINUX命令
    一般 PHP 在 LINUX 伺服器上執行 shell 命令時,只能擁有 www:www 帳戶權限,想執行一些系統命令是沒有權限的,如重啟 apache,因為控制 apache 需要 root 權限,因此下面的辦法可以讓 PHP 執行 ROOT 權限的命令。
  • 在PHP中執行系統外部命令
    首頁 > 語言 > 關鍵詞 > php最新資訊 > 正文 在PHP中執行系統外部命令
  • 深入解讀:Windows HTTP.sys遠程代碼執行漏洞跟蹤進展
    4、代碼執行從上述分析可以看出,觸發此漏洞可越界寫數據而造成內存破壞,理論上存在遠程執行代碼的可能性。但是越界所寫數據的長度下限由ContentLength決定,通常會是一個較大的值而立即使系統崩潰。即使目標伺服器上存在一些大的文件,可以用來越界寫少量數據,所寫數據內容與被覆蓋目標也很難控制。因此,在實際環境中想要穩定的利用此漏洞來執行代碼是非常困難的。
  • PHP網站常見安全漏洞及防禦方法
    腳本執行漏洞腳本執行漏洞常見的原因是由於程式設計師在開發網站時對用戶提交的URL參數過濾較少引起的,用戶提交的URL可能包含惡意代碼導致跨站腳本攻擊。文件漏洞文件漏洞通常是由於網站開發者在進行網站設計時對外部提供的數據缺乏充分的過濾導致黑客利用其中的漏洞在Web進程上執行相應的命令。假如在lsm.php中包含這樣一段代碼:include($b.」/aaa.php」.)
  • Fastjson 1.2.47 遠程命令執行漏洞
    話不多說,今天帶大家復現一下Fastjson1.2.47遠程命令執行漏洞。漏洞實現流程準備環境本次漏洞復現需要有三臺設備(兩臺也可以)主機A:模擬Fastjson漏洞環境(centos7)TouchFile.java (紅色處為遠程命令執行的代碼)import java.lang.Runtime;import java.lang.Process;public class TouchFile {static {
  • PHP代碼安全
    SQL 注入攻擊者通過構造惡意SQL命令發送到資料庫,如果程序未對用戶輸入的 SQL命令執行判斷過濾,那麼生成的SQL語句可能會繞過安全性檢查,
  • 全網最詳細的常見PHP漏洞全方面解析
    magic quotes 為 On,它會影響 HTTP 請求的數據(GET、POST、Cookies)程式設計師也可以使用 addslashes 來轉義提交的 HTTP 請求數據,或者用 stripslashes 來刪除轉義PHP 漏洞全解(二)-命令注入攻擊命令注入攻擊PHP 中可以使用下列 5 個函數來執行外部的應用程式或函數
  • fastjson 被曝存在遠程代碼執行漏洞,等級「高危」
    fastjson 當前版本為 1.2.68 發布於 3 月底,日前某安全運營中心監測到,fastjson <= 1.2.68 版本存在遠程代碼執行漏洞,漏洞被利用可直接獲取伺服器權限。360CERT 將漏洞等級定為「高危」。
  • 命令執行繞過總結
    Linux篇命令拼接a=whob=ami$a$b //輸出whoami常用字符使用& 表示將任務置於後臺執行; 多行語句用換行區分代碼快,單行語句一般要用到分號來區分代碼塊&& 只有在
  • 攻擊者利用Sophos防火牆中的0-day代碼執行漏洞
    經過充分研究和開發的攻擊利用了Sophos XG Firewall的完全修補版本中的SQL注入漏洞。有了這個系統,它下載並安裝了一系列腳本,這些腳本最終執行了旨在與用戶名,用戶名,密碼的加密哈希形式以及管理員帳戶密碼的SHA256哈希哈希化的代碼。Sophos已發布了一個緩解漏洞的修補程序。
  • 搜索 PHP代碼審計之旅
    本文轉自先知社區:https://xz.aliyun.com/t/7992前言:之前做了很多web題都遇到過審計代碼的題目,命令執行、變量覆蓋等
  • 看代碼學安全(8 )preg_replace函數之命令執行
    這道題目考察的是 preg_replace 函數使用 /e 模式,導致代碼執行的問題。所以,我們可以通過控制 preg_replace 函數第1個、第3個參數,來執行代碼。但是可被當做代碼執行的第2個參數,卻固定為 'strtolower("\\1")' 。
  • CTF中常見的PHP漏洞小結
    在做ctf題的時候經常會遇到一些PHP代碼審計的題目,這裡將我遇到過的常見漏洞做一個小結。md5()漏洞  PHP在處理哈希字符串時,會利用」!=」或」==」來對哈希值進行比較,它把每一個以」0E」開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以」0E」開頭的,那麼PHP將會認為他們相同,都是0。
  • web安全篇(一):PHP文件包含漏洞姿勢總結
    A:簡單一句話,為了更好地使用代碼的重用性,引入了文件包含函數,可以通過文件包含函數將文件包含進來,直接使用包含文件的代碼。Q:文件包含漏洞的成因是什麼?是指能夠包含遠程伺服器上的文件並執行。由於遠程伺服器的文件是我們可控的,因此漏洞一旦存在危害性會很大。
  • PHP 文件包含漏洞姿勢總結
    php 中引發文件包含漏洞的通常是以下四個函數:1、include() 當使用該函數包含文件時,只有代碼執行到 include() 函數時才將文件包含進來,發生錯誤時只給出一個警告,繼續向下執行。2、include_once() 功能和 include() 相同,區別在於當重複調用同一文件時,程序只調用一次。
  • PHP代碼安全有必要了解下
    SQL 注入攻擊者通過構造惡意SQL命令發送到資料庫,如果程序未對用戶輸入的 SQL命令執行判斷過濾,那麼生成的SQL語句可能會繞過安全性檢查
  • PHP在Linux下執行定時任務的實現思路詳解
    二、Windows伺服器上使用bat定時執行phpwindows上和linux上有一個類似的cmd和bat文件,bat文件類似於shell文件,執行這個bat文件,就相當於依次執行裡面的命令(當然,還可以通過邏輯來實現編程