1. 程式人生 > >php代碼審計4審計代碼執行漏洞

php代碼審計4審計代碼執行漏洞

來替 開頭 fun 控制 amp google 正則 ble res

代碼執行漏洞
代碼執行漏洞是指應用程序本身過濾不嚴,用戶可以通過請求將代碼註入到應用中執行,當應用在調用一些能將字符串轉化成代碼的函數(如php中的eval)時,沒有考慮到用戶是否能控制這個字符串,造成代碼註入。

挖掘思路:存在可執行代碼的危險函數,用戶能控制函數的輸入。


常見危險函數

eval和assert函數:
eval(),assret()將輸入的字符串參數作為PHP程序代碼來執行
代碼1:
<?php
if(isset($_GET[‘cmd‘])){
$cmd = $_GET[‘cmd‘];
eval("\$cmd = $cmd");/assret()函數也是一樣的,這裏沒對用戶輸入做過濾
echo "ok"
}else{
echo "not";
}
>

回調函數:
mixed call_user_func(callable $callback[,mixed $parameter[,mixed $....]])
$callback是要調用的自定義函數名稱
$parameter是自定義函數的參數
代碼2:
<?php
function callback(){
$x = $_GET[‘cmd‘];
eval($x);//沒做限制
}
call_user_func(function ‘callback‘,$x);//回調了函數
>
常見回調函數:call_user_func() call_user_func_array() array_map()等


動態執行函數
定義一個函數,將函數名(字符串)賦值給一個變量,使用變量名代替函數名動態調用函數。
代碼3:
<?php
$_GET[‘a‘]($_GET[‘b‘]);//接受get請求a的參數作為一個函數,b是作為a函數裏的參數
>


正則表達式(做代碼審計時,會遇到正則表達式,了解正則會更容易)
<?php
//普通字符作為原子
$pattern = ‘/abc/‘;
$str = ‘abcdefghijklmn‘;
preg_match_all($pattern,$str,$res);
var_dump($res);

//特殊符號的字符作為原子
$pattern = ‘/\[php\]/‘;
$str = ‘[php]12345‘;
preg_match_all($pattern,$str,$res);
var_dump($res);

//通用字符作為原子
$pattern1 = ‘/\d/‘; //0-9
$pattern2 = ‘/\D/‘; //a-zA-Z
$str = ‘123132asaaaaa222‘;
$preg_match_all($pattern2,$str,$res);
var_dump($res);

//自定義原子
$pattern1 = ‘/[aj]sp/‘; //匹配[aj]中任意一個字符作為原子的asp jsp
$str = ‘jjjjspspspsp‘;
preg_match_all($pattern1,$str,$res);
var_dump($res);

//限定符
$pattern1 = ‘/go*gle/‘; // *匹配掐面出現原子次數0次 1次或多次
$pattern2 = ‘/go+gle/‘; // +匹配前面出現的原子1次或多次
$pattern3 = ‘/go?gle/‘; // ?匹配前面出現的原子0次或1次
$str = ‘google‘;
preg_match_all($pattern3,$str,$res);
var_dump($res);

//邊界限定
$pattern1 = ‘/^abc/‘; // ^匹配輸入字符開始的位置,必須是abc形式的開頭
$pattern2 = ‘/abc^/‘; // ^匹配輸入字符結尾的位置,必須是abc形式的結尾
$pattern3 = ‘/^abc$/‘; // ^$只匹配某字符
$str = ‘abc2342dfads‘;
preg_match_all($pattern3,$str,$res);
var_dump($res);

//反向引用
$pattern = ‘/\d{4}(-)\d{2}\\1\d{2}/‘; // \\1代表第一個()緩沖區
$str = ‘2019-01-28‘;
preg_match_all($pattern,$str,$res);
var_dump($res);
>


preg_replace函數:
mixed preg_replace(mixde $pattern,mixed $replacement,mixed $subject[,int $limit = -1[,int &$count]])
$pattern 正則匹配的內容 $pattern存在/e模式修正符修飾,允許代碼執行
$replacement 用於替換的字符串或字符串數組
$subject 要進行搜索和替換的字符串或字符串數組


修復方案:
盡量不要執行外部的應用程序或命令
使用自定義函數或函數庫來替代外部應用程序或命令的功能
使用escappeshellarg函數來處理命令的參數
使用sare_mode_exec_dir來指定可執行的文件路徑
將執行的參數做白名單限制,在代碼或配置文件中限制某些參數

php代碼審計4審計代碼執行漏洞